Repository navigation
integration 2026-10-14: nineteen independently reviewed PRs combined for one merge - #329
Merged
Merged
Conversation
…rs (#259, #260) graph-sweep.sh and app-facts.sh refused any catalog whose build_mode label was not 'full'; mxcli v0.24+ writes 'source' for a complete catalog. Both now check what they read: a non-empty refs table with at least one RefKind='call' edge, and FAULT naming the mode and per-kind edge counts otherwise. conformance-check.sh read only <Module>/coverage-ledger.md, which is an index in the per-BRD layout. It now measures every <Module>/coverage-ledger/*.md, writes one report per BRD, keys baseline pointers by BRD, documents LEDGER_FILE (file or directory), FAULTs on a missing LEDGER_FILE, and names an index as an index with the files its rows are in. Fixtures (both layouts, fail on master's scripts): tests/wave2/test-catalog-call-edges.sh (12 checks, 10 fail on master), tests/wave2/test-conformance-per-brd-ledger.sh (17 checks, 17 fail on master). Synthetic catalogs/ledgers; field runs on a v0.24 / per-BRD project are owed. Reported by AlvinnYeo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…rise (#264); BUG-156 + preflight row 28 (#263) #264: `mxcli init` re-seeds .claude/lint-rules/ and the toolkit rules lose their header. lint-gate.sh never read .claude/.mxtk-lint-receipt, so the re-seed showed up as a rise on the next exec (CONV010 26 -> 169 on a pages-only script), or sat for days while the baseline absorbed stock counts. - project-bin/lint-gate.sh: before linting, each rule in the receipt is md5'd; a mismatch with the header gone (or a missing file) is named, the remedy `<toolkit>/bin/sync-project.sh <project>` is printed, and the run exits 1 with `BLIND — lint rules reverted to stock`. lint-last.json gets verdict BLIND-RULES-REVERTED and no total (no stale total for metrics-ledger). --update-baseline is refused over reverted rules. A headered edit is left to the installer's LOCALLY MODIFIED report; no receipt means no check; LINT_RULES_REVERTED_OK=1 lints anyway, with the warning. - project-bin/exec.sh: run_lint_gate maps that output to LINT_RC 3 / "LINT BLIND: rules reverted to stock (<files>) — run sync-project.sh; delta not attributable". - Guard rules: the receipt is the installer's evidence, not lint-gate's own stamp (rule 6); the remedy (sync-project.sh / the installer) is never blocked and clears it — fixture T6 (rule 7). - tests/wave2/test-lint-receipt-revert.sh: golden receipt from the real installer run into a scratch project; 23/23 here, 11 fail with master's lint-gate.sh. #263 (learned-rule half): BUG-156 in bug-logs/mxcli-bugs.md (bin/bug-lookup.sh BUG-156 and "free room" find it) and STOP row 28 in skills/learned-mdl-preflight.md, quoting the issue's exec error verbatim. Upstream draft prepared, not filed. Field run: the receipt/installer half was field-checked by the maintainer on a copy of a v0.25.0 project (#264 comment: installer restores conv010/data_change, md5s then match the toolkit). lint-gate's new check has not yet run on a live project — fixture only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…APP-DOWN between journeys #154: helpers.js built OQL rows with Object.values(r) and oqlScalar read rows[0][0]. mxcli v0.26.0 prints keys alphabetically, omits an all-null column and, over a view entity, adds ID beside the alias, so columns shifted and a view's count read as its ID. The brace counter ignored strings, so a value holding ] or } returned null. Rows are now keyed by the parsed SELECT aliases (SELECT order, explicit nulls), oqlScalar reads the first alias, new oqlRows, string-aware slicing. Golden: the released v0.26.0 binary's verbatim output against a stub admin API (tests/wave2/fixtures/oql-json/); test-oql-rows.sh 15/15, 0/15 on master. #150 remainder: a mustNotFire-only step with zero spans was INVALID on every run. Rung 2 (now traceRung) waits the full window and requires a declared spans.liveness span or any service span since the journey began (otel.js liveness) before judging; the trace-negative mutant injects the forbidden name after that check. #285 harness half: probe baseUrl before each journey (APP-DOWN, not walked) and after each (flag its FAIL rows). APP_PROBE=0 disables. test-journey-liveness.sh 27/27 over the captured Jaeger trace. No live-app field run yet. Closes #154 Refs #150 #285 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…268, #267) SEC014 (warning, security tier): an external user role, named in lint-config.yaml as `external_roles: "A, B"` (or "none"), that can write all members, a state enumeration, an audit ...At/...By attribute, or the association its own XPath scopes ownership on. A `_rule` finding when the option is unset, given as a YAML list (mxcli passes it as None), names a role that does not exist, or the catalog is not FULL. CONV009: toolkit-owned copy of the stock rule, which hard-codes 15 and ignores the maxObjects option its own generated config advertises. Reads maxObjects (default kept at 15) and countLoopBodies; replaces the stock file through STOCK-HASHES.txt (conv009 at v0.17.0/0.24.0/0.25.0 plus a full v0.26.0 set, captured with `mxcli init` from the official release assets; test-stock-hashes.sh T4 passes live on all four). Harness: get_option, permissions_for, attributes_for, user_roles, role_mappings mocks. 26 cases in tests/lint-rules/test-batch4-rules.sh. Field run (official mxcli 0.26.0, scratch copies of two models): stock CONV009 5 -> 5 with maxObjects: 20; toolkit CONV009 5 / 10 / 6 at 15 / 10 / 20+loops. SEC014 1 finding with the external role configured, 7 with every role configured, matched by a SQL replay of the catalog. Both rules also load on mxcli 0.17.0 and 0.24.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…s a loud INVALID #150 item 3: a spans block declaring neither ordered nor mustNotFire (e.g. the array shape [{mf,status}]) is now recorded INVALID by traceRung instead of being skipped silently. examples/validate-journeys.js rejected a mustNotFire-only claim as "NEVER checked", which contradicted the runner since the liveness change. It now accepts it, validates the new spans.liveness field (read only for a negative-only claim) and rejects a mustNotFire that is not a regex; selftest 19 rules red, 3 clean cases green. skills/journey-examples.md documents the liveness rule and the INVALID for an empty spans block. Fixtures: test-validate-journeys-spans.sh 12/12 (8 fail on master's validator); test-journey-liveness.sh 30/30. Closes #150 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…rade path, report first; name a pre-fix model-stamp.sh #295. mxcli up to v0.25 wrote units without Studio Pro's full property set. mx check, the build and the runtime stay green, and Studio Pro's merge/diff throws once it has saved such a document. No gate saw it. - bin/doctor.sh --property-sets <dir>: read-only `mxcli fix property-sets --dry-run`, result plus mxcli version in .claude/.property-sets-receipt (gitignored). Exit 0 clean / 1 needs or unclassified / 2 not run / 3 mxcli < v0.26.0. --if-stale skips when already run for this mxcli. - bin/doctor.sh --fix-property-sets <dir>: the repair, only through bin/exec.sh --patch (snapshot, mxbuild gate, restore); refused on an exec.sh without --patch. doctor.sh is its own patch script. - doctor --quick (run by exec.sh when the mxcli version changes) warns while the check is owed; a full doctor runs it. - sync-project.sh runs the check with --if-stale (never the repair). - Support is read from `mxcli fix --help`: `fix property-sets --help` exits 0 on v0.24/v0.25 too (cobra prints the parent's help). - learned-detection-gaps.md row; platform-link.md "Before a Team Server merge" (fix property-sets, fix hashes, git note). #236 remainder: known_fix_note gains the model-stamp.sh arm keyed on GIT_WORK_TREE (patch 0004); test-model-stamp.sh T9 adds the unstaged worktree `commit -a` and `commit -- app` cases. Golden input: `--version`, `fix --help`, `fix property-sets --help` and a not-found dry-run, captured from the official v0.24.0/v0.25.0/v0.26.0 linux-amd64 release binaries (never run against a model). The clean / NEEDS / FAILED reports follow mxcli v0.26.0's source format strings. tests/wave2/test-property-sets.sh: 43 passed here, 26 fail on master's doctor.sh/sync-project.sh. Field run on a real model still owed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
The shipped example had drifted from journey-runner.js: name/role instead
of id/persona, a `value` seed instead of `sql`, page/expectPage/
expectText/click instead of actions + ui.ready/textPresent, spans as an
array of {mf,status} (now a loud INVALID), and SQL-style
<module>$<entity> queries where the runner sends OQL. validate-journeys.js
reported 3 problems on it; now 0. All 7 positive-control mutants are
supported on it; journey-runner.selftest.js (which falls back to it) and
test-journey-preflight.sh (back-compat cases) pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
The always-on baseline tier counted by bin/render-routing.sh --check was at 79,735 of its 80,000-word cap. This frees 3,772 words (now 75,964) by moving narrative and setup-only text out of baseline files, keeping every rule, STOP, denominator and gate cell in place, each rule still paired with a one-line failure example plus a pointer to the full text. - conversion-runbook.md, source-triage.md, interview-protocol.md: long incident narratives -> one line + pointer; originals verbatim in new on-demand process/baseline-incident-history.md (R1-R20, AR1, ST1-ST4, IP1-IP3). Runbook's duplicate open-questions status table now defers to interview-protocol.md section 4. - agent-roles.md: the six template shapes (setup-only) moved to agents/README.md, which installers never copy (explicit MXTK_AGENTS). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
A merge go is not a review. Before any PR merges, an agent that did not write it reviews the diff and returns MERGE / MERGE-AFTER-FIX / HOLD on value, regression risk after sync, correctness and context cost. Builder self-reports and green CI no longer count. Why: nine PRs merged on 2026-10-13 on builder reports and CI alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Rules, STOP rows, denominators and failure examples are protected. Stories and examples move behind pointers in a separate, independently reviewed trim PR; trim starts at 95% of the cap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…hape named
- journey-runner.js: the negative-only liveness window starts at this
journey's own start (LIVENESS_SKEW_MS = 2 s clock-skew margin), not 30 s
earlier where the previous journey's spans counted.
- A project otel.js older than the runner (hand-edited, kept by sync)
has no liveness(): the step reads INVALID naming the stale otel.js
instead of a TypeError.
- spans as an array (old example shape) or {} gets an INVALID that names
the shape; validate-journeys.js names the array shape too.
- Comment cited a non-existent fixture; "first cell" wording -> "first
SELECT alias" (journey-examples.md, validate-journeys.js,
full.journey.json); "16 rules" -> 19.
- CHANGELOG: callout that oqlScalar now returns the first SELECT alias.
Fixtures: test-journey-liveness.sh 36/36 (cases for the skew window, the
stale otel.js and the named shapes), test-validate-journeys-spans.sh 12/12.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…domain line Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…low", ST1 id Independent review of #315: obligations.tsv still pointed at agent-roles.md for step 8a, which moved to agents/README.md; agent-roles.md said the example bodies are "below"; the history header cited a non-existent section id. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…rate opt-out; prune stale receipt rows (#264 review) Review of #308 (MERGE-AFTER-SMALL-FIX): 1. bin/lib/install-lint-rules.sh: a rule whose receipt row exists and whose `# mxtk-lint-rule:` header is gone is restored even when its hash is not in STOCK-HASHES.txt (an mxcli newer than the list, then init). It used to fall into the foreign branch -> LOCALLY MODIFIED, never written, so lint-gate stayed BLIND forever. Same test lint-gate uses; the found file is kept as <rule>.reseeded-<ts>. lint-gate's message adds the fallback `sync-project.sh <root> --upgrade-lint-rules all`. 2. Deliberate opt-out: .claude/lint-rules-disabled.txt. The installer never installs/restores a listed rule and prunes its receipt row; lint-gate skips it. lint-rules/README.md (txt002 row, CONV010 prefix note) now says list-then-delete, with an "Opting out of a rule" section. 3. The installer prunes receipt rows for rules no longer in MXTK_LINT_RULES / MXTK_LINT_RULES_CONFIGURABLE, so a retired rule is not "gone" forever. 4. skills/learned-mdl-preflight.md row 28 cut to trigger + rule + one-line failure (60 words, was ~230); the narrative stays in BUG-156. Fixture tests/wave2/test-lint-receipt-revert.sh T9-T11 (INSTALLER= swaps the installer): T9 uses a genuine stock body (toolkit entity_business_key minus header, md5 d66528c9 = the v0.24.0/v0.25.0 stock hash in STOCK-HASHES.txt) under a scratch toolkit that does not list the hash and whose rule has moved off stock. 38/38 here; 9 fail with master's installer, 21 with master's installer + lint-gate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…ract before the first wireframe Part 1 of 3 for #291. Stage 3 now writes design/interaction-model.md after the role model is CONFIRMED and before the first wireframe: a home per role, an inbox per BRD user task, and per screen how it is reached, its page parameter / context object, its data view source, nav entry and roles. Every wireframe opens with a wf-contract block (Page parameter:, Reached from:, Drawn as role:), which page-fidelity treats as annotation and the prototype hides behind Show bindings. Wired: design-artifacts.md Step 2b + Step 3 contract + output tree, conversion-runbook.md Stage 3 "Agent produces" (3 words; baseline is now exactly at its 80,000-word budget), routing row (ondemand, Stage 3, lead + architect) re-rendered. Refs #291 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…by commit time (#155); no LOOK row kind (#68) obligation-check.sh: a review file with dated addenda FAULTed because every proof line was compared with the single newest stamp. A citation now belongs to the nearest stamp above it (headline's if above all). _ob_stale picks the stamp with the newest commit time, not the last one in the file. brd-to-build-plan.md: rationale for not adding a LOOK kind next to the Kind list. Fixture: tests/wave2/test-obligation-valid-at.sh T4-T8 (3 fail on master). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Reviewer inputs stated (diff, issues, the PR body what-section, never its verdicts); durable Review: line in the squash commit; unblock-master exception per guard rule 7; budget stated as the render-routing ratchet, 95% of it; verified figures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…ings, setup kind - config.js reports passSource (env / project.config.js / template placeholder); the preflight refuses only the template placeholder (Demo2025!, or credentials() source 'template default'). As shipped, #302 refused every non-env password, though the template tells projects to put their real one in DEFAULT_PASS and nothing loads an env file before verify-module — every journeys rung would FAULT after a sync. An admin object without passSource keeps the #302 rule. - SIGINT/SIGTERM write the findings slot as aborted ("signal SIGINT") instead of leaving the previous run's file there. - report-normalize.js: rung 'setup' rows keep kind 'setup' (were 'ui'). - CHANGELOG names ALLOW_CONFIG_CREDENTIALS and the 403 verdict change (data rungs INVALID exit 1 -> suite aborts exit 2). test-journey-preflight.sh 74/74 (9 new cases fail on master: project-set password runs, placeholder refuses, env wins, SIGINT end to end); report-normalize --selftest new setup-kind case. Refs #286 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…-SEEN, not a rise (#305 review) A rule sync-project.sh installs after the baseline has no baseline count, so its first hit compared against 0: every exec logged LINT ROSE and exited 1 until someone re-baselined, and the Lint Batch 3 rules fire on ordinary text (TBD, XXX, v1.2, "12 Oct 2026"). - project-bin/lint-gate.sh: a rule absent from the baseline counts is FIRST-SEEN when it is a .star rule in .claude/lint-rules/ (RULE_ID = "...") the baseline did not know: not in the new `star_rules` list --update-baseline now writes, or, for an older baseline, its .star file is newer than the baseline. Printed as `FIRST-SEEN <rule> N finding(s) — new rule, first seen: review and re-baseline with --reason`; exit 0 when nothing else rose; verdict PASS-FIRST-SEEN. Re-baselining it needs --reason (it raises a count), after which it is an ordinary ratcheted rule. Built-in mxcli rules and .star rules known at baseline with zero findings still count as a rise (a baseline omits zero-count rules). - project-bin/exec.sh: the rc-0 row carries `FIRST-SEEN: <rule> (N) — review, re-baseline with --reason`. - tests/wave2/test-lint-gate-first-seen.sh: real toolkit .star files, LINT_JSON input; 17/17 here, 8 fail on master's lint-gate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…OT YET DUE before their stage From an independent review of #303. obligation-check.sh compared from-stage only with --adopt, so final-look (stage 6) read PENDING from Stage P. A project/cluster row above the register's Current stage now reads NOT YET DUE (module rows unchanged; an unreadable stage line keeps the old owed verdict). The PROOF-OF-LOOK check now covers final-look as module-review.md requires, and an unstamped final-look report is FAULT (it could never go stale). Fixture: tests/wave2/test-obligation-final-look.sh T4-T10 (4 fail on master). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…; chrome from layout (#158, #157) #158: headings/actions/content were a substring test over the whole page MDL (page name, identifiers, comments) with 60% of the >3-char words enough. Each wireframe string is now matched per literal against the page's own captions of the right kind, on whole words, all words for labels under three words; a label with only short words is required instead of passing vacuously. Bindings keep the identifier corpus. #157 remainder: an actionbutton declares btn + btn-<ButtonStyle> (btn-default when DESCRIBE omits it); the page's layout MDL in the input, or --chrome a,b, adds to the fixed chrome set. Without either, nothing changes. Before/after over every page/wireframe pair in the repo: 11 of 13 unchanged; the --stub commented-template page 66% -> 39% (a heading credited from dgWaiting + CustomerQuery identifiers); two new probe pairs fail on master. Fixtures: test-page-fidelity-mocks.sh +16 assertions (13 fail on master). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…eat/interaction-model-skill
- Stale-lock takeover serialised through an O_EXCL .exec.lock.takeover file; the lock is removed only if it still holds the stale line read (no mv -f restore). 12 contenders x 10 rounds: master 2/10 rounds with 2-3 holders, fixed 0/10. - --watch-compat: only ui-loop.md's watch-safe list says "watch can apply this"; other statements print "unknown — restart if behaviour looks stale". - Two-tree (.mpr under app/) cases for the lock and --commit-first. - Leading flags parsed in one loop (--commit-first --cr CR-NN works); a script name starting with -- is refused before any commit or snapshot. - ui-only test lane names the embedders of a changed snippet/layout. Refs #287 #289 #274 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Measured with LC_ALL=C on the branch after master (#313) was merged in: 79,997 -> 76,259 (-3,738); the old line used pre-#313 figures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Testing section gets the reviewer fixture exception it was cited for; the PENDING verdict goes to a PR comment (squash bodies are immutable); the trim trigger is within 2,000 words of the budget after the PR, not 95%. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
This was referenced Oct 14, 2026
Closed
Closed
MendixMau
pushed a commit
that referenced
this pull request
Oct 14, 2026
…dence pointer) - v1.0.md: 1.0 is the first published train tag; note on PRs closed via #329; sync prints "none tagged yet" until tags exist; app-restart.sh is #304, #322 added the injection refusal; "UX001/002 plus Batches 1-4"; known gap for the stale-lock takeover race after a killed holder. - RELEASE-PROCESS.md §8: tags start at 1.0; placeholders instead of a concrete tag; session ritual warns while pinned (expected); cadence defers to the CHANGELOG header instead of restating it. - README.md: Toolkit release line before/after tags; tags start at 1.0; interview-mode --set persists in .claude/.interview-mode, env var is per-session; "alias: unattended" next to auto. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
This was referenced Oct 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Direct lane
What changed and why (one paragraph):
This branch combines 19 PRs. Each one was reviewed by a fresh agent that didn't write it, per the new merge rule in #316, and only MERGE verdicts went in. Each
--no-ffmerge commit carries itsReview:line and the conflict resolution it needed. The branch also carries one follow-up commit for #328, which fixesrun-all.shresolving fixture subjects underbin/lib/. That fixture was red on #328's own CI when #328 was merged into integration; the fix is green on CI and was reviewed separately. The same pattern was used before in #258. Merge order (first parent):grep -qfalse negatives (CI flake), plus the run-all follow-uprun --local; shared port/process helpersLeft out: #311 (on HOLD until a field run) and #309.
Field evidence: most instruments here have not had a real-project field run yet. Each PR body says so where that's the case, so treat field runs as owed after the merge.
tests/run-tests.sh33/0;tests/wave2/run-all.sh102 fixtures, 2 failing before the fix(routing): pipefail + grep -q false negatives (CI flake) #328 follow-up. One was thebin/libsubject bug, now fixed. The other wastest-harvest-learnings.sh, which needs full git history; CI has it.render-routing.sh --checkpasses, with baseline at 74,959 of 80,000 words.CHANGELOG.mdlines come from each constituent PRDraft until the maintainer merges it.
🤖 Generated with Claude Code
https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Generated by Claude Code