oh-my-opencode 4.17.0 → 4.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/command/publish.md +31 -58
- package/.agents/skills/codex-qa/SKILL.md +2 -0
- package/.agents/skills/pre-publish-review/SKILL.md +1 -1
- package/.agents/skills/publish/SKILL.md +32 -59
- package/.opencode/command/publish.md +31 -58
- package/.opencode/skills/pre-publish-review/SKILL.md +1 -1
- package/dist/cli/get-local-version/types.d.ts +1 -1
- package/dist/cli/index.js +71 -38
- package/dist/cli-node/index.js +71 -38
- package/dist/index.js +212 -258
- package/dist/skills/frontend/SKILL.md +1 -1
- package/dist/skills/frontend/references/design/README.md +9 -0
- package/dist/skills/frontend/references/design/design-system-architecture.md +4 -2
- package/dist/skills/frontend/references/design/layout-skill.md +107 -0
- package/dist/skills/programming/SKILL.md +12 -2
- package/dist/skills/review-work/SKILL.md +10 -2
- package/dist/skills/start-work/SKILL.md +1 -1
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
- package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/dist/skills/ulw-plan/SKILL.md +2 -1
- package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
- package/dist/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/dist/skills/visual-qa/SKILL.md +9 -5
- package/dist/tui.js +8 -3
- package/package.json +14 -13
- package/packages/lsp-daemon/dist/cli.js +7 -13
- package/packages/lsp-daemon/dist/daemon-client.js +3 -5
- package/packages/lsp-daemon/dist/index.js +12 -18
- package/packages/lsp-daemon/dist/request-routing.js +6 -8
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +398 -400
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +14 -14
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +2 -2
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +9 -7
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +33 -16
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +2 -1
- package/packages/omo-codex/plugin/components/teammode/test/v2-spawn-schema.test.ts +69 -0
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +66 -27
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +66 -27
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +9 -6
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +66 -27
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +6 -6
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +9 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +4 -2
- package/packages/omo-codex/plugin/skills/frontend/references/design/layout-skill.md +107 -0
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -2
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +10 -2
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/teammode/SKILL.md +33 -16
- package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +2 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +66 -27
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +6 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +9 -5
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +25 -0
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +24 -0
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +32 -22
- package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/README.md +9 -0
- package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +4 -2
- package/packages/shared-skills/skills/frontend/references/design/layout-skill.md +107 -0
- package/packages/shared-skills/skills/programming/SKILL.md +12 -2
- package/packages/shared-skills/skills/review-work/SKILL.md +10 -2
- package/packages/shared-skills/skills/start-work/SKILL.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/shared-skills/skills/visual-qa/SKILL.md +9 -5
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: layout-skill
|
|
3
|
+
description: "Layer A layout-mechanics reference. Stacks on any style skill when the screen is an app shell, dashboard, settings, list-detail, mail/inbox, or any layout with fixed regions plus a scrolling body — or when a layout breaks under long, empty, or unbroken content. Owns spatial structure and scroll ownership; owns zero visual taste. Load it alongside a style skill; it does not replace one."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Layout Mechanics
|
|
7
|
+
|
|
8
|
+
Style skills decide how a surface looks. This file decides how it is *built to hold content* — what scrolls, what stays fixed, how regions shrink, and which layouts survive real data. It stacks on top of any Layer A style skill (`taste-skill`, `minimalist-skill`, `soft-skill`, `brutalist-skill`, `gpt-tasteskill`) and any Layer B brand. It adds ZERO visual direction — color, type, shadow, radius, and motion still come from the style skill and `DESIGN.md`.
|
|
9
|
+
|
|
10
|
+
Load this when the screen is an **application shell**, not a scroll-the-whole-document marketing page: dashboards, settings, list-detail, mail/inbox, command surfaces, split panes, sidebars — or when a page that looked fine breaks the moment content gets long, empty, or unbroken.
|
|
11
|
+
|
|
12
|
+
## 1. Scroll ownership — decide this BEFORE writing layout CSS
|
|
13
|
+
|
|
14
|
+
The single most common agent-built layout bug is an app shell where the wrong thing scrolls: the whole page scrolls when only a panel should, two panels fight over the scrollbar, or a "fixed" header scrolls away. Prevent it by naming ownership up front, in `DESIGN.md` and in the component:
|
|
15
|
+
|
|
16
|
+
- **What scrolls?** Name the ONE element that owns vertical scroll for this region.
|
|
17
|
+
- **What stays fixed?** Header, sidebar, footer, toolbar — list them.
|
|
18
|
+
- **Where is height determined?** The scroll container needs a bounded height ancestor, or it will grow instead of scroll.
|
|
19
|
+
|
|
20
|
+
Rules:
|
|
21
|
+
|
|
22
|
+
- **One scroll container per region unless each extra one has a named job.** Nested scrollbars with no declared responsibility are a defect — the user loses track of what a wheel/trackpad gesture will move.
|
|
23
|
+
- Full-height shells are bounded by `100dvh`/`100dvb` (dynamic viewport units), never `100vh` — `vh` causes the iOS Safari address-bar jump.
|
|
24
|
+
- A sticky element (`position: sticky`) follows document scroll; a fixed shell region (grid row/column with `overflow: auto` body) owns its own scroll. Do not mix the two models in one region without reason.
|
|
25
|
+
|
|
26
|
+
## 2. The two CSS contracts agents get wrong
|
|
27
|
+
|
|
28
|
+
These two are worth memorizing verbatim. They fail *silently* — the layout looks right until content arrives.
|
|
29
|
+
|
|
30
|
+
**Bounded scroll shell** (fixed header/footer, scrolling body):
|
|
31
|
+
|
|
32
|
+
```css
|
|
33
|
+
.shell {
|
|
34
|
+
display: grid;
|
|
35
|
+
grid-template-rows: auto minmax(0, 1fr) auto; /* header / body / footer */
|
|
36
|
+
max-block-size: 100dvb;
|
|
37
|
+
}
|
|
38
|
+
.shell__body {
|
|
39
|
+
min-block-size: 0; /* WITHOUT THIS the grid child refuses to shrink and overflow never fires */
|
|
40
|
+
overflow: auto;
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The `min-block-size: 0` (or `min-height: 0`) on the scroll child is the fix for "why won't my panel scroll — it just pushes the footer off-screen." A grid/flex child's default `min-*-size: auto` refuses to shrink below its content. The same applies to a flex column: the scrollable child needs `min-height: 0`.
|
|
45
|
+
|
|
46
|
+
**Overflow-safe intrinsic grid** (repeat as many columns as fit, no media queries):
|
|
47
|
+
|
|
48
|
+
```css
|
|
49
|
+
.grid {
|
|
50
|
+
display: grid;
|
|
51
|
+
gap: var(--gap);
|
|
52
|
+
grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The inner `min(16rem, 100%)` is load-bearing: plain `minmax(16rem, 1fr)` forces a 16rem track even when the container is 12rem wide, causing horizontal overflow on narrow screens. `min(…, 100%)` lets the track collapse below its floor when space is genuinely tight. Use `auto-fit` to stretch the last row, `auto-fill` to keep empty tracks.
|
|
57
|
+
|
|
58
|
+
## 3. Named layout primitives (shared vocabulary)
|
|
59
|
+
|
|
60
|
+
Build shells from these named primitives instead of ad-hoc fl/grid. Naming them makes `DESIGN.md` Section 5 and subagent handoffs precise ("wrap it in a `sidebar` with a 20rem aside" beats "put it on the left, roughly"). Lineage: Every Layout + web.dev one-line layouts.
|
|
61
|
+
|
|
62
|
+
| Primitive | Spatial job | Core mechanic |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| **stack** | Vertical rhythm between siblings | flex column + `gap`, or `> * + *` margin |
|
|
65
|
+
| **cluster** | Wrapping row of items (tags, actions) | `flex-wrap: wrap` + `gap`; wraps before overflow |
|
|
66
|
+
| **content-limiter** | Readable prose measure inside a fluid parent | `max-inline-size: ~65ch; margin-inline: auto` |
|
|
67
|
+
| **sidebar** | Narrow aside + fluid main, wraps when tight | flex; aside fixed basis, main `min-inline-size` floor, both `flex-wrap` |
|
|
68
|
+
| **switcher** | N equal regions: row when roomy, stack when tight, NO breakpoint | flex + `min()` basis so it flips at a content threshold |
|
|
69
|
+
| **cover** | Centered region between optional header/footer, min viewport tall | grid rows `auto 1fr auto`, `min-block-size: 100dvb` |
|
|
70
|
+
| **frame** | Media held to an aspect ratio | `aspect-ratio` + `object-fit: cover` |
|
|
71
|
+
| **reel** | Row that scrolls horizontally instead of wrapping | `overflow-inline: auto` + `scroll-snap`; declare keyboard access |
|
|
72
|
+
| **imposter** | Overlay centered over a parent without changing document order | `position: absolute` + translate; do not use to reorder focus |
|
|
73
|
+
| **overlay-stack** | Several layers intentionally in one cell | single grid cell, all children `grid-area: 1/1` |
|
|
74
|
+
| **scroll-body-shell** | Fixed shell regions, only the body scrolls | §2 bounded scroll shell |
|
|
75
|
+
| **fixed-sidenav-shell** | Side nav stays put, main scrolls | grid columns `auto 1fr`, main is the scroll owner |
|
|
76
|
+
| **list-detail** | Explorable list beside its detail region | two-column grid, each pane's scroll ownership named |
|
|
77
|
+
| **sticky-aside** | Support content stays visible during a long read | `position: sticky; top:` on the aside, document scroll |
|
|
78
|
+
|
|
79
|
+
## 4. Container-local vs viewport-level responsiveness
|
|
80
|
+
|
|
81
|
+
Ask **what the layout is responding to** before reaching for a breakpoint:
|
|
82
|
+
|
|
83
|
+
- The component should adapt to *its own available width* (a card that's wide in main but narrow in a rail) → wrap it in `container-type: inline-size` and use `@container`. This is correct far more often than agents assume, because a component rarely knows the viewport it lands in.
|
|
84
|
+
- The *page frame itself* changes (sidebar collapses, columns drop) → `@media`.
|
|
85
|
+
|
|
86
|
+
Prefer intrinsic adaptation (`switcher`, `sidebar`, intrinsic grid, `clamp()`) over any query — the best breakpoint is often none. Use breakpoint *names* for layout states, never device names (`--bp-wide`, not `--bp-ipad`).
|
|
87
|
+
|
|
88
|
+
## 5. Recipes are spatial models, not product categories
|
|
89
|
+
|
|
90
|
+
Choose a layout by the screen's spatial shape, not its product label. A settings page and a docs app both want `fixed-sidenav-shell`; a support inbox and a file browser both want `list-detail`; a metrics view and a photo gallery both want an intrinsic grid. Do not invent a bespoke "dashboard layout" when `page-grid + intrinsic grid + cluster` already covers it — and do not force marketing-page structure (hero, zigzag, bento) onto a task app.
|
|
91
|
+
|
|
92
|
+
## 6. Content stress — the layout is not done until it survives this
|
|
93
|
+
|
|
94
|
+
Landing pages fail on taste; app shells fail on *content*. Before declaring any layout done, stress every region against:
|
|
95
|
+
|
|
96
|
+
- **Empty** — no rows, no avatar, no value. Does the region collapse gracefully or leave a broken frame?
|
|
97
|
+
- **Long label** — a 40-char name in a 12-char slot. Truncate (`text-overflow: ellipsis`) or wrap by design, never by accident.
|
|
98
|
+
- **Long paragraph** — does the measure stay readable, or does text run 200 chars wide?
|
|
99
|
+
- **Unbroken string** — a URL or token with no spaces. Needs `overflow-wrap: anywhere` / `min-inline-size: 0`, or it forces horizontal scroll.
|
|
100
|
+
- **Reflow** — at 375px width the layout reflows to a single readable column with NO horizontal scrollbar. Two-dimensional scrolling of primary content is a fail.
|
|
101
|
+
- **Direction** — if the app supports RTL, the layout uses logical properties (`margin-inline`, `inset-inline-start`) so it mirrors correctly.
|
|
102
|
+
|
|
103
|
+
A layout that only holds the happy-path mock is not finished. Drive these states in `/visual-qa` alongside the interaction states the style skill requires.
|
|
104
|
+
|
|
105
|
+
## Boundary
|
|
106
|
+
|
|
107
|
+
This file owns spatial structure only. It never sets color, typography, shadow, radius, or motion values — those trace to `DESIGN.md` and the loaded style skill. If you find yourself adding a brand color to a layout primitive, stop: the primitive stays layout-only and the styling wraps or composes around it.
|
|
@@ -104,9 +104,17 @@ Mocks are a last resort, not a default. The priority order:
|
|
|
104
104
|
- **Deterministic**: no `sleep`, no wall-clock dependence, no order dependence (`-shuffle=on`, pytest-randomly, vitest random seed). Inject a `Clock`. Subscribe to the event, do not poll for it. Time-based flake is a bug, not a test issue.
|
|
105
105
|
- **Isolated**: every test starts from a known fixture and tears down. `t.TempDir()`, `t.Setenv()`, transactional rollback for DB tests. Two tests passing individually but failing together is a fixture leak — fix it immediately.
|
|
106
106
|
|
|
107
|
-
### Prompt tests
|
|
107
|
+
### Prompt tests: NEVER assert prose
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
**FORBIDDEN — NO EXCEPTIONS: a test MUST NOT assert natural-language prompt text.** `expect(prompt).toContain("based on GPT-5.6")`, `not.toContain("old wording")`, `toMatchSnapshot()` on prose, grepping a sentence fragment — every one of these is pretend-coverage. It stays green while the behavior it claims to guard breaks, then blocks every legitimate rewording until someone bumps the pinned string. A reviewer MUST block it as HIGH; deleting such a test is a fix, not a coverage loss. "A nearby test already does it" is not a defense — that test is the disease, not the convention.
|
|
110
|
+
|
|
111
|
+
Assert ONLY what a machine consumes:
|
|
112
|
+
|
|
113
|
+
- the builder's routing decision — `expect(getPromptSource(model)).toBe("gpt-5-6")`, never the sentence that routing produces
|
|
114
|
+
- a structural token the runtime dispatches on — a tool name, a tag like `<agent-identity>`, a parsed frontmatter field
|
|
115
|
+
- the conditional the code enforces — skill loaded → tool present; `verbose=false` → directive absent
|
|
116
|
+
|
|
117
|
+
If no machine consumes the text, there is no seam: write NO test and say so in the PR; review guards prose. When you DELEGATE test-writing, hand the child the behavior the test must distinguish ("fails if override precedence breaks"), never a ready-made assertion string, prompt fragment, or marker to copy — a prescribed mechanism that is wrong gets implemented faithfully, and the error ships with a green suite.
|
|
110
118
|
|
|
111
119
|
### Anti-patterns the skill rejects
|
|
112
120
|
|
|
@@ -119,6 +127,8 @@ When tests cover LLM prompts or agent outputs, assert on **parsed structure, dec
|
|
|
119
127
|
| Snapshot tests for everything | Locks formatting, not behavior. | Snapshots for *structure* (CLI help, JSON shape). Assertions for *behavior*. |
|
|
120
128
|
| Removing a failing test to "unblock CI" | You just deleted a bug report. | Fix the code or fix the test — never delete to silence. |
|
|
121
129
|
| `assert result is not None` and stopping there | Passes when result is garbage. | Assert the *value*, not its existence. |
|
|
130
|
+
| Expected value derived from the output under test (`expect(config.prompt).toBe(getPrompt(config.model))` when the criterion is about `config.prompt`) | Recomputes a projection of the output and compares it to itself — passes even when the artifact is built from the wrong input. | Derive the expected value from the test's *input*: `expect(config.prompt).toBe(getPrompt(inputModel))` (independent known-good builder fed the fixture's input), or a stable builder routing decision. |
|
|
131
|
+
| Override/precedence fixture equal to its fallback (override == system default) | The assertion passes whether or not the code honored the override — precedence is never exercised. | Make every value the code must select, preserve, or override differ from its fallback. Prove it: temporarily force the regression the test names, watch it fail, revert. |
|
|
122
132
|
| Single happy-path E2E, no edges | Most bugs live on edges. | Edges are unit-test territory — but include at least one E2E that exercises an error path. |
|
|
123
133
|
|
|
124
134
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: review-work
|
|
3
|
-
description: "Post-implementation review orchestrator. Launches 5 parallel background sub-agents: Oracle (goal/constraint verification), Oracle (code quality), Oracle (security), unspecified-high (hands-on QA execution), unspecified-high (context mining from GitHub/git/Slack/Notion). All must pass for review to pass. MUST USE
|
|
3
|
+
description: "Post-implementation review orchestrator. Launches 5 parallel background sub-agents: Oracle (goal/constraint verification), Oracle (code quality), Oracle (security), unspecified-high (hands-on QA execution), unspecified-high (context mining from GitHub/git/Slack/Notion). All must pass for review to pass. MUST USE before a PR handoff or when the user explicitly asks to review completed work. Triggers: 'review work', 'review my work', 'review changes', 'QA my work', 'verify implementation', 'check my work', 'validate changes', 'post-implementation review'."
|
|
4
4
|
---
|
|
5
5
|
## Codex Harness Tool Compatibility
|
|
6
6
|
|
|
@@ -33,7 +33,13 @@ handoff. Role or specialty instructions belong inside `message`.
|
|
|
33
33
|
Use `fork_context: false` unless full history is truly
|
|
34
34
|
required; paste only the review context that worker needs.
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
Review lanes are leaf agents: a lane does its own reading, running, and
|
|
37
|
+
judging inline and never spawns sub-reviewers of its own. Reviewers are
|
|
38
|
+
one-shot: a lane ends at its verdict; a re-review after fixes is a fresh
|
|
39
|
+
spawn scoped to the delta plus current evidence, never a `followup_task`
|
|
40
|
+
to a long-lived reviewer carrying stale context.
|
|
41
|
+
|
|
42
|
+
Plan and reviewer agents may run for a long time; spawn them in the background and keep doing independent root work. Between `multi_agent_v1.wait_agent` calls, back off — double the timeout up to ~5 minutes — instead of spinning short cycles.
|
|
37
43
|
|
|
38
44
|
Treat child status as a progress signal, not a timeout counter. For
|
|
39
45
|
work likely to exceed one wait cycle, require the child to send
|
|
@@ -250,6 +256,8 @@ task(
|
|
|
250
256
|
|
|
251
257
|
You are a QA engineer. Your job is to RUN the application and verify it works through hands-on testing. You do not review code - you test behavior.
|
|
252
258
|
|
|
259
|
+
If the orchestrator already ran the `visual-qa` dual-oracle gate on this same build, consume that verdict instead of re-running it - your lane covers hands-on behavior the visual gate does not.
|
|
260
|
+
|
|
253
261
|
MANDATORY PROCESS (follow in order):
|
|
254
262
|
|
|
255
263
|
### Step 1: Scenario Brainstorm
|
|
@@ -36,7 +36,7 @@ When tier worker agents are installed (Codex), size each implementation lane by
|
|
|
36
36
|
|
|
37
37
|
Every `multi_agent_v1.spawn_agent` message is a self-contained executable assignment: `TASK: <imperative assignment>`, then `DELIVERABLE`, `SCOPE`, and `VERIFY`, with role instructions inside `message`. Use `fork_context: false` unless full history is truly required; paste only the context the child needs.
|
|
38
38
|
|
|
39
|
-
Plan and reviewer agents may run for a long time: spawn them in the background
|
|
39
|
+
Plan and reviewer agents may run for a long time: spawn them in the background and keep doing independent root work. Between `multi_agent_v1.wait_agent` calls, back off — double the timeout up to ~5 minutes — instead of spinning short cycles. A timeout only means no new mailbox update arrived; treat a running child as alive. Require `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. Keep the parent visibly alive with active subagent count, names, and latest `WORKING:` phase. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running — then record inconclusive (never a pass), close if safe, and respawn a smaller `fork_context: false` task with the missing deliverable.
|
|
40
40
|
|
|
41
41
|
# start-work
|
|
42
42
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: teammode
|
|
3
|
-
description: "Codex-only team orchestration: run a named team of cooperating Codex workers with durable, script-managed state. MUST USE when the user asks Codex to create, run, coordinate, inspect, archive, or delete a team of agents/threads/sessions, or to work on something as a team in parallel. FIRST inspects the active tool surface and tells the user
|
|
3
|
+
description: "Codex-only team orchestration: run a named team of cooperating Codex workers with durable, script-managed state. MUST USE when the user asks Codex to create, run, coordinate, inspect, archive, or delete a team of agents/threads/sessions, or to work on something as a team in parallel. FIRST inspects the active tool surface (checking tool_search for deferred tools) and tells the user the route: native MultiAgentV2 agents (flat spawn_agent with task_name) when available, Codex App threads as the fallback, or a plain-subagent split when neither set exists. The main session is always the leader; members are defined by a concrete part, ownership area, or perspective - never a vague job role; a bundled cross-platform script writes the .omo/teams state plus an auto-generated member field manual. Use a team when the work is not perfectly isolated but parallelizing helps; use plain subagents when scope is perfectly isolated or the goal is ambiguous. Triggers: team mode, teammode, make a team, run as a team, team of agents, coordinate threads, parallel Codex threads, archive the team."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Teammode
|
|
@@ -40,17 +40,31 @@ Inspect your active tool list and select:
|
|
|
40
40
|
2. **Codex App threads (fallback)** - select when flat V2 is not available but the
|
|
41
41
|
`codex_app.*` thread tools are (`create_thread`, `read_thread`, `send_message_to_thread`,
|
|
42
42
|
`set_thread_title`, `set_thread_archived`).
|
|
43
|
-
3. **Neither
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
3. **Neither set visible** - if a `tool_search` tool is active, search for the missing sets
|
|
44
|
+
(e.g. `spawn_agent`, `codex_app`) before concluding: some environments defer tools behind
|
|
45
|
+
tool search. A hit is only a lead: revalidate that the visible result is the COMPLETE,
|
|
46
|
+
mutually compatible transport set from case 1 or 2 before selecting it. Do not combine
|
|
47
|
+
partial hits from different transports.
|
|
48
|
+
4. **Neither set exists** - teammode cannot run here. Do NOT run `init` or fake a team with
|
|
49
|
+
partial tooling. If another visible plain-subagent mechanism can independently spawn,
|
|
50
|
+
communicate with, and observe plain workers, announce that exact mechanism and use it for
|
|
51
|
+
non-overlapping scopes. Otherwise continue serially and report the capability limitation;
|
|
52
|
+
never promise or imply plain subagents that this session cannot create.
|
|
53
|
+
|
|
54
|
+
Then, BEFORE running `init` (or instead of it in case 4), tell the user in one line what this
|
|
55
|
+
environment provides and which route you picked:
|
|
56
|
+
- `Teammode transport: MultiAgentV2 (flat spawn_agent with task_name).`
|
|
57
|
+
- `Teammode transport: Codex App threads (flat V2 tools not present in this session).`
|
|
58
|
+
- `Teammode unavailable: neither MultiAgentV2 nor codex_app tools exist in this session -
|
|
59
|
+
using <visible plain-subagent mechanism> for independent scopes.`
|
|
60
|
+
- `Teammode unavailable: neither MultiAgentV2 nor codex_app tools exist in this session, and
|
|
61
|
+
no compatible plain-subagent mechanism is available - continuing serially.`
|
|
62
|
+
|
|
63
|
+
Pass the choice to `init` as `--transport multi_agent_v2` or `--transport codex_app`. The
|
|
51
64
|
transport is recorded in `team.json` and is IMMUTABLE for the team's lifetime: a V2 spawn
|
|
52
65
|
failure is a V2 blocker to report, never permission to mix Codex App threads into the same
|
|
53
|
-
team. Never probe by trial-calling tools; read your tool list
|
|
66
|
+
team. Never probe by trial-calling tools; read your tool list, and search it with
|
|
67
|
+
`tool_search` only when a needed set is not visible.
|
|
54
68
|
|
|
55
69
|
## You are the leader - orchestrate, do not implement
|
|
56
70
|
|
|
@@ -126,10 +140,13 @@ teams, and a refused command never changes `team.json`.
|
|
|
126
140
|
**MultiAgentV2 teams:**
|
|
127
141
|
1. If a member needs an isolated worktree, run `worktree-add` BEFORE spawning it - flat
|
|
128
142
|
`spawn_agent` has no cwd argument, so the path must ride in the bootstrap message.
|
|
129
|
-
2. Spawn each member with flat `spawn_agent
|
|
130
|
-
`message` is the bootstrap printed by
|
|
131
|
-
`fork_turns
|
|
132
|
-
|
|
143
|
+
2. Spawn each member with flat `spawn_agent` using only the V2 schema fields:
|
|
144
|
+
`task_name` is that member's `--task-name`, `message` is the bootstrap printed by
|
|
145
|
+
`add-member` / `member-prompt`, and `fork_turns` is `"none"` (members read
|
|
146
|
+
`guide.md` for context; full parent history is not their context model). Put any
|
|
147
|
+
role, priority, or task-specific routing instruction in `message`; V2 does not accept
|
|
148
|
+
`agent_type`, `model`, `reasoning_effort`, or `service_tier`, so members inherit the
|
|
149
|
+
session model.
|
|
133
150
|
3. `bind-agent --agent-path` with the canonical task name the spawn returned (normally
|
|
134
151
|
`/root/<task_name>`); binding confirms the runtime identity matches the roster and records
|
|
135
152
|
the member's cwd. Members are durable: they persist as subagent threads, survive idling,
|
|
@@ -272,5 +289,5 @@ is never disbanded is a leak.
|
|
|
272
289
|
- Member communication stays English unless the user explicitly requests otherwise; user-facing
|
|
273
290
|
replies follow the user's language.
|
|
274
291
|
- Stop if the selected transport's tools (V2 spawn/message/wait/list/interrupt, or Codex App
|
|
275
|
-
create/read/send/title/archive)
|
|
276
|
-
|
|
292
|
+
create/read/send/title/archive) stop working mid-run; say so instead of faking it or silently
|
|
293
|
+
switching transports. Pre-init absence is not a stop - it routes to the plain-subagent split.
|
|
@@ -44,6 +44,7 @@ import {
|
|
|
44
44
|
import { isMultiAgentV2, parseTeamTransport } from "./team-transport.mjs";
|
|
45
45
|
import { addMemberWorktree, integrateMemberBranch, removeMemberWorktree } from "./team-worktree.mjs";
|
|
46
46
|
|
|
47
|
+
|
|
47
48
|
function parseFlags(args) {
|
|
48
49
|
const flags = { _: [] };
|
|
49
50
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -149,7 +150,7 @@ const handlers = {
|
|
|
149
150
|
return { team, member: team.members.find((m) => m.id === memberId) };
|
|
150
151
|
});
|
|
151
152
|
const delivery = isMultiAgentV2(team)
|
|
152
|
-
? `Send this
|
|
153
|
+
? `Send this with spawn_agent using only task_name "${member.taskName}", message <bootstrap>, and fork_turns "none"; then bind-agent --agent-path "${member.agentPath}"`
|
|
153
154
|
: `Send this as the new thread's first message (title the thread "${member.threadTitle}")`;
|
|
154
155
|
process.stdout.write(`added member ${memberId} to team ${sessionId}.\n\n${delivery}:\n---\n${buildMemberPrompt(team, memberId)}\n---\n`);
|
|
155
156
|
},
|
|
@@ -32,7 +32,7 @@ The Tier-2 stealth browser is **CloakBrowser**, installed at runtime via `pip`
|
|
|
32
32
|
(`pip install cloakbrowser`). No CloakBrowser source is vendored in this repository.
|
|
33
33
|
|
|
34
34
|
- Source: https://github.com/CloakHQ/CloakBrowser
|
|
35
|
-
- Pinned runtime version: **0.4.
|
|
35
|
+
- Pinned runtime version: **0.4.10** (documented in `references/chrome-stealth.md`;
|
|
36
36
|
this is a documented version string, not an automated drift check).
|
|
37
37
|
- Wrapper source license: MIT License.
|
|
38
38
|
- Binary license: the compiled CloakBrowser Chromium binary downloaded by
|
|
@@ -79,7 +79,7 @@ The Tier-2 automation CLI is **agent-browser**, installed at runtime via `npm`
|
|
|
79
79
|
(`npm i -g agent-browser`). No agent-browser source is vendored in this repository.
|
|
80
80
|
|
|
81
81
|
- Source: https://github.com/vercel-labs/agent-browser
|
|
82
|
-
- Pinned runtime version: **0.
|
|
82
|
+
- Pinned runtime version: **0.31.1** (documented in `references/chrome-stealth.md`;
|
|
83
83
|
documented version string, no automated drift check).
|
|
84
84
|
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
85
85
|
these files except in compliance with the License. You may obtain a copy of the
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Local deps for Playwright real-Chrome templates. npm install && npx playwright install chrome",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"playwright": "^1.61.
|
|
7
|
+
"playwright": "^1.61.1",
|
|
8
8
|
"playwright-extra": "^4.3.6",
|
|
9
9
|
"puppeteer-extra-plugin-stealth": "^2.11.2"
|
|
10
10
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Real interaction (clicks, forms, screenshots, video, persistent login) for pages that defeat Tier 1/1.5. Two runtime tools, both installed on demand — neither is vendored in this skill:
|
|
4
4
|
|
|
5
|
-
- **CloakBrowser** (`pip`) — stealth Chromium with source-level C++ fingerprint patches. The Python wrapper source is MIT; the downloaded Chromium binary is covered by CloakBrowser's separate binary license and is not redistributed by this package. Passes Cloudflare Turnstile, FingerprintJS, BrowserScan, and 30+ detectors. Pin **0.4.
|
|
6
|
-
- **agent-browser** (`npm`, Apache-2.0) — native CDP automation CLI that drives CloakBrowser. AX-tree snapshots, `@eN` refs, click/fill/type/scroll, screenshots, video, cookie/state/session management. Pin **0.
|
|
5
|
+
- **CloakBrowser** (`pip`) — stealth Chromium with source-level C++ fingerprint patches. The Python wrapper source is MIT; the downloaded Chromium binary is covered by CloakBrowser's separate binary license and is not redistributed by this package. Passes Cloudflare Turnstile, FingerprintJS, BrowserScan, and 30+ detectors. Pin **0.4.10**.
|
|
6
|
+
- **agent-browser** (`npm`, Apache-2.0) — native CDP automation CLI that drives CloakBrowser. AX-tree snapshots, `@eN` refs, click/fill/type/scroll, screenshots, video, cookie/state/session management. Pin **0.31.1**.
|
|
7
7
|
|
|
8
8
|
```
|
|
9
9
|
CloakBrowser (stealth Chromium) <- CDP port 9242 -> agent-browser CLI
|
|
@@ -18,22 +18,22 @@ CloakBrowser (stealth Chromium) <- CDP port 9242 -> agent-browser CLI
|
|
|
18
18
|
CloakBrowser runs in a dedicated Python venv. Cross-platform: macOS, Linux, and Windows all supported by both tools (use the venv path convention for your OS).
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
# CloakBrowser (MIT wrapper source; separate binary license, pin 0.4.
|
|
21
|
+
# CloakBrowser (MIT wrapper source; separate binary license, pin 0.4.10):
|
|
22
22
|
uv venv .cloak-venv --python 3.13
|
|
23
23
|
# macOS/Linux: source .cloak-venv/bin/activate Windows: .cloak-venv\Scripts\activate
|
|
24
|
-
uv pip install "cloakbrowser==0.4.
|
|
24
|
+
uv pip install "cloakbrowser==0.4.10"
|
|
25
25
|
python -c "import cloakbrowser; cloakbrowser.ensure_binary()" # downloads stealth Chromium on first import
|
|
26
26
|
|
|
27
|
-
# agent-browser (Apache-2.0, pin 0.
|
|
28
|
-
npm i -g agent-browser@0.
|
|
29
|
-
agent-browser --version # 0.
|
|
27
|
+
# agent-browser (Apache-2.0, pin 0.31.1):
|
|
28
|
+
npm i -g agent-browser@0.31.1 && agent-browser install
|
|
29
|
+
agent-browser --version # 0.31.1
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
Verify CloakBrowser:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
35
|
python -c "import cloakbrowser; print(cloakbrowser.__version__, cloakbrowser.CHROMIUM_VERSION, cloakbrowser.binary_info()['installed'])"
|
|
36
|
-
# -> 0.4.
|
|
36
|
+
# -> 0.4.10 <chromium-version> True
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
## Launch + drive
|
|
@@ -76,7 +76,7 @@ agent-browser skills list # everything available on the installed
|
|
|
76
76
|
agent-browser --cdp 9242 eval 'navigator.webdriver' # must print false
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
Verified 2026-07 with CloakBrowser 0.4.10 + agent-browser 0.31.1: `navigator.webdriver` reads the boolean false with no init-script, bot.sannysoft.com all-green, browserscan.net "Normal" (15/15), nowsecure.nl Turnstile bypassed.
|
|
80
80
|
|
|
81
81
|
## Cookie login (cross-platform)
|
|
82
82
|
|
|
@@ -115,6 +115,6 @@ lsof -ti:9242 | xargs kill -9
|
|
|
115
115
|
# agent-browser can't connect:
|
|
116
116
|
curl -s http://127.0.0.1:9242/json/version | head -5 # empty -> CloakBrowser not running
|
|
117
117
|
# Update either tool:
|
|
118
|
-
uv pip install --upgrade "cloakbrowser==0.4.
|
|
119
|
-
npm i -g agent-browser@0.
|
|
118
|
+
uv pip install --upgrade "cloakbrowser==0.4.10" && python -c "import cloakbrowser; cloakbrowser.ensure_binary()"
|
|
119
|
+
npm i -g agent-browser@0.31.1
|
|
120
120
|
```
|
|
@@ -24,21 +24,29 @@ unit-level contract holds, not that the user-facing behavior works.
|
|
|
24
24
|
|
|
25
25
|
# Tier triage (classify ONCE at bootstrap; record tier + one-line
|
|
26
26
|
justification in the notepad; ratchet up only)
|
|
27
|
+
Your change set is what THIS session will itself edit or execute;
|
|
28
|
+
work handed to another session, thread, or delegated loop is payload
|
|
29
|
+
and sizes THAT session's process, not yours. Launching it — sync,
|
|
30
|
+
prompt, create, verify — is control-plane work: LIGHT however large
|
|
31
|
+
the delegated project is.
|
|
27
32
|
Default is LIGHT. Take HEAVY only when the change set hits a fact you
|
|
28
33
|
can point to: a new module / layer / domain model / abstraction;
|
|
29
|
-
auth, security, session, or permissions;
|
|
30
|
-
(API, queue, payment, webhook)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
auth, security, session-handling code, or permissions; building or
|
|
35
|
+
changing an external integration (API, queue, payment, webhook) —
|
|
36
|
+
calling an existing API is not one; a DB schema or migration;
|
|
37
|
+
concurrency, transaction boundaries, or cache invalidation; a
|
|
38
|
+
refactor crossing domain boundaries; or the user signaled care
|
|
39
|
+
("carefully", "thoroughly", "design first") or demanded review of
|
|
40
|
+
this session's work.
|
|
34
41
|
When unsure, take HEAVY. If a HEAVY fact surfaces mid-task, upgrade
|
|
35
42
|
immediately and redo whatever the LIGHT path skipped; never downgrade
|
|
36
43
|
mid-task. The tier sizes process, never honesty: both tiers capture
|
|
37
44
|
evidence, record cleanup receipts, and obey the never-suppress rules.
|
|
38
45
|
|
|
39
|
-
LIGHT —
|
|
40
|
-
|
|
41
|
-
a query tweak, copy/constants
|
|
46
|
+
LIGHT — the deliverable follows a known pattern with no open design
|
|
47
|
+
decisions (one-spot bugfix, an endpoint following an existing
|
|
48
|
+
pattern, a validation rule, a query tweak, copy/constants, launching
|
|
49
|
+
or steering another session): plan directly in the notepad; 1-2
|
|
42
50
|
success criteria (happy path + the riskiest edge); one real-surface
|
|
43
51
|
proof of the user-visible deliverable, where auxiliary surfaces are
|
|
44
52
|
first-class for CLI- or data-shaped work; self-review recorded in the
|
|
@@ -101,24 +109,32 @@ First, survey the loaded skill list and read the description of each
|
|
|
101
109
|
loosely relevant skill. Decide explicitly which skills this task will
|
|
102
110
|
use and prefer using every genuinely applicable one — name them in the
|
|
103
111
|
notepad with a one-line reason each. Skipping a skill that fits the
|
|
104
|
-
task is a defect.
|
|
112
|
+
task is a defect. Open a skill's body only when THIS session will
|
|
113
|
+
execute its workflow; skills a delegated session needs are named in
|
|
114
|
+
its prompt and read there, not here.
|
|
105
115
|
Next, fire the first discovery wave in ONE parallel action (Finding
|
|
106
116
|
things below): direct lookups plus `explorer` / `librarian` children
|
|
107
117
|
for unfamiliar layout or external contracts.
|
|
108
118
|
Then run Tier triage (above) on the change set and record the tier —
|
|
109
|
-
tier sizes evidence and review, never who plans. Size planning by
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
119
|
+
tier sizes evidence and review, never who plans. Size planning by
|
|
120
|
+
what the wave left UNDECIDED, not by how many steps you can list:
|
|
121
|
+
spawn the `plan` agent only when open design decisions remain —
|
|
122
|
+
unclear module boundaries, several viable decompositions, or a
|
|
123
|
+
multi-file build whose dependency order is not obvious — pass it the
|
|
124
|
+
gathered findings (file:line facts, constraints, unknowns), and
|
|
125
|
+
follow its wave order, parallel grouping, and verification exactly.
|
|
126
|
+
A known procedure — however many steps — and questions about work you
|
|
127
|
+
are delegating never justify a planner: plan directly in the notepad.
|
|
128
|
+
Never spawn `plan` before the discovery wave has returned.
|
|
117
129
|
|
|
118
130
|
## 1. Create the goal with binding success criteria
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
131
|
+
You MUST register the goal with the `create_goal` tool — NOT prose,
|
|
132
|
+
NOT the notepad, NOT the plan: the registered goal is the binding
|
|
133
|
+
contract for the whole run, and skipping it is a defect. Call it with
|
|
134
|
+
exactly `objective`; do not include `status`. Only when no goal tool
|
|
135
|
+
exists on this surface, open your reply with a `# Goal` block treated
|
|
136
|
+
as binding. Goals are unlimited; never invent a numeric budget or
|
|
137
|
+
limit.
|
|
122
138
|
The criteria MUST list, upfront:
|
|
123
139
|
- The user-visible deliverable in one line, and the tier with its
|
|
124
140
|
justification.
|
|
@@ -131,6 +147,9 @@ The criteria MUST list, upfront:
|
|
|
131
147
|
- For each criterion, the failing-first proof (test id or scenario)
|
|
132
148
|
that will be captured RED BEFORE the implementation and GREEN after.
|
|
133
149
|
Evidence added after the green code does NOT satisfy this.
|
|
150
|
+
- WHEN TO STOP, in one line: "I'll stop right away when <the exact
|
|
151
|
+
observable state that ends this run>". The Stop rules bind to this
|
|
152
|
+
line — the moment it holds, you stop.
|
|
134
153
|
|
|
135
154
|
These scenarios are the contract. You are not done until every one of
|
|
136
155
|
them PASSES with its evidence captured.
|
|
@@ -231,6 +250,18 @@ Until every success criterion PASSES with its evidence captured:
|
|
|
231
250
|
scenario captured failing when no test seam exists. It must fail
|
|
232
251
|
for the RIGHT reason (not a syntax error, not a missing import).
|
|
233
252
|
Paste RED output into the notepad. No production code yet.
|
|
253
|
+
TEST-ONLY TARGET (regression coverage for behavior that is already
|
|
254
|
+
correct): there is no natural RED and no production change to make
|
|
255
|
+
— this is the sole exception to the production-RED/GREEN steps.
|
|
256
|
+
Substitute a mutation proof: temporarily force the exact regression
|
|
257
|
+
each new assertion names (revert the fix commit or break the seam,
|
|
258
|
+
never committed), capture the assertion failing, then revert the
|
|
259
|
+
mutation and capture GREEN. An assertion that stays green under its
|
|
260
|
+
mutation is not coverage — fix the fixture (a value equal to the
|
|
261
|
+
default it must override proves nothing) or assert the artifact the
|
|
262
|
+
criterion names, never an expected value re-derived from the output
|
|
263
|
+
under test. Reverting the probe IS the GREEN; skip step 3's
|
|
264
|
+
production change for a TEST-ONLY task and go to step 4.
|
|
234
265
|
PROSE TARGET (prompt, SKILL.md, rule, markdown): the wording is
|
|
235
266
|
NOT the behavior — never pin sentences, phrase presence/absence,
|
|
236
267
|
or word/char counts. PIN only a machine-consumed value (parsed
|
|
@@ -239,7 +270,8 @@ Until every success criterion PASSES with its evidence captured:
|
|
|
239
270
|
two shipped copies. A pure-prose change with no machine consumer
|
|
240
271
|
has NO seam: ship it on review + QA-by-read, NO test — a text grep
|
|
241
272
|
is pretend-coverage, not RED proof.
|
|
242
|
-
3. GREEN
|
|
273
|
+
3. GREEN (skip for TEST-ONLY — reverting the mutation is GREEN): write
|
|
274
|
+
the SMALLEST production change that flips RED→GREEN.
|
|
243
275
|
Before GREEN work that depends on external review, PR, issue, or
|
|
244
276
|
branch state, refresh current branch/PR/issue state and preserve existing ordering/policy;
|
|
245
277
|
separate compatibility detection from policy changes unless the goal
|
|
@@ -377,10 +409,11 @@ message + present for approval.
|
|
|
377
409
|
revert, capture the proof failing, then redo the change. Exempt
|
|
378
410
|
only: pure formatting, comment-only edits, dependency bumps with no
|
|
379
411
|
behavior delta, rename-only moves — justify each in `## Findings`.
|
|
380
|
-
- A test that
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
412
|
+
- A test that cannot fail for the regression it names is NOT
|
|
413
|
+
evidence: mock-call assertions, pinned constants, a fixture equal
|
|
414
|
+
to the default it must override, an expected value re-derived from
|
|
415
|
+
the output under test. Prefer a real-surface proof with no new
|
|
416
|
+
test over a tautological one.
|
|
384
417
|
- Refactors: characterization tests pinning current observable
|
|
385
418
|
behavior FIRST, green against the old code, green throughout.
|
|
386
419
|
- Smallest correct change. No drive-by refactors.
|
|
@@ -402,9 +435,15 @@ message + present for approval.
|
|
|
402
435
|
- After each result, ask whether the user's core request can now be
|
|
403
436
|
answered with useful evidence in hand. If yes, answer now — skip any
|
|
404
437
|
remaining retrieval, ceremony, or verification that adds no evidence.
|
|
405
|
-
-
|
|
438
|
+
- The STOP GOAL: every scenario PASSES with captured evidence, every
|
|
406
439
|
cleanup receipt is recorded, notepad is current, and (if gate
|
|
407
|
-
triggered) reviewer approved unconditionally.
|
|
440
|
+
triggered) reviewer approved unconditionally. Above ALL of that, the
|
|
441
|
+
decisive test — outranking every other consideration — is: are the
|
|
442
|
+
completion conditions FUNDAMENTALLY fulfilled, is the user's problem
|
|
443
|
+
ACTUALLY SOLVED in observable behavior? If no, you are NOT done,
|
|
444
|
+
whatever the ledger says. If yes, deliver the final message and STOP
|
|
445
|
+
— no hesitation, no extra verification pass, no polish loop. Work
|
|
446
|
+
past the stop goal is scope creep, not diligence.
|
|
408
447
|
- Leftover QA state (live process, `tmux` session, browser context,
|
|
409
448
|
bound port, temp file / dir) means NOT done. Tear it down, record
|
|
410
449
|
the receipt, then continue.
|
|
@@ -14,7 +14,7 @@ This skill is intentionally compact. The full workflow lives in `references/full
|
|
|
14
14
|
## Required First Steps
|
|
15
15
|
|
|
16
16
|
1. Open `references/full-workflow.md`.
|
|
17
|
-
2. Read through **Bootstrap** (including its tier triage), **Execution Loop**,
|
|
17
|
+
2. Read through **Bootstrap** (including its tier triage), **Execution Loop**, the **Manual-QA channels** table, and the **Stop Rules** before running any ULW command or recording evidence.
|
|
18
18
|
3. If the task has code edits, tests, QA, or commit work, follow the full workflow's delegation and evidence rules. Tests alone never prove done.
|
|
19
19
|
|
|
20
20
|
## Non-Negotiables
|
|
@@ -26,7 +26,7 @@ This skill is intentionally compact. The full workflow lives in `references/full
|
|
|
26
26
|
- Evidence is bound to its capture commit; a later fix, rebase, or merge makes it stale — re-run at the current HEAD and re-record, never relabel or regenerate. Record only after cleanup receipts exist.
|
|
27
27
|
- Delegate code edits, test writes, fixes, and QA execution to right-sized Codex subagents when the workflow requires it.
|
|
28
28
|
- Every `spawn_agent` message starts with `TASK:`, then names `DELIVERABLE`, `SCOPE`, and `VERIFY`; put role and specialty instructions inside `message`; use `fork_turns: "none"` (v1: `fork_context: false`) unless full history is truly required.
|
|
29
|
-
- Plan and reviewer agents may run for a long time; spawn them in the background
|
|
29
|
+
- Plan and reviewer agents may run for a long time; spawn them in the background and keep doing independent root work. Between `wait_agent` calls, back off — double the timeout up to ~5 minutes — instead of spinning short cycles.
|
|
30
30
|
- For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long reading, testing, or review passes, and `BLOCKED: <reason>` only when it cannot progress.
|
|
31
31
|
- Track spawned agent names locally. Use `wait_agent` for mailbox signals, not proof of completion. A timeout only means no new mailbox update arrived. Treat a running child as alive.
|
|
32
32
|
- While children run, surface the active subagent count, agent names, and latest `WORKING:` phase.
|