Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
5412e82
Fix graph-sweep/app-facts catalog guard and per-BRD conformance ledge…
claude Oct 13, 2026
4a60e14
fix(lint-gate): reverted-to-stock rules stop the run as BLIND, not a …
claude Oct 13, 2026
39e4466
Merge origin/master into fix/lint-receipt-check
claude Oct 13, 2026
faf196e
e2e: read OQL rows by alias; liveness for negative-only span claims; …
claude Oct 13, 2026
8885d01
Lint Batch 4: SEC014 external-role writes, CONV009 reads maxObjects (…
claude Oct 13, 2026
b5731a4
e2e: validator accepts negative-only span claims; empty spans block i…
claude Oct 13, 2026
cd187a4
feat(doctor, sync-project): wire mxcli fix property-sets into the upg…
claude Oct 13, 2026
fc966d7
e2e: rewrite example.journey.json into the shape the runner reads
claude Oct 13, 2026
dc95126
chore(context): free baseline word budget without dropping rules
claude Oct 13, 2026
f5ba690
Merge remote-tracking branch 'origin/master' into chore/baseline-word…
claude Oct 13, 2026
982e4e3
process(merging): independent review before every merge
claude Oct 13, 2026
8800dcb
process(context): word budget is made room for by moving, never deleting
claude Oct 13, 2026
1729259
Merge remote-tracking branch 'origin/master' into fix/lint-receipt-check
claude Oct 13, 2026
a8df6ad
Merge origin/master into fix/graph-sweep-conformance
claude Oct 13, 2026
4110b92
e2e: review fixes — liveness window, stale otel.js guard, old spans s…
claude Oct 13, 2026
e02d5f9
Merge origin/master into fix/e2e-oql-rows
claude Oct 13, 2026
7f73f8d
docs(journey-examples): rule count 19, without rewriting the example-…
claude Oct 13, 2026
76075d8
fix(trim): review follow-ups — dispatch obligation pointer, stale "be…
claude Oct 13, 2026
18c9a61
fix(lint-rules): the remedy lint-gate prints always clears it; delibe…
claude Oct 13, 2026
d55a4d4
Add interaction-model skill: role homes, inboxes, page-parameter cont…
claude Oct 13, 2026
50e69d0
Judge each PROOF-OF-LOOK by its own section's VALID AT; newest stamp …
claude Oct 13, 2026
7168174
process: review-rule fixes from its own independent review
claude Oct 13, 2026
cc56d9b
journeys: #302 follow-up — accept a project-set password, SIGINT find…
claude Oct 13, 2026
5432345
fix(lint-gate): a Starlark rule installed after the baseline is FIRST…
claude Oct 13, 2026
8c0b176
final-look: PROOF-OF-LOOK + VALID AT required; project/cluster rows N…
claude Oct 13, 2026
944fce9
page-fidelity: match text on what the page shows; ButtonStyle classes…
claude Oct 13, 2026
aaa9890
Merge remote-tracking branch 'origin/chore/baseline-word-trim' into f…
claude Oct 13, 2026
ed4efbb
fix(exec): follow-ups from independent review of #304/#306/#290
claude Oct 13, 2026
cd67a7c
chore(trim): correct the measured word counts in the CHANGELOG line
claude Oct 13, 2026
234e06d
process: second review round on the merge-review rule
claude Oct 13, 2026
50e56e4
fix: follow-ups to #290 and #292 (subject-set wording, re-run contrad…
claude Oct 13, 2026
2f0907a
Merge remote-tracking branch 'origin/chore/baseline-word-trim' into f…
claude Oct 13, 2026
e4a5f3e
fix(changelog): drop the pre-correction #315 line the merge duplicated
claude Oct 13, 2026
51fdb3f
interaction-model: review fixes — ba routed, one Page parameter forma…
claude Oct 13, 2026
58fda4d
test-stack-up: runtime command-line ownership proof, own runtime is n…
claude Oct 13, 2026
456fe73
Revert FIRST-SEEN (5432345): unsafe as built, redesign in a separate PR
claude Oct 13, 2026
333d435
Guard against a leftover mxcli test injection; verify app-restart's p…
claude Oct 13, 2026
59e7c16
Address review on #307: no-call models sweep, per-BRD reuse, stack ex…
claude Oct 13, 2026
0ca1dbd
process: third review round on the merge-review rule (verbatim fixes)
claude Oct 13, 2026
171ee77
Merge #315: chore(context) free baseline word budget without dropping…
claude Oct 13, 2026
978ecbf
Merge #316: process — independent review before every merge; move-don…
claude Oct 13, 2026
e3e6c27
Lint Batch 4 review: SEC014 unset is a sync warning, not PASS-BLIND o…
claude Oct 13, 2026
07b9ca6
Merge origin/master; review fixes for property-sets (#295)
claude Oct 13, 2026
c782129
Promote 2026-09-29 inbox notes: exec.sh refusal rule, UI fix rounds, …
claude Oct 13, 2026
ba461e5
report: honour aborted findings; setup kind in the schema; drop dead …
claude Oct 13, 2026
df19a4e
page-fidelity: review fixes — multi-line ALTER set, plural fold, re-s…
claude Oct 13, 2026
afd7482
status: delivery rounds in existing-app mode, manual-step template, n…
claude Oct 13, 2026
9b73def
Review of #321: NOT YET DUE for final-look only and only on the deriv…
claude Oct 13, 2026
7f6246d
Merge #318: page-fidelity scorer matches displayed text (closes #158,…
claude Oct 13, 2026
b5b73e4
fix(lint-rules): re-seed check scoped to stock-seeded rules; opt-out …
claude Oct 13, 2026
56d5530
revert(detection-gaps): restore the intro tightened to fit the budget
claude Oct 13, 2026
232883a
Merge origin/chore/baseline-word-trim (#315) into feat/adopt-mxcli-02…
claude Oct 13, 2026
ec90cf3
Merge #317: interaction-model skill for Stage 3 (refs #291, part 1 of 3)
claude Oct 13, 2026
cd792f6
Merge origin/master into feat/lint-batch4-security
claude Oct 13, 2026
dac33df
test-scratch: take over the shared exec lock with exec.sh's exact pro…
claude Oct 13, 2026
0f1c512
docs(ui-loop): name the third watch-compat verdict (unknown)
claude Oct 13, 2026
1fd5b14
test-stack-up: PR #319 review fixes — whole-path deployment match, bo…
claude Oct 13, 2026
128f69b
Extraction report reads extraction-quality*.json (#151); token-burn c…
claude Oct 13, 2026
57bf81b
report: read per-BRD conformance reports (report-<date>-<BRD>.tsv)
claude Oct 13, 2026
8fc7c6a
Address re-review on #307: directory ledgers, log field, warning fixture
claude Oct 13, 2026
7ff741a
Merge #321: PROOF-OF-LOOK per section; final-look not due before deri…
claude Oct 13, 2026
34cd4ec
fix(lint-rules): one opt-out syntax, override never baselines, capped…
claude Oct 13, 2026
add6953
Merge origin/chore/baseline-word-trim (#315) — must land first
claude Oct 13, 2026
dffaf6f
Merge #307: graph-sweep/app-facts edge guard; per-BRD conformance led…
claude Oct 13, 2026
2d9d6b8
Review fixes for #323: coverage check, lock refuses, PRE-EXISTING row…
claude Oct 13, 2026
a1af5be
fix: follow-ups to #306 (baseline cost, CRLF, gate wording)
claude Oct 13, 2026
1a73996
Review fixes: missing score file is manual; usage max per message id
claude Oct 13, 2026
84dc6b6
report: per-BRD conformance — any suffix, BRD-prefixed pointers, capt…
claude Oct 13, 2026
530b217
fix(routing): pipefail + grep -q false negatives (CI flake)
claude Oct 13, 2026
687c974
docs: extraction-quality wording matches MANUAL-when-absent; token-bu…
claude Oct 13, 2026
a349411
Merge #325: extraction-quality section; token-burn rates/windows/effo…
claude Oct 13, 2026
2672811
fix: review follow-ups on #320 — restore failure examples, intake Q13…
claude Oct 13, 2026
a5235d6
Merge #310: OQL rows by alias; liveness for negative-only spans; APP-…
claude Oct 13, 2026
a09109b
test-stack-up: --track normalises the pid (01 no longer bypasses the …
claude Oct 13, 2026
5bf8048
learn(build-loop): kept writes and PARTIAL rows in the refusal and ph…
claude Oct 13, 2026
7ad0074
Merge #323: inbox promotions — exec refusal table, UI fix rounds, mea…
claude Oct 13, 2026
61077b2
Merge #308: lint gate reads the install receipt — reverted stock rule…
claude Oct 13, 2026
ab21867
mxtest guard: review fixes — pipefail-safe reader, all candidate unit…
claude Oct 13, 2026
b6b8d10
fix: review follow-ups on #327 (owners single source, pointers, core …
claude Oct 13, 2026
4785a8c
test-scratch take_over: -mmin +1 and own-file-only removal (in step w…
claude Oct 13, 2026
d696b5b
Lint Batch 4 review: SEC014 notice is a sync NOTE, not a counted warning
claude Oct 13, 2026
2fa6883
status: review fixes for #326 (final-look filter, keep done-, Rounds …
claude Oct 13, 2026
a971ed2
Merge #328: fix(routing) pipefail + grep -q false negatives (CI flake)
claude Oct 13, 2026
d7804c5
fix(doctor, sync-project): property-set check errors get their own ex…
claude Oct 13, 2026
79de404
fix(exec): fresh empty takeover file is not stale (-mmin +1); align w…
claude Oct 13, 2026
1cb70ad
fixture: re-copy exec.sh lock block from #324 @ 79de404
claude Oct 13, 2026
5d92f20
Merge #319: test-stack-up verifies run --local by its command line; s…
claude Oct 13, 2026
047e574
Merge #327: change-intake core cut to a baseline core + on-demand det…
claude Oct 13, 2026
473a4d8
Merge #320: follow-ups to #290/#292 — subject-set wording, re-run con…
claude Oct 13, 2026
4168c69
Merge #308 (lint receipt + opt-out) into Lint Batch 4; one opt-out st…
claude Oct 13, 2026
22d6f7e
test(status): T9a holds before and after #321 NOT YET DUE
claude Oct 13, 2026
da6f693
Merge #326: status — delivery rounds in existing-app mode, manual Stu…
claude Oct 13, 2026
1877264
Merge #312: lint batch 4 — SEC014 external-role writes, toolkit CONV0…
claude Oct 13, 2026
90a6957
fix(exec): show lint-gate's SEC014 note on a clean run
claude Oct 13, 2026
7624f79
Merge #324: exec.sh change classes — restart needed / unknown / neutr…
claude Oct 13, 2026
1f84025
Merge #322: app-restart / test-scratch refuse to restart over a live …
claude Oct 13, 2026
a34211e
Merge #314: fix(doctor, sync-project): property-set check errors get …
claude Oct 13, 2026
2827a6d
test(run-all): resolve fixture subjects under bin/lib/
claude Oct 13, 2026
a8ddf1d
Merge #328 follow-up: run-all resolves fixture subjects under bin/lib/
claude Oct 13, 2026
40814fc
fix: review follow-ups for the 2026-10-14 integration batch (#330)
MendixMau Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,5 @@ jobs:
run: bash tests/lint-rules/test-batch2-rules.sh
- name: Lint-rule unit suite, batch 3 (tests/lint-rules/test-batch3-rules.sh)
run: bash tests/lint-rules/test-batch3-rules.sh
- name: Lint-rule unit suite, batch 4 (tests/lint-rules/test-batch4-rules.sh)
run: bash tests/lint-rules/test-batch4-rules.sh
39 changes: 39 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

75 changes: 73 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,72 @@ checkpoint script, and an expert user's reaction was "I can't even compact?":
7. **A guard must never block the action that resolves it.** Blocking the remedy is
perverse: warn once, then let it through.

## Merging a PR — independent review before every merge

**A merge go from the maintainer is not a review.** Before any PR merges, an agent that did
**not** write it reviews the diff and returns a verdict. The builder's own report and green CI
never count: the builder grades its own work, and CI proves only the tests the builder wrote.

1. **Who reviews, and with what.** A fresh agent given the PR diff, the linked issues and the PR
body's description of *what* changed — never the builder's verdict, risk assessment or "all
checks pass" claims. One reviewer per PR, plus one composition check when several PRs in a
batch touch the same files. The reviewer may run the fixtures the PR adds or that target its
changed files, in a detached worktree — that is part of the review the maintainer asked for, not
a free-standing test run (see "Testing this toolkit").
2. **What it answers, each with file:line.** *Value*: does it fix the issue as reported, and is
anything overbuilt? *Regression risk*: what changes for an existing project after
`sync-project.sh` (new FAIL / BLIND / refusals, exit codes, output another tool parses, gate
verdicts that flip), across both layouts and macOS / Git Bash? *Correctness*: real bugs, tests
that do not test what they claim, hand-written golden input where a capture was required.
*Context cost*: words added to always-loaded skill files — re-measured by the reviewer, not taken
from the PR body.
3. **Verdict.** `MERGE`, `MERGE-AFTER-FIX` (exact fixes listed; the fixes are pushed and
re-reviewed before merge) or `HOLD` (goes back to the maintainer with the reason). Only `MERGE`
merges.
4. **Record the verdict durably.** The squash commit body carries a line
`Review: MERGE — <one-line top finding or "no findings">`, and the merge announcement repeats it
next to CI. A merge with no `Review:` line was not reviewed.
5. **No exceptions for size.** A one-line fix, a docs-only PR and an outside contributor's PR all
get the same review. "Small", "only skill text" and "CI is green" are how the exceptions start.
The one exception is guard rule 7's: a fix whose only purpose is to unblock master (a broken CI
check, a leak guard that blocks every commit) may merge first, with its review within 24 hours
and a `Review: PENDING (unblock)` line; the follow-up verdict is recorded as a comment on the
merged PR (and a follow-up fix PR if it finds anything), since a squash commit cannot be edited.

**Why (real incident, 2026-10-13).** Nine PRs merged in one day on the builders' own reports and
green CI, each carrying its builder's "all checks pass". When the maintainer asked whether value
and regression risk had been checked, the honest answer was no: nobody who had not written the
code had read it. The after-the-fact reviews found, among others, a journey preflight that made
every synced project's journey rung FAULT, and an exec lock that let three writers in at once. The same day showed the cost of unread diffs in another form — the always-loaded
skill text hit its 80,000-word cap because each PR added words that nobody outside the PR weighed.

## Always-loaded skill text — the word budget

`bin/render-routing.sh --check` caps the always-loaded (baseline) skill set at
`MXTK_BASELINE_BUDGET_WORDS` — a ratchet, explained in that script's header: lowered as text moves
out, never raised to admit growth. Room is made by **moving** text, never by deleting the text
that does the work.

1. **Protected — never removed to make room:** rules, STOP rows, denominators / completion
criteria, and the one-line failure example each rule is paired with. Removing one needs its own
PR that argues the rule itself is obsolete, with an independent review.
2. **Movable:** incident narratives, worked examples, tables of past numbers, and a rule stated a
second time in another baseline file. Each moves to an on-demand file and leaves a one-line
pointer (path) at the same spot. A move keeps the text; nothing is lost.
3. **Every PR that adds baseline words** states the before/after count from
`render-routing.sh --check` in its body, and why each addition is needed at the trigger moment.
The independent reviewer checks that (see "Merging a PR").
4. **At the cap, a feature PR never squeezes other text to fit.** Room comes from a separate trim
PR that only moves movable text; its reviewer compares removed against moved line by line, and
any protected line that disappeared is a HOLD.
5. **Trim before the cap, not at it:** when a PR would take the baseline (measured after the PR)
within 2,000 words of the budget, a trim PR lands first. A trim PR does not lower the ratchet by
itself; lowering it is a separate one-line change once the trimmed total has held for a release.

**Why (2026-10-13).** One feature PR pushed the baseline to 80,466 words against the 80,000 budget
while six other open PRs each added words; to fit, it merged two sentences in a testing skill and
landed at 79,997. That one was harmless, but nothing stopped the next one from cutting a STOP row.

## Changelog and contributions

**Every user-visible change appends its `CHANGELOG.md` line in the same commit.** That is the
Expand All @@ -172,7 +238,7 @@ and tag every few days — the release cycle is defined at the top of `CHANGELOG

Contributions arrive through three lanes (`CONTRIBUTING.md`): the `contrib/inbox/` drop
(no quality bar — triage promotes into `skills/`/`bug-logs/`/`bin/` and deletes the inbox file
in the same commit; inbox files are unreviewed and nothing may cite them),
in the same commit; inbox files are unreviewed — their content is not vetted for promotion — and nothing may cite them; a PR that adds one still gets the merge review below),
`bin/harvest-learnings.sh <project-root>` (drafts inbox files from a project's bug logs,
register promotion tables, and locally-patched installed scripts — run it at project wrap-up),
and direct PRs held to the full field-proof bar. CI (`.github/workflows/checks.yml`) runs
Expand Down Expand Up @@ -277,7 +343,12 @@ to. Wide blast radius is a reason to pick the right *scoped* check, not to run e
`bin/lib/skill-routing.tsv` and its re-render (README.md, ROUTING.md, every agent template, and
`gate-check.sh`'s stage map at once) that check is `bin/render-routing.sh --check`.

**Asking is also required for a single fixture** — name it, say what it will tell us, and wait.
**One standing exception: the independent reviewer of a PR** (see "Merging a PR") may run the
fixtures the PR adds or that target its changed files, without asking, in a detached worktree of
the PR branch. That isolation is what avoids the shared-tree problem above; the reviewer still
never runs the full suites.

**Outside that reviewer exception, asking is also required for a single fixture** — name it, say what it will tell us, and wait.

Where a fixture's assertions are greps over a file you changed, prefer verifying by inspection:
read the fixture, replicate its greps against the changed file, and report that. Same signal, no
Expand Down
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,7 @@ Every mxcli project has a `.ai-context/skills/` directory (bundled by `mxcli ini

| Task | Skill to load |
|---|---|
| Applying or proving a change request (CR row), a change whose class, size or status is unclear, or a "Change log:" gate line to explain: full class/size/ask tables, the wrong-vs-right example, apply and prove steps, the owners table and what the warn-only gate check counts | `skills/change-intake-detail.md` |
| Deep, adaptive interview on one topic, on demand, when a checkpoint's 2+1 or a single question batch isn't enough | `skills/grill-mode.md` |
| CAC-1, closing Stage 0 in EVERY entry mode — scope IN: full scope or a slice, and in what order. Opens with a brainstorm, not options | `skills/checkpoints/checkpoint-scope.md` |
| CAC-1b, after Stage 1 — scope OUT: is what extraction produced what you meant. No gate stops you; run it late against the BRDs if it was skipped | `skills/checkpoints/checkpoint-extraction.md` |
Expand All @@ -525,7 +526,7 @@ Every mxcli project has a `.ai-context/skills/` directory (bundled by `mxcli ini
| Changing an EXISTING Mendix app — adding a feature, altering a flow, restructuring a module — when it has no BRDs, no architecture doc and no wireframes: the knowledge base comes from the live model (Path D), stages 2–4 run over what changes plus what it touches, nothing more, and the Track B regression baseline is the precondition; audit-only stays in existing-app-assurance | `skills/existing-app-change.md` |
| Setting up or wiring a COMPANY BRAIN — the private tier between the toolkit and a project for own skills, conventions, lint rules, MDL snippets and approved MPKs; and deciding whether something goes to the toolkit, the company brain or docs/brain/ | `skills/company-brain.md` |
| Cutover and retrospective — promoting proven patterns back into the toolkit | `skills/close-the-loop.md` |
| Before citing ANY behavioural claim about the harness, the Mendix runtime or a test tool as evidence — a claim not in the register may not be cited | `skills/measured-claims.md` |
| Before citing ANY behavioural claim about the harness, the Mendix runtime or a test tool as evidence, or counting tokens from transcripts — a claim not in the register may not be cited | `skills/measured-claims.md` |
| Any review pass that runs more than once — module-review, coherence, monkey, wiring-sweep: findings accumulate across runs, a per-run report cannot show a trend | `skills/improvement-register.md` |

**Source — reading a legacy system (migration entry mode)**
Expand Down Expand Up @@ -580,14 +581,15 @@ Every mxcli project has a `.ai-context/skills/` directory (bundled by `mxcli ini
| After every wireframe edit: assembles design/wireframes/*.html into design/prototype.html, one hash-routed page a stakeholder can click through instead of twenty separate files. Generated, never edited (design-artifacts.md Step 3) | `project-bin/assemble-prototype.js` |
| Before wireframes pass to the build loop, and with --brd before a BRD is signed off: dead #/route links, orphan screens, controls with no data-bind and no data-cut, BRD routes no screen has, screens no use case walks (design-artifacts.md Step 3c, brd-validation.md check 8) | `project-bin/check-prototype-links.js` |
| Designing the brand and ONE ANNOTATED WIREFRAME PER SCREEN before building pages — the design system alone is half the deliverable | `skills/design-artifacts.md` |
| Stage 3, after the role model is CONFIRMED and BEFORE THE FIRST WIREFRAME — and any time a page shows ONE object, a menu item or home page is added, or a data source retrieves the current/first record: role homes, inboxes, and per page how it is reached and which object it takes as parameter | `skills/interaction-model.md` |
| Before a wireframe or a design commits to a WIDGET, when a requirement shows a widget to one role and not another, and when a page script hits a parse error that looks like a syntax mistake: the short list of things MDL cannot write at all, and the four-minute probe that answers it at Stage 3 instead of at build time | `skills/learned-mdl-cannot-express.md` |

**Build — the loop itself**

| Task | Skill to load |
|---|---|
| Dispatching a build step to a helper — generate its one-file pack (the brief's Build steps row, mxcli brain brief, live DESCRIBEs, example, folder) and hand over the path instead of a reading list. Measured: 25-38% fewer tool calls and 30-41% less time, same quality; the token saving is not proven | `project-bin/context-pack.sh` |
| Building a module with mxcli — verified, iterative, coverage-checklist gated | `skills/iterative-build-loop.md` |
| An exec.sh guard refused a write (not a permission prompt), or building a module with mxcli — verified, iterative, coverage-checklist gated; on a refusal: commit, wait or stop, never FORCE_EXEC | `skills/iterative-build-loop.md` |
| After marking a module done, or any time "how much is built vs proven" is asked — renders build-plan.html from done- prefixes and verify-module.sh/improvement-register.md, kept as two honestly separate views; --json writes architecture/build-plan.json parsed from build-plan.md's Phase headings (a plan with no Phase headings gets no file) | `project-bin/build-plan-status.sh` |
| Turning a client-derived Mendix app into a clean, shareable demo with zero client fingerprint — branding, data, custom widgets | `skills/anonymize-client-app-for-demo.md` |
| Handing a headless-built model to a person — opening it in Studio Pro, a free sandbox, or a colleague's machine: the model travels, the demo data and runtime config (keys, an agent's bound model) do not, and each needs its own re-establish step | `skills/handoff-to-studio-pro.md` |
Expand All @@ -610,7 +612,7 @@ Every mxcli project has a `.ai-context/skills/` directory (bundled by `mxcli ini

| Task | Skill to load |
|---|---|
| Building and auditing Mendix pages — widget patterns, datasource shapes | `skills/learned-page-patterns.md` |
| Building and auditing Mendix pages, or starting a UI fix round across many pages — widget patterns, datasource shapes; for a round: SCSS first, four regressions to check | `skills/learned-page-patterns.md` |
| Generating a whole page tree in one script — the structure patterns that survive it | `skills/oneshot-page-structure-patterns.md` |
| Building or auditing a collapsible sidebar nav — Atlas Core's collapsed state needs icons assigned per menu item or it silently clips label text | `skills/learned-sidebar-collapse-icons.md` |
| Building or altering any data grid — native DATAGRID vs pluggable DG2 decision rule, the ALTER PAGE INSERT corruption, sort-by and filter-binding traps | `skills/learned-dg2-patterns.md` |
Expand Down Expand Up @@ -764,7 +766,8 @@ Then filter by Role(s). A helper dispatched with a role stub (ba, architect, mdl
| Putting a question TO the user — any gate, any stage: ask in chat not in a file, two named options plus your recommendation, one batch per gate then end the turn | `skills/interview-protocol.md` | P,0,1,2,3,4,5,6,7 | lead, ba, architect |
| The user gives feedback or asks for a change mid-project — "change X", "it also needs Y", a remark on a screenshot or the running app, a stakeholder's ask relayed in chat: log a CR row in PROJECT.md ## Change log BEFORE any edit, size it, then edit the highest artifact it alters (BRD, decision, architecture, wireframe), never the MDL first | `skills/change-intake.md` | 2,3,4,5,6,7 | lead, ba |
| Any stage transition — the 2+1 format every CAC uses, and the one-register rule (answers land in PROJECT.md, never in a separate state file). The seven CACs themselves are routed per stage in the situational table | `skills/checkpoints/checkpoint-template.md` | 0,1,2,3,4,6,7 | lead, ba, architect |
| Starting a subagent, sending it a fix round, or reading an agent-stop notice; or setting up the project's subagents — read its Dispatching section per dispatch, the rest once at setup | `skills/agent-roles.md` | P,1,2,3,4,5,6 | lead |
| Setting up or completing a project's dev-process subagents — once, at project start, not "on demand" | `skills/agent-roles.md` | P,4,5 | lead |
| Starting a subagent, sending it a fix round, or reading an agent-stop notice — name the model, fresh not fork, fresh fixer not resume, coalesce notices | `skills/dispatching.md` | P,1,2,3,4,5,6 | lead |
| Deciding whether to extract at all, before any BRD gets generated | `skills/source-triage.md` | 0 | ba |
| Taking in a new source — before generating anything from it. Grades what the source can support; nothing else in this toolkit reads a source | `bin/source-sufficiency.sh` | 0,1 | ba |
| Closing Stage 1, or adding files to a source folder — every inventoried file must name the artifact that consumed it (text AND embedded diagrams), or carry a waiver; blocks Stages 1–2 until it does | `bin/source-ledger.sh` | 0,1,2 | ba |
Expand Down
Loading
Loading