@terreno/agent-plugin 0.0.0-stage → 58.0.0-beta.2

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.
Files changed (98) hide show
  1. package/.claude-plugin/plugin.json +32 -0
  2. package/CHANGELOG.md +2213 -0
  3. package/LICENSE +21 -0
  4. package/README.md +57 -2
  5. package/agents/pre-commit.md +65 -0
  6. package/agents/ui-verifier.md +93 -0
  7. package/package.json +32 -4
  8. package/references/async-review-bots.md +76 -0
  9. package/references/documentation-contract.md +61 -0
  10. package/references/execution-state.schema.json +77 -0
  11. package/references/github-attention-contract.md +165 -0
  12. package/references/independent-review.md +31 -0
  13. package/references/lifecycle-contract.md +211 -0
  14. package/references/loop-engineering.md +125 -0
  15. package/references/pick-roast-loop.md +112 -0
  16. package/references/pr-deployments.md +69 -0
  17. package/references/product-ci.md +164 -0
  18. package/references/push-ownership.md +91 -0
  19. package/references/stage-result.schema.json +82 -0
  20. package/references/subagent-briefing.md +43 -0
  21. package/references/testing-plan.md +163 -0
  22. package/references/user-guide.md +171 -0
  23. package/skills/1-grow/SKILL.md +145 -0
  24. package/skills/1-grow/references/grilling.md +243 -0
  25. package/skills/2-pick/SKILL.md +170 -0
  26. package/skills/2-pick/references/mocking.md +34 -0
  27. package/skills/2-pick/references/testing.md +43 -0
  28. package/skills/3-roast/SKILL.md +168 -0
  29. package/skills/4-brew/SKILL.md +201 -0
  30. package/skills/5-taste/SKILL.md +311 -0
  31. package/skills/ai-prompt-governance/SKILL.md +100 -0
  32. package/skills/attach-pr-media/SKILL.md +89 -0
  33. package/skills/attach-pr-media/scripts/upload-pr-media.sh +151 -0
  34. package/skills/backend-test-env/SKILL.md +64 -0
  35. package/skills/backfill-regression/SKILL.md +101 -0
  36. package/skills/backfill-user-guide/SKILL.md +96 -0
  37. package/skills/bootstrap-mcp-server/SKILL.md +244 -0
  38. package/skills/building-admin-interfaces/SKILL.md +86 -0
  39. package/skills/building-admin-interfaces/agents/openai.yaml +4 -0
  40. package/skills/building-admin-interfaces/references/nav-and-shell.md +42 -0
  41. package/skills/building-admin-interfaces/references/patterns-and-tools.md +74 -0
  42. package/skills/building-admin-interfaces/references/screens-and-routes.md +50 -0
  43. package/skills/building-terreno-apps/SKILL.md +294 -0
  44. package/skills/building-terreno-apps/agents/openai.yaml +4 -0
  45. package/skills/building-terreno-apps/references/navigation.md +108 -0
  46. package/skills/building-terreno-apps/references/route-structure.md +104 -0
  47. package/skills/building-terreno-apps/references/screen-patterns.md +174 -0
  48. package/skills/debug-syncdb-with-mcp/SKILL.md +75 -0
  49. package/skills/deploy-gcp/SKILL.md +73 -0
  50. package/skills/deploy-gcp/references/troubleshooting.md +29 -0
  51. package/skills/generate-release-announcements/SKILL.md +145 -0
  52. package/skills/generate-sdk/SKILL.md +165 -0
  53. package/skills/mongoose-schema-safety/SKILL.md +164 -0
  54. package/skills/pick-roast-loop/SKILL.md +152 -0
  55. package/skills/planning-loop/SKILL.md +161 -0
  56. package/skills/prd/SKILL.md +138 -0
  57. package/skills/set-up-social-login/SKILL.md +76 -0
  58. package/skills/store-assets/SKILL.md +221 -0
  59. package/skills/store-assets/examples/screenshots.yaml +31 -0
  60. package/skills/store-assets/examples/storeAssets.config.json +44 -0
  61. package/skills/store-assets/scripts/banner.ts +165 -0
  62. package/skills/store-assets/scripts/config.ts +255 -0
  63. package/skills/store-assets/scripts/devClient.ts +635 -0
  64. package/skills/store-assets/scripts/devices.ts +286 -0
  65. package/skills/store-assets/scripts/icon.ts +81 -0
  66. package/skills/store-assets/scripts/maestro/goHome.yaml +21 -0
  67. package/skills/store-assets/scripts/maestro/login.yaml +27 -0
  68. package/skills/store-assets/scripts/maestro/openApp.yaml +26 -0
  69. package/skills/store-assets/scripts/screenshots.ts +848 -0
  70. package/skills/taste-sweep/SKILL.md +172 -0
  71. package/skills/terreno-backend-api/SKILL.md +355 -0
  72. package/skills/terreno-backend-api/agents/openai.yaml +4 -0
  73. package/skills/terreno-backend-api/references/custom-routes.md +132 -0
  74. package/skills/terreno-backend-api/references/model-router.md +112 -0
  75. package/skills/terreno-backend-api/references/server-setup.md +116 -0
  76. package/skills/terreno-backend-tests/SKILL.md +176 -0
  77. package/skills/terreno-data-fetching/SKILL.md +288 -0
  78. package/skills/terreno-data-fetching/agents/openai.yaml +4 -0
  79. package/skills/terreno-data-fetching/references/auth-and-tokens.md +89 -0
  80. package/skills/terreno-data-fetching/references/realtime.md +50 -0
  81. package/skills/terreno-data-fetching/references/sdk-customization.md +55 -0
  82. package/skills/terreno-frontend-tests/SKILL.md +190 -0
  83. package/skills/terreno-mobile-tests/SKILL.md +127 -0
  84. package/skills/terreno-test-setup/SKILL.md +81 -0
  85. package/skills/terreno-test-setup/references/backend.md +131 -0
  86. package/skills/terreno-test-setup/references/frontend.md +169 -0
  87. package/skills/terreno-test-setup/references/mobile.md +134 -0
  88. package/skills/terreno-ui/SKILL.md +252 -0
  89. package/skills/terreno-ui/agents/openai.yaml +4 -0
  90. package/skills/terreno-ui/references/data-display.md +87 -0
  91. package/skills/terreno-ui/references/feedback.md +122 -0
  92. package/skills/terreno-ui/references/forms.md +119 -0
  93. package/skills/terreno-ui/references/layout.md +124 -0
  94. package/skills/terreno-ui/references/theming.md +87 -0
  95. package/skills/update-docs/SKILL.md +82 -0
  96. package/skills/upgrading-terreno/SKILL.md +93 -0
  97. package/skills/upgrading-terreno/references/ordering.md +40 -0
  98. package/skills/verify-ui-changes/SKILL.md +605 -0
@@ -0,0 +1,170 @@
1
+ ---
2
+ name: 2-pick
3
+ description: Implement one approved IP/task slice with behavior-focused TDD, then roast it and pick the next unblocked task until the approved list is done. Not for planning, skipping Roast, or PR submission.
4
+ ---
5
+
6
+ # Pick — build
7
+
8
+ Implement one approved slice carefully, then continue the pick-roast inner loop.
9
+ Pick's internal reviewers ask whether engineering was disciplined; they do **not**
10
+ replace Roast's independent proof. Pick never skips Roast.
11
+
12
+ Read the shared [`lifecycle contract`](../../references/lifecycle-contract.md),
13
+ [`documentation contract`](../../references/documentation-contract.md),
14
+ [`PR deployments`](../../references/pr-deployments.md),
15
+ [`pick-roast loop`](../../references/pick-roast-loop.md),
16
+ [`testing plan`](../../references/testing-plan.md),
17
+ [`user guide`](../../references/user-guide.md),
18
+ [`testing guidance`](references/testing.md),
19
+ [`mocking guidance`](references/mocking.md), and
20
+ [`subagent briefing`](../../references/subagent-briefing.md).
21
+
22
+ ## Preconditions
23
+
24
+ - An approved IP/task contract exists.
25
+ - One current unblocked task/slice is identifiable.
26
+ - Branch and prior execution state are available.
27
+
28
+ ## Inputs
29
+
30
+ - Approved IP, task file, current task, and applicable acceptance criteria
31
+ - Branch/current head and execution state
32
+ - Selected/discoverable repository skills and instructions
33
+ - Prior Pick attempts
34
+ - Exact Roast failures or Taste/CI/review evidence when retrying
35
+ - Known blockers and existing artifacts
36
+
37
+ ## Procedure
38
+
39
+ 1. **Reconstruct.** Verify the approved plan, current task, branch/head, prior result, and
40
+ already-verified behavior. Do not redo completed work. Resume the inner loop at the
41
+ next unblocked incomplete task, or at the same task when retrying a Roast `FAIL`.
42
+ When a harness pushed earlier slices automatically and product CI on that pushed
43
+ head reports a branch-caused failure, fixing it is the current task.
44
+ Do not start or continue another slice on a red head. Never wait on pending CI;
45
+ read the latest terminal results and keep building. Record flaky, infrastructure,
46
+ or other failures the branch did not cause in execution state for Taste; they do
47
+ not block the next slice. After Brew, CI reactions belong to Taste.
48
+ 2. **Read architecture docs.** Load the current architecture and domain docs for the
49
+ files/seams in this slice. Implement against that design; if the slice changes it,
50
+ update those docs in the same slice.
51
+ 3. **Discover supporting skills.** Inspect available project skills for this slice's
52
+ files; load applicable implementation, testing, documentation, safety, and runtime
53
+ guidance. Do not load the whole catalog.
54
+ 4. **Focus retries.** Convert prior failure evidence into a hypothesis and the smallest
55
+ safe change. Record attempted approaches; do not repeat one without new evidence.
56
+ 5. **Specify.** State one caller-visible behavior and the highest public seam that proves
57
+ it. List its edge cases before writing code: empty, missing, and error inputs;
58
+ loading and disabled states; boundaries; permissions; web versus native. Take them
59
+ from the acceptance criteria and repository test rules. Each one becomes a test in
60
+ this slice, so Roast proves them instead of discovering them. Read the IP's
61
+ `## E2E tests` rows whose `Written in` names this task, and the e2e guide at the
62
+ path the testing plan resolves. Each such row is a spec this slice writes. When a
63
+ row's path or layer no longer fits the code or the guide, edit that row in the IP,
64
+ add a one-line reason naming the row ID below the table (never a new column), and
65
+ update any `## Regression cases` `Automated by` cell that names the old path; never
66
+ skip a row silently. An IP that lacks the section follows the testing-plan legacy rule.
67
+ 6. **Encode.** Add one failing test and run the repository's closest test command. Confirm
68
+ it fails for the intended product reason. When the behavior has a planned row from
69
+ step 5, write that spec in this cycle at the row's path, following the e2e guide's
70
+ location, selector, and waiting rules for its layer. Run it when this stage can
71
+ reach that layer; otherwise record it `deferred` per the testing-plan deferral rule.
72
+ 7. **Fulfill.** Implement the minimum code that passes. Prefer real integrations and
73
+ narrow injected fakes at true external boundaries.
74
+ 8. **Clean the Kitchen.** Once the vertical slice is green, refactor names/structure,
75
+ remove debug/dead code, and rerun the affected repository-prescribed checks.
76
+ 9. **Review independently.** Build one task-scoped briefing (criteria, file list, this
77
+ slice's patch). In fresh contexts, give **that briefing** to:
78
+ - implementation/spec review
79
+ - test-quality review (public behavior, independent expected values, realistic
80
+ boundaries, no leaky/global test doubles)
81
+ Do not let each reviewer rediscover skills or diff the whole branch. Fix material
82
+ findings and rerun affected checks.
83
+ 10. **Check drift, docs, and runtime.** Compare the diff to the current task/IP. Update
84
+ architecture and public docs in this slice using the documentation contract. Run any
85
+ mandatory runtime/UI/safety verification declared by repository instructions or
86
+ supporting skills; for a user-facing change that is `verify-ui-changes` (own stack,
87
+ adversarial steps, the required checks, the Maestro flow for mobile-focused work or
88
+ direct simulator commands when the app has no Maestro, evidence outside the tree). Missing mandatory capability is `BLOCKED`, not skipped.
89
+ Missing docs for a user-visible or architectural change is `FAIL`. Write or edit
90
+ each user guide page whose `## User guide` row names this task, at the row's path,
91
+ in the user-guide page format, from the behavior this slice shipped; update the
92
+ guide index in the same slice. When a row's page path or change no longer fits,
93
+ edit that row in the IP with a one-line reason naming the row ID below the table;
94
+ never skip a guide row silently. Skip this when the repository opts out of the
95
+ user guide; an IP that lacks the section follows the user-guide legacy rule.
96
+ 11. **Record.** Record the completed task/slice in execution state with commands,
97
+ evidence, artifacts, docs files, attempts, each planned spec written (row ID
98
+ and path), and each user guide page written (row ID and path). Do not commit a separate task-file edit to mark progress; the
99
+ task-file mark rides in this slice's commit (step 13).
100
+ 12. **Prove this task.** Invoke Roast to prove this task only. Prefer a fresh context
101
+ and pass the same task-scoped briefing. Roast must not spawn two unconstrained
102
+ reviewers. Roast must return after classifying this task. Roast never invokes Pick.
103
+ Do not start the next task until Roast PASS.
104
+ Exactly one driver continues — that driver is this Pick.
105
+ 13. **Commit once.** After Roast `PASS`, make one behavior-scoped commit for the task:
106
+ code, tests, docs, the task-file mark, and any fixes Roast forced. Fold Roast-driven
107
+ fixes into the task's unpushed commit instead of adding "harden", "strengthen", or
108
+ "mark roasted" follow-ups. Do not push during Pick; Brew pushes. When the harness
109
+ pushes every commit automatically, commit only after Roast `PASS` for the same
110
+ reason. Follow the [commit and push rules](../../references/pick-roast-loop.md#commits-and-pushes).
111
+ 14. **Continue or stop.** After Roast `PASS`, if unblocked incomplete tasks remain,
112
+ reconstruct the next frontier task and repeat from Reconstruct so architecture docs
113
+ and supporting skills are rediscovered for that slice. If none remain, emit
114
+ `PASS` with `next: brew`. Roast `FAIL` retries this task from Focus retries. Emit
115
+ `FAIL` with `next: pick` only when this invocation must exit for a new hypothesis
116
+ the current context cannot safely continue. `BLOCKED` exits the loop. Pick owns
117
+ the inner loop. Do not rely on Roast to start the next Pick.
118
+
119
+ Repeat Specify → Encode → Fulfill for learned behaviors inside this one slice. Do not
120
+ batch all tests first. Do not expand into the next task until Roast PASS.
121
+
122
+ ## Supporting skills
123
+
124
+ Follow the shared discovery procedure. Project skills own exact commands, framework
125
+ patterns, schema/data rules, test environment, UI verification, prompt governance,
126
+ generated-code workflows, and repository gotchas.
127
+
128
+ ## Evidence produced
129
+
130
+ - Files/behavior completed for each task this invocation finished
131
+ - Red and green test evidence plus required lint/type/build/runtime results
132
+ - Each `## E2E tests` row this task owns, with the spec path written or the edited row
133
+ and its reason
134
+ - Each `## User guide` row this task owns, with the page written or the edited row and
135
+ its reason
136
+ - Internal review results
137
+ - Drift decision and artifact references
138
+ - Attempted-approach summary (especially on retries)
139
+ - Per-task Pick and Roast results in execution state
140
+ - Terminal structured Pick or inner-loop result
141
+
142
+ ## Success conditions
143
+
144
+ - Every in-scope task this invocation reached has Roast `PASS` on the recorded head.
145
+ - Required repository checks/runtime gates pass for the current head.
146
+ - No unresolved internal review findings or plan drift remain on completed tasks.
147
+ - Every `## E2E tests` row a completed task owns has a spec at the row's path.
148
+ - Every `## User guide` row a completed task owns has its page written, edited, or
149
+ retired at the row's path.
150
+ - When unblocked tasks remain, continue the loop rather than exiting.
151
+ - When none remain, emit `PASS` with `next: brew`.
152
+
153
+ ## Failure conditions
154
+
155
+ Tests, internal reviews, or implementation checks that objectively fail emit `FAIL` with
156
+ expected/actual/evidence and `next: pick` only with a focused next
157
+ hypothesis; otherwise escalate under blocked conditions.
158
+
159
+ ## Blocked conditions
160
+
161
+ An unresolved product/security/data/public-API decision, unsafe destructive change,
162
+ missing required verifier, inaccessible dependency, or scope expansion emits `BLOCKED`
163
+ with `next: null` and the exact decision/action required.
164
+
165
+ ## Recommended next stage
166
+
167
+ - Inner-loop `PASS` (all in-scope tasks roasted) → `next: brew`
168
+ - Current task built, Roast not yet run → `next: roast` (invoke Roast in-process)
169
+ - `FAIL` → `next: pick` with preserved evidence and a new hypothesis
170
+ - `BLOCKED` → outer loop routes the named gate
@@ -0,0 +1,34 @@
1
+ # Mocking at boundaries
2
+
3
+ Mock only a boundary where production leaves the system:
4
+
5
+ - third-party APIs and provider SDKs
6
+ - time, randomness, or operating-system I/O
7
+ - network transport
8
+ - file storage when a real temporary directory is unsuitable
9
+
10
+ Use real internal collaborators and integrations when the repository's test environment
11
+ supports them. Repository skills decide whether databases, stores, routers, or framework
12
+ harnesses are real, isolated, or replaced at a boundary.
13
+
14
+ ## Prefer injected fakes
15
+
16
+ Pass a narrow, domain-specific adapter into production code and provide a local fake in the test. Each adapter operation should have one typed purpose and one response shape.
17
+
18
+ Keep fake state inside the test or a fresh harness factory. Assert observable results first; inspect fake state only when the boundary interaction itself is the contract.
19
+
20
+ ## Module mocks leak
21
+
22
+ Some runners implement module mocks as process-wide or hoisted state. Registration may
23
+ survive an individual test and make order significant. Consult repository test guidance.
24
+
25
+ Design an injectable seam instead of using `mock.module`. When an unchangeable dynamic import makes a module mock unavoidable:
26
+
27
+ 1. isolate it in a dedicated file or test process
28
+ 2. document why dependency injection cannot represent the boundary
29
+ 3. run it through the repository's isolated-test mechanism
30
+ 4. never rely on restoring the module in `afterEach`
31
+
32
+ ## Scoped spies
33
+
34
+ A test-local `spyOn` is acceptable for a true boundary or for forcing an otherwise unreachable framework error. Restore it in the same test lifecycle. A spy on an internal collaborator is not a substitute for testing public behavior.
@@ -0,0 +1,43 @@
1
+ # Behavior-first tests
2
+
3
+ Tests are executable specifications at public seams. A refactor may replace the implementation without changing the test.
4
+
5
+ ## Choose the seam
6
+
7
+ Before each slice, record the public seam in the task/working notes:
8
+
9
+ - HTTP route for backend behavior
10
+ - exported class/function for package behavior
11
+ - rendered component interaction for UI behavior
12
+ - injected adapter contract for external systems
13
+
14
+ Prefer the highest existing seam that proves the behavior. Add a seam only when the production design needs one.
15
+
16
+ ## Red flags
17
+
18
+ - asserting private methods, internal call order, or call counts
19
+ - querying storage directly when the public interface can retrieve the result
20
+ - recomputing the expected value with the same algorithm as production
21
+ - writing all imagined tests before any implementation
22
+ - testing a mock's behavior instead of the product behavior
23
+
24
+ Expected values come from a literal worked example, the IP, or another independent source of truth.
25
+
26
+ ## Planned e2e specs
27
+
28
+ The IP's `## E2E tests` table is the e2e plan, defined in the
29
+ [`testing plan`](../../../references/testing-plan.md). Pick writes every row whose
30
+ `Written in` names the current task, in that task, at the row's path. Follow the e2e
31
+ guide the testing plan resolves for where specs live, how they find elements, and how
32
+ they wait. A row whose path or layer no longer fits is edited in the IP with a one-line
33
+ reason, never skipped. Running a layer the current stage cannot reach follows the
34
+ testing-plan deferral rule.
35
+
36
+ ## Repository composition
37
+
38
+ Load applicable repository testing skills before choosing commands, harnesses, fixtures,
39
+ databases, assertion libraries, or runtime probes. In Terreno apps those are
40
+ `terreno-backend-tests`, `terreno-frontend-tests`, and `terreno-mobile-tests`; run
41
+ `terreno-test-setup` first when the layer has no test setup. Match established tests near the
42
+ changed public seam. The lifecycle plugin does not prescribe a framework or package
43
+ layout.
@@ -0,0 +1,168 @@
1
+ ---
2
+ name: 3-roast
3
+ description: Independently prove or disprove the current task against its IP criteria, then return. Do not pick or start the next task. Pick owns the inner loop. Use after Pick, preferably in a fresh context; not for fixing implementation code.
4
+ ---
5
+
6
+ # Roast — prove
7
+
8
+ Roast is the authoritative stage-level verifier for the **current task**. It does not
9
+ continue the inner loop. Roast never invokes Pick. Pick owns the inner loop:
10
+
11
+ ```text
12
+ requirement → verification method → evidence → PASS / FAIL / BLOCKED
13
+ ```
14
+
15
+ Read the shared [`lifecycle contract`](../../references/lifecycle-contract.md),
16
+ [`documentation contract`](../../references/documentation-contract.md),
17
+ [`PR deployments`](../../references/pr-deployments.md),
18
+ [`pick-roast loop`](../../references/pick-roast-loop.md),
19
+ [`testing plan`](../../references/testing-plan.md),
20
+ [`user guide`](../../references/user-guide.md), and
21
+ [`subagent briefing`](../../references/subagent-briefing.md).
22
+
23
+ ## Preconditions
24
+
25
+ - An approved IP/task contract and completed Pick result exist for the current task.
26
+ - Current branch/head and diff are resolvable.
27
+ - Run in a fresh context when the harness permits, with a task-scoped briefing.
28
+
29
+ ## Inputs
30
+
31
+ - IP, task file, acceptance criteria, and verification requirements for the current task
32
+ - Current branch/head, diff, and PR when present
33
+ - Pick result, execution state, prior Roast attempts, and artifacts
34
+ - Repository instructions and available project/verification skills
35
+
36
+ ## Procedure
37
+
38
+ 1. **Reconstruct independently.** Verify the head and this task's source artifacts from
39
+ the task-scoped briefing (criteria, file list, patch). Do not trust Pick's completion
40
+ claims as proof. Do not reload unnamed lifecycle references or the whole skill catalog.
41
+ 2. **Discover supporting skills.** Load only skills whose descriptions match this task's
42
+ files and criteria. Repository-mandatory capabilities are hard requirements.
43
+ 3. **Build the matrix.** Map every in-scope criterion **for the current task** to one or
44
+ more objective methods and the evidence required. Include promised regressions,
45
+ compatibility, and non-scope that this task could break. Add every IP
46
+ `## E2E tests` row whose `Written in` names this task, with the command that runs
47
+ its spec at the row's path, following the e2e guide the testing plan resolves.
48
+ A missing spec or a failing row is `FAIL` that names the row ID. A row whose layer
49
+ this invocation cannot reach is `deferred` per the testing-plan deferral rule, unless
50
+ repository policy makes that layer mandatory here, which is `BLOCKED`. Record a
51
+ deferred row's exact command in the Roast result and execution state, never in the
52
+ IP tables, and never count it as passed. Add every IP `## Regression cases` row this
53
+ task's criteria name, or whose `Automated by` names one of this task's rows or specs;
54
+ when no unblocked tasks remain, add every row no earlier Roast checked. Check each
55
+ against the testing-plan regression-step bar. A row without a concrete starting
56
+ state, a followable action, and an observable Expected is `FAIL` that names the row
57
+ ID and the missing part; Pick fixes it by rewriting that row in the IP in place.
58
+ A row an e2e guide layer could cover completely is also `FAIL` (testing-plan
59
+ "Keep regression minimal"); Pick moves it to `## E2E tests`. Roast never walks a row.
60
+ An IP that lacks either section follows the testing-plan legacy rule: warn once and
61
+ do not fail.
62
+ 4. **Inspect and execute.** Review this task's patch and run concrete checks in this
63
+ invocation: repository-prescribed tests, integration/system behavior, lint/type/build
64
+ checks, runtime/API/database probes, regression reproductions, or real UI interaction.
65
+ Do not spawn two unconstrained reviewers. Prefer named commands here over a second
66
+ general-purpose child that rediscovers the repo. Run the gate CI will run on these
67
+ files, not only this task's test file. Use the root `prepush` package script when
68
+ present, since it scopes itself to changed files. Otherwise run each touched
69
+ package's lint, typecheck, and the same test command CI runs, including coverage
70
+ thresholds. A test that passes alone but fails in the package suite is `FAIL`.
71
+ 5. **Exercise changed behavior.** For UI-facing work in **this task's file list**, spawn
72
+ at most one specialized UI/runtime verifier with the same briefing. Interact with the
73
+ actual changed workflow and capture required screenshots/video/logs. App launch alone
74
+ is not proof. The verifier follows `verify-ui-changes`: a stack it owns (ports already
75
+ taken by something else are a blocker, never a shortcut), adversarial steps, the
76
+ required checks on every run (right page, not blank, no error overlay, console
77
+ clean, DOM assertion, interaction proof, screenshot), the matching Maestro flow on the
78
+ simulator for mobile-focused work (direct simulator commands when the app has no
79
+ Maestro), and a report with a Result line. It is report-only and never edits the
80
+ tree; a missing `testID` or flow is `FAIL` for Pick. A flow it could not run is
81
+ `UNVERIFIED` with the blocker, which is `BLOCKED` here, not `PASS`; so is a required
82
+ leg, such as the simulator for mobile-focused work, that the report lists only as
83
+ not run or remaining risk. Skip
84
+ that child when this task has no UI/runtime files.
85
+ 6. **Prove docs.** Confirm architecture and public docs match the shipped behavior. A
86
+ criterion that is true in code but absent or wrong in docs is `FAIL`. Check each
87
+ `## User guide` page whose row names this task against the user-guide guide-entry bar
88
+ and the shipped screens: every label a step names exists, the steps reach the
89
+ outcome `## What it does` promises, and `audience` and `platforms` match who can
90
+ reach the feature. When step 5 drives the UI, walk the page's steps there. A missing
91
+ page, a page that misses the bar, or steps that do not match the shipped screens is
92
+ `FAIL` that names the row ID. Skip this when the repository opts out of the user
93
+ guide; an IP that lacks the section follows the user-guide legacy rule.
94
+ 7. **Classify each criterion.** Record `PASS`, `FAIL`, or `BLOCKED` with reproducible
95
+ evidence. Never pass a criterion because the code merely looks reasonable.
96
+ 8. **Do not fix.** Report implementation defects to Pick. Only correct verifier setup
97
+ owned by Roast; if that changes evidence materially, rerun the affected method.
98
+ 9. **Record.** Update execution state for this task's Roast result.
99
+ 10. **Return.** Follow the pick-roast loop. Do not start the next task until Roast PASS.
100
+ Roast never invokes Pick. Pick owns the inner loop. Exactly one driver continues —
101
+ that driver is always Pick. After recording this task, return the result; do not
102
+ reconstruct Pick, do not invoke Pick, and do not start the next task. `PASS` with
103
+ remaining unblocked tasks → emit `PASS` with `next: pick`. `PASS` with none remaining
104
+ → emit `PASS` with `next: brew`. `FAIL` → emit `FAIL` with `next: pick`. `BLOCKED`
105
+ → emit `BLOCKED` with `next: null`. When Pick invoked this Roast, returning to Pick
106
+ is enough; still do not invoke Pick.
107
+
108
+ Do not treat a Roast of the last slice as proof of earlier unroasted tasks. Terminal
109
+ inner-loop `PASS` requires every in-scope task to have Roast `PASS` on the recorded head.
110
+
111
+ ## Supporting skills
112
+
113
+ Follow the shared discovery procedure. Applicable skills may supply API/database test
114
+ methods, UI/runtime verification, security/safety checks, build commands, or deployment
115
+ probes. If repository policy makes one mandatory and it is unavailable, emit `BLOCKED`.
116
+
117
+ ## Evidence produced
118
+
119
+ - Requirement-to-evidence matrix for the current task
120
+ - Each `## E2E tests` row this task owns, with its spec path, command, and `PASS`,
121
+ `FAIL`, or `deferred`
122
+ - Each `## Regression cases` row checked against the regression-step bar, and its result
123
+ - Commands/probes/interactions and outcomes
124
+ - Artifact/log/API response references
125
+ - Exact expected vs actual behavior for every failure
126
+ - Environment/access details for every blocker
127
+ - Docs pages that match or fail against shipped behavior
128
+ - Each `## User guide` row this task owns, with its page and result against the
129
+ guide-entry bar and the shipped screens
130
+ - Per-task Roast results in execution state
131
+ - Terminal structured Roast or inner-loop result
132
+
133
+ ## Success conditions
134
+
135
+ - Every in-scope acceptance criterion for the current task has objective passing
136
+ evidence on the recorded head.
137
+ - Required regression/runtime/UI checks pass.
138
+ - Every `## E2E tests` row this task owns has a spec at its path that passed here, or
139
+ is recorded `deferred` with its exact command.
140
+ - Every `## Regression cases` row Roast checked meets the regression-step bar.
141
+ - Architecture and public docs match the shipped behavior.
142
+ - Every `## User guide` page this task owns meets the guide-entry bar and matches the
143
+ shipped screens.
144
+ - Remaining unblocked tasks emit `next: pick`. Roast never invokes Pick.
145
+ - When none remain and every in-scope task has Roast `PASS`, emit `PASS` with
146
+ `next: brew`.
147
+
148
+ ## Failure conditions
149
+
150
+ One or more criteria disproven by evidence emits `FAIL` with severity, expected, actual,
151
+ and reproducible evidence. Set `next: pick`. A missing or failing `## E2E tests` row, or
152
+ a `## Regression cases` row that misses the regression-step bar, could be fully
153
+ automated, or repeats an existing case, is `FAIL` that names the row ID. So is a
154
+ `## User guide` row whose page is missing, misses the guide-entry bar, or does not match
155
+ the shipped screens.
156
+
157
+ ## Blocked conditions
158
+
159
+ Unavailable required environment/capability/access, ambiguous criterion requiring a human
160
+ decision, or external service failure that prevents proof emits `BLOCKED` with exact
161
+ classification, `next: null`, and next action.
162
+
163
+ ## Recommended next stage
164
+
165
+ - Inner-loop `PASS` (all in-scope tasks roasted) → `next: brew`
166
+ - `PASS` with remaining unblocked tasks → `next: pick`
167
+ - `FAIL` → `next: pick` with exact failure evidence and current head
168
+ - `BLOCKED` → outer loop classifies retryable environment/external vs human gate
@@ -0,0 +1,201 @@
1
+ ---
2
+ name: 4-brew
3
+ description: "Move a Roast-verified implementation into GitHub review: final checks, branch hygiene, commit/push, PR setup, evidence attachment, confirm product CI on every discovered host (GitHub Actions, CircleCI, Buildkite, and similar), and wait in-process for async review bots (Bugbot, CodeQL) before exit."
4
+ ---
5
+
6
+ # Brew — submit
7
+
8
+ Move one verified implementation into review, wait for async review bots on that head,
9
+ emit current PR/head state, and exit. The outer loop invokes Taste separately. Brew
10
+ records bot outcomes but does not implement fixes.
11
+
12
+ Read the shared [`lifecycle contract`](../../references/lifecycle-contract.md),
13
+ [`documentation contract`](../../references/documentation-contract.md),
14
+ [`PR deployments`](../../references/pr-deployments.md),
15
+ [`product CI`](../../references/product-ci.md),
16
+ [`async review bots`](../../references/async-review-bots.md),
17
+ [`push ownership`](../../references/push-ownership.md),
18
+ [`independent review procedure`](../../references/independent-review.md),
19
+ [`testing plan`](../../references/testing-plan.md),
20
+ [`user guide`](../../references/user-guide.md), and
21
+ [`subagent briefing`](../../references/subagent-briefing.md). All GitHub text
22
+ must follow the [`GitHub attention contract`](../../references/github-attention-contract.md).
23
+
24
+ ## Preconditions
25
+
26
+ - Roast returned `PASS` for every in-scope task on the implementation being submitted.
27
+ - Branch/diff and verification evidence are available.
28
+ - No unresolved human gate remains.
29
+
30
+ ## Inputs
31
+
32
+ - Approved IP/task and Roast result, including the IP's `## E2E tests` and
33
+ `## Regression cases` sections and Roast's per-row results
34
+ - Current branch/head/diff and execution state
35
+ - Verification artifacts/evidence
36
+ - Repository instructions, available supporting skills, and PR template
37
+ - Existing PR title/body when updating (human edits are authoritative)
38
+
39
+ ## Procedure
40
+
41
+ 1. **Reconstruct.** Confirm the branch tree corresponds to the Roast-passed
42
+ implementation. Behavioral changes after Roast return to Roast.
43
+ 2. **Discover supporting skills.** Load applicable submission, documentation, commit,
44
+ changelog, security, and repository verification skills.
45
+ 3. **Run final gates.** Resolve the e2e guide and `Regression suites` directory per the
46
+ testing plan, then gate the IP's two testing-plan sections before the other checks.
47
+ An IP that lacks either section follows the testing-plan legacy rule: warn once and
48
+ skip that section's gate.
49
+ - **Planned specs.** Confirm every `## E2E tests` row has a spec at its path that
50
+ passed: Roast recorded it `PASS` on the tree being submitted, or Brew reruns its
51
+ command green now. Only Brew accepts a `deferred` row, and only when its recorded
52
+ command passed locally in this invocation or in a terminal product-CI run on this
53
+ branch. A deferred row no local runner can reach, whose command a product-CI job
54
+ on a discovered host runs, does not block the push; step 10 settles it. A missing
55
+ spec, a failing row, or a red run of a deferred row's command is `FAIL` with
56
+ `next: pick` that names the row ID. A deferred row whose command neither a local
57
+ runner nor any CI job on a discovered host runs is `BLOCKED` naming the row and
58
+ its command.
59
+ - **Regression cases.** Skip this gate when `Regression suites` is `none` (the
60
+ testing-plan opt-out). Otherwise merge every `## Regression cases` row into
61
+ `<Regression suites>/<area>.md`, finding each file by the `Area:` line its
62
+ `Destination:` prefix names. Create a missing file from the testing-plan suite
63
+ format. Give each provisional `<AREA>-new-<n>` row the next free ID, set `Added`
64
+ to the IP slug, and replace an `E<n>` in `Automated by` with that row's spec path.
65
+ A row with a real ID edits that case in place and keeps its ID and `Added`. Leave
66
+ the IP tables unchanged; record each provisional-to-real ID mapping in execution
67
+ state and the Brew result. On a rerun, find rows already merged from this IP by
68
+ that mapping or, failing that, as rows this branch added to the suite file (diff
69
+ against the merge base) whose `Added` is the IP slug, and update them instead of
70
+ adding duplicates.
71
+ - **User guide.** Unless the repository opts out, confirm every `## User guide` row
72
+ has its page at the row's path in the user-guide page format (or, for `retire`,
73
+ that the page and its index entry are gone), that the guide index lists exactly
74
+ the pages on disk, and that each changed page sets `added` or `updated` to the IP
75
+ slug. A missing page or index mismatch is `FAIL` with `next: pick` that names the
76
+ row ID. An IP that lacks the section follows the user-guide legacy rule.
77
+
78
+ Then execute repository-required pre-submit checks, so suite checks see the merged
79
+ rows. When the root `package.json` defines a `prepush` script, run it in a fresh
80
+ subagent with no parent conversation before the first push. A red local gate is `FAIL`; do not push it. Confirm docs
81
+ follow the documentation contract, generated files are current, changelog/release
82
+ notes exist when required, and verification artifacts are complete. Ship without
83
+ matching docs is `FAIL`.
84
+ 4. **Review independently.** Review the branch on separate standards and IP/spec axes.
85
+ Pass one task-scoped briefing (file list plus patch) to each reviewer; do not let
86
+ each child rediscover the repo. Fix material findings outside Brew via Pick/Roast;
87
+ do not smuggle implementation work into submission.
88
+ 5. **Check hygiene.** Review status/diff; exclude loop-owned execution state, debug output,
89
+ secrets, credentials, customer data, and unrelated files.
90
+ 6. **Commit.** Follow repository commit and DCO/sign-off policy. Preserve the existing
91
+ prohibition on AI attribution. Use behavior-scoped commits, one per roasted task,
92
+ with no bookkeeping-only commits; do not rewrite pushed history unless explicitly
93
+ allowed. Suite rows merged in step 3 are a deliverable, not bookkeeping: commit
94
+ them in one commit per Brew invocation that changes them, named for the cases.
95
+ 7. **Push.** Push once with upstream. Resolve only mechanical conflicts needed to update the PR,
96
+ using repository conflict guidance and rerunning affected checks. A conflict requiring
97
+ a design/behavior choice is `BLOCKED`.
98
+ 8. **Create/update PR.** Apply the GitHub attention contract and any stricter repository
99
+ template. On create, set the title to `[ticket] Short feature title` (Linear
100
+ `TEAM-n` or GitHub `#n`; feature only, no `feat:` / `IP Approved` / `Task list`).
101
+ Initialize `Why` from the IP's original justification and `What changed` from a
102
+ brief overview of the approved IP and intended outcomes. Keep both stable unless
103
+ scope or facts change. Always include reproducible testing instructions in
104
+ `Verification`; update those instructions, evidence, and remaining risks as testing
105
+ changes without rewriting the body around the latest turn. List every regression
106
+ case ID the PR adds or changes in one `Verification` row that links its suite file,
107
+ under `⚠️ Not tested` unless a person walked every listed case on this branch. The
108
+ visible body uses only `Why`, `What changed`, and `Verification`, stays under 250
109
+ words, and puts optional detail plus the stage-result YAML in one expandable
110
+ Details block. Preserve human-edited title/body; make only accurate minimal edits.
111
+ Attach only decisive UI/runtime artifacts without sensitive data.
112
+ 9. **Do not announce.** Do not post a PR comment for creation, readiness, check results,
113
+ or evidence already present in the body. A top-level comment is allowed only for one
114
+ blocking human action that cannot live in an existing review thread.
115
+ 10. **Confirm product CI, then wait for review bots.** Resolve the PR number/URL and
116
+ pushed head SHA. Follow the product-CI procedure: discover every CI host on this
117
+ branch (GitHub Actions, CircleCI, Buildkite, and similar) and confirm each triggered
118
+ or documented a skip for this SHA on every discovered CI host. Then follow the
119
+ async-review-bots procedure: prefer provider CLI watch hooks or harness event
120
+ subscriptions; use bounded sleep/re-fetch only as a fallback. Wait until Bugbot,
121
+ CodeQL, and similar review bots on this head are terminal, never appeared after the
122
+ startup grace, or hit the 20-minute timeout. Do not exit while those bots are queued
123
+ or in progress. Do not wait for ordinary product CI to finish. The one exception
124
+ is a deferred `## E2E tests` row step 3 left for CI: wait for the job that runs
125
+ its command to finish on this head. Green accepts the row; red is `FAIL` with
126
+ `next: pick` naming the row ID.
127
+ 11. **Record and exit.** Update execution state and emit:
128
+ - review-bot timeout → `PENDING` with `next: taste` and `wait`
129
+ - required host untriggered after grace → `FAIL` with `next: brew`
130
+ - otherwise `PASS` with the PR/head, bot outcomes, and `next: taste`
131
+ Collapse per the lifecycle contract. Close the chat with PR deployment URLs when
132
+ the PR has them. Brew itself never executes Taste inline.
133
+ 12. **Hand off.** When an outer loop invoked Brew, exit; the outer loop runs Taste.
134
+ When a human invoked Brew directly and the result is `PASS` or `PENDING` with
135
+ `next: taste`, start the Taste skill as the next stage in standalone entry. Do
136
+ not end the session by telling the human to run Taste later. If the harness cannot
137
+ continue into Taste, escalate per
138
+ [`push ownership`](../../references/push-ownership.md#escalation) instead of ending
139
+ with a pushed PR that nothing watches.
140
+
141
+ ## Supporting skills
142
+
143
+ Follow the shared discovery procedure. Project skills own exact lint/type/test commands,
144
+ documentation generation, changelog rules, commit/DCO policy, PR templates, conflict
145
+ handling, and mandatory evidence gates.
146
+
147
+ ## Evidence produced
148
+
149
+ - Final checks and independent-review outcomes
150
+ - Each `## E2E tests` row with its spec path and the passing run Brew accepted
151
+ - Each regression case written to the suite, with its provisional and real ID and
152
+ suite file
153
+ - Each `## User guide` row with its page path and change
154
+ - Commit and pushed head SHA
155
+ - PR URL/number and preserved template/body state
156
+ - Attached artifact references and sensitive-data check
157
+ - Discovered product-CI hosts and trigger/skip outcome per host
158
+ - Async review-bot names, statuses, and posted findings
159
+ - Updated execution state and structured Brew result
160
+
161
+ ## Success conditions
162
+
163
+ - Verified implementation is committed/pushed and the PR accurately represents it.
164
+ - Every `## E2E tests` row has a spec at its path with a passing run on this branch.
165
+ - Every `## Regression cases` row is in its suite file under a real ID, and the PR
166
+ `Verification` section lists those IDs.
167
+ - Every `## User guide` row's page is written, updated, or retired, and the guide index
168
+ matches the pages on disk.
169
+ - Product CI on every discovered CI host is triggered (or documented skipped) for the
170
+ recorded current head.
171
+ - Async review bots on this head are terminal or did not appear after the startup grace.
172
+ - Emit `PASS` with `next: taste`, then exit.
173
+
174
+ ## Failure conditions
175
+
176
+ Failed final checks, a missing or failing `## E2E tests` row, a missing `## User guide`
177
+ page, including a red CI run of
178
+ a deferred row (`next: pick`, naming the row ID), **Brew's own independent-review findings** (step 4), push errors,
179
+ PR setup errors, or a required CI host still untriggered after grace emit `FAIL` with
180
+ evidence and the smallest corrective stage/action:
181
+ behavioral defects use `next: pick`, stale/missing proof uses `next: roast`,
182
+ and submission-only retries use `next: brew`. Do not treat Bugbot, CodeQL, or similar
183
+ async review-bot findings as Brew `FAIL`; record them and emit `PASS` with
184
+ `next: taste`. Do not fix implementation inside Brew.
185
+
186
+ ## Blocked conditions
187
+
188
+ Missing access, required human approval/decision, unsafe conflict, unavailable mandatory
189
+ submission capability, a deferred `## E2E tests` row nothing can run, or sensitive-data
190
+ risk emits `BLOCKED` with `next: null` and the exact action required.
191
+
192
+ ## Recommended next stage
193
+
194
+ - `PASS` → outer loop invokes a fresh Taste
195
+ - `PENDING` → outer loop waits, then invokes Taste
196
+ - `FAIL` → stage named by evidence (`pick`, `roast`, or `brew`)
197
+ - `BLOCKED` → outer loop routes the named gate
198
+
199
+ For standalone compatibility, a human/runner may invoke Taste immediately after Brew
200
+ returns. Brew itself never executes Taste and does not wait for product CI to finish, except
201
+ for the CI job that settles a deferred `## E2E tests` row.