@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.
- package/.claude-plugin/plugin.json +32 -0
- package/CHANGELOG.md +2213 -0
- package/LICENSE +21 -0
- package/README.md +57 -2
- package/agents/pre-commit.md +65 -0
- package/agents/ui-verifier.md +93 -0
- package/package.json +32 -4
- package/references/async-review-bots.md +76 -0
- package/references/documentation-contract.md +61 -0
- package/references/execution-state.schema.json +77 -0
- package/references/github-attention-contract.md +165 -0
- package/references/independent-review.md +31 -0
- package/references/lifecycle-contract.md +211 -0
- package/references/loop-engineering.md +125 -0
- package/references/pick-roast-loop.md +112 -0
- package/references/pr-deployments.md +69 -0
- package/references/product-ci.md +164 -0
- package/references/push-ownership.md +91 -0
- package/references/stage-result.schema.json +82 -0
- package/references/subagent-briefing.md +43 -0
- package/references/testing-plan.md +163 -0
- package/references/user-guide.md +171 -0
- package/skills/1-grow/SKILL.md +145 -0
- package/skills/1-grow/references/grilling.md +243 -0
- package/skills/2-pick/SKILL.md +170 -0
- package/skills/2-pick/references/mocking.md +34 -0
- package/skills/2-pick/references/testing.md +43 -0
- package/skills/3-roast/SKILL.md +168 -0
- package/skills/4-brew/SKILL.md +201 -0
- package/skills/5-taste/SKILL.md +311 -0
- package/skills/ai-prompt-governance/SKILL.md +100 -0
- package/skills/attach-pr-media/SKILL.md +89 -0
- package/skills/attach-pr-media/scripts/upload-pr-media.sh +151 -0
- package/skills/backend-test-env/SKILL.md +64 -0
- package/skills/backfill-regression/SKILL.md +101 -0
- package/skills/backfill-user-guide/SKILL.md +96 -0
- package/skills/bootstrap-mcp-server/SKILL.md +244 -0
- package/skills/building-admin-interfaces/SKILL.md +86 -0
- package/skills/building-admin-interfaces/agents/openai.yaml +4 -0
- package/skills/building-admin-interfaces/references/nav-and-shell.md +42 -0
- package/skills/building-admin-interfaces/references/patterns-and-tools.md +74 -0
- package/skills/building-admin-interfaces/references/screens-and-routes.md +50 -0
- package/skills/building-terreno-apps/SKILL.md +294 -0
- package/skills/building-terreno-apps/agents/openai.yaml +4 -0
- package/skills/building-terreno-apps/references/navigation.md +108 -0
- package/skills/building-terreno-apps/references/route-structure.md +104 -0
- package/skills/building-terreno-apps/references/screen-patterns.md +174 -0
- package/skills/debug-syncdb-with-mcp/SKILL.md +75 -0
- package/skills/deploy-gcp/SKILL.md +73 -0
- package/skills/deploy-gcp/references/troubleshooting.md +29 -0
- package/skills/generate-release-announcements/SKILL.md +145 -0
- package/skills/generate-sdk/SKILL.md +165 -0
- package/skills/mongoose-schema-safety/SKILL.md +164 -0
- package/skills/pick-roast-loop/SKILL.md +152 -0
- package/skills/planning-loop/SKILL.md +161 -0
- package/skills/prd/SKILL.md +138 -0
- package/skills/set-up-social-login/SKILL.md +76 -0
- package/skills/store-assets/SKILL.md +221 -0
- package/skills/store-assets/examples/screenshots.yaml +31 -0
- package/skills/store-assets/examples/storeAssets.config.json +44 -0
- package/skills/store-assets/scripts/banner.ts +165 -0
- package/skills/store-assets/scripts/config.ts +255 -0
- package/skills/store-assets/scripts/devClient.ts +635 -0
- package/skills/store-assets/scripts/devices.ts +286 -0
- package/skills/store-assets/scripts/icon.ts +81 -0
- package/skills/store-assets/scripts/maestro/goHome.yaml +21 -0
- package/skills/store-assets/scripts/maestro/login.yaml +27 -0
- package/skills/store-assets/scripts/maestro/openApp.yaml +26 -0
- package/skills/store-assets/scripts/screenshots.ts +848 -0
- package/skills/taste-sweep/SKILL.md +172 -0
- package/skills/terreno-backend-api/SKILL.md +355 -0
- package/skills/terreno-backend-api/agents/openai.yaml +4 -0
- package/skills/terreno-backend-api/references/custom-routes.md +132 -0
- package/skills/terreno-backend-api/references/model-router.md +112 -0
- package/skills/terreno-backend-api/references/server-setup.md +116 -0
- package/skills/terreno-backend-tests/SKILL.md +176 -0
- package/skills/terreno-data-fetching/SKILL.md +288 -0
- package/skills/terreno-data-fetching/agents/openai.yaml +4 -0
- package/skills/terreno-data-fetching/references/auth-and-tokens.md +89 -0
- package/skills/terreno-data-fetching/references/realtime.md +50 -0
- package/skills/terreno-data-fetching/references/sdk-customization.md +55 -0
- package/skills/terreno-frontend-tests/SKILL.md +190 -0
- package/skills/terreno-mobile-tests/SKILL.md +127 -0
- package/skills/terreno-test-setup/SKILL.md +81 -0
- package/skills/terreno-test-setup/references/backend.md +131 -0
- package/skills/terreno-test-setup/references/frontend.md +169 -0
- package/skills/terreno-test-setup/references/mobile.md +134 -0
- package/skills/terreno-ui/SKILL.md +252 -0
- package/skills/terreno-ui/agents/openai.yaml +4 -0
- package/skills/terreno-ui/references/data-display.md +87 -0
- package/skills/terreno-ui/references/feedback.md +122 -0
- package/skills/terreno-ui/references/forms.md +119 -0
- package/skills/terreno-ui/references/layout.md +124 -0
- package/skills/terreno-ui/references/theming.md +87 -0
- package/skills/update-docs/SKILL.md +82 -0
- package/skills/upgrading-terreno/SKILL.md +93 -0
- package/skills/upgrading-terreno/references/ordering.md +40 -0
- 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.
|