diff --git a/.seeds/issues.jsonl b/.seeds/issues.jsonl index 76512ac..4f93af4 100644 --- a/.seeds/issues.jsonl +++ b/.seeds/issues.jsonl @@ -332,3 +332,11 @@ {"id":"mulch-ab79","title":"Add the canonical scripts/check-all.ts quiet runner copied byte-identical from templates/l5-toolkit/scripts/check-all.ts, with mulch's exported GATES manifest in the standard's order: lint, typecheck, check:agents, check:dups, check:deps, check:size, check:debt, check:coverage, check:ci-parity (last) -- note lint and typecheck must be ADDED to the manifest (they exist as scripts but are absent from the current && chain). Replace package.json check:all with `bun scripts/check-all.ts`, add `verify`: `bun run check:all`, and add scripts/check-all.test.ts. Confirm the quiet-output contract.","status":"closed","type":"task","priority":2,"plan_step_index":0,"description":"\nStep 1 of plan pl-237d.\n\nParent seed: mulch-f16f — Adopt canonical check:all standard\nPlan template: feature\nPlan approach: Swap the && chain for the canonical quiet runner with a GATES manifest in the standard's order (folding in the already-present lint and typecheck scripts), then add the generalized ci-parity gate and the verify alias. mulch has no UI…\n\nRun `sd plan show pl-237d` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-12T04:53:28.928Z","updatedAt":"2026-06-12T05:56:59.979Z","plan_id":"pl-237d","blocks":["mulch-c658","mulch-f16f"],"closedAt":"2026-06-12T05:56:59.979Z"} {"id":"mulch-c658","title":"Add scripts/check-ci-parity.ts (with test) copied from templates/l5-toolkit/scripts, importing the GATES array from check-all.ts; add the check:ci-parity script as the final gate in the manifest. Reconcile any residual non-canonical gate name. Verify check:ci-parity passes against .github/workflows/ci.yml.","status":"closed","type":"task","priority":2,"plan_step_index":1,"description":"\nStep 2 of plan pl-237d.\n\nParent seed: mulch-f16f — Adopt canonical check:all standard\nPlan template: feature\nPlan approach: Swap the && chain for the canonical quiet runner with a GATES manifest in the standard's order (folding in the already-present lint and typecheck scripts), then add the generalized ci-parity gate and the verify alias. mulch has no UI…\n\nRun `sd plan show pl-237d` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-12T04:53:28.928Z","updatedAt":"2026-06-12T05:57:00.030Z","plan_id":"pl-237d","blocks":["mulch-c6f8","mulch-f16f"],"closedAt":"2026-06-12T05:57:00.030Z"} {"id":"mulch-c6f8","title":"Wire .github/workflows/ci.yml to invoke the canonical gates (or `bun run check:all`) so the local manifest matches CI. Run `bun run check:all` and `bun run verify` green end-to-end with the quiet-output contract and a passing check:ci-parity.","status":"closed","type":"task","priority":2,"plan_step_index":2,"description":"\nStep 3 of plan pl-237d.\n\nParent seed: mulch-f16f — Adopt canonical check:all standard\nPlan template: feature\nPlan approach: Swap the && chain for the canonical quiet runner with a GATES manifest in the standard's order (folding in the already-present lint and typecheck scripts), then add the generalized ci-parity gate and the verify alias. mulch has no UI…\n\nRun `sd plan show pl-237d` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-12T04:53:28.928Z","updatedAt":"2026-06-12T05:57:00.083Z","plan_id":"pl-237d","blocks":["mulch-f16f"],"closedAt":"2026-06-12T05:57:00.083Z"} +{"id":"mulch-e3e9","title":"nightwatch patrol: 2026-06-15","status":"open","type":"task","priority":3,"createdAt":"2026-06-15T10:08:07.957Z","updatedAt":"2026-06-15T10:08:46.513Z","labels":["patrol","nightwatch"],"plan_id":"pl-b637","blockedBy":["mulch-4ca6","mulch-fed1","mulch-4bd0","mulch-9465","mulch-a424","mulch-4dc4","mulch-0768"]} +{"id":"mulch-4ca6","title":"Canonicalize JSON `up_to_date` vs `upToDate` across upgrade/onboard output","status":"open","type":"task","priority":3,"plan_step_index":0,"description":"\nStep 1 of plan pl-b637.\n\nParent seed: mulch-e3e9 — nightwatch patrol: 2026-06-15\nPlan template: refactor\nPlan approach: One step per finding so each lands as an isolated PR. Independent steps (1, 2, 3, 4, 5, 6) run in parallel; the release step (7) batches them. Step 1 (JSON key canonicalization) and step 4 (suffix-boundary fix) are the only…\n\nRun `sd plan show pl-b637` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-15T10:08:46.513Z","updatedAt":"2026-06-15T10:08:46.513Z","labels":["nightwatch"],"plan_id":"pl-b637","blocks":["mulch-0768","mulch-e3e9"]} +{"id":"mulch-fed1","title":"Dedupe local parseStrictPositiveInt/parseStrictNonNegativeNumber copies; import from src/utils/numeric-flags.ts","status":"open","type":"task","priority":3,"plan_step_index":1,"description":"\nStep 2 of plan pl-b637.\n\nParent seed: mulch-e3e9 — nightwatch patrol: 2026-06-15\nPlan template: refactor\nPlan approach: One step per finding so each lands as an isolated PR. Independent steps (1, 2, 3, 4, 5, 6) run in parallel; the release step (7) batches them. Step 1 (JSON key canonicalization) and step 4 (suffix-boundary fix) are the only…\n\nRun `sd plan show pl-b637` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-15T10:08:46.513Z","updatedAt":"2026-06-15T10:08:46.513Z","labels":["nightwatch"],"plan_id":"pl-b637","blocks":["mulch-0768","mulch-e3e9"]} +{"id":"mulch-4bd0","title":"Replace `(err as Error).message` with `err instanceof Error ? err.message : String(err)` across src/commands and src/utils","status":"open","type":"task","priority":3,"plan_step_index":2,"description":"\nStep 3 of plan pl-b637.\n\nParent seed: mulch-e3e9 — nightwatch patrol: 2026-06-15\nPlan template: refactor\nPlan approach: One step per finding so each lands as an isolated PR. Independent steps (1, 2, 3, 4, 5, 6) run in parallel; the release step (7) batches them. Step 1 (JSON key canonicalization) and step 4 (suffix-boundary fix) are the only…\n\nRun `sd plan show pl-b637` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-15T10:08:46.513Z","updatedAt":"2026-06-15T10:08:46.513Z","labels":["nightwatch"],"plan_id":"pl-b637","blocks":["mulch-0768","mulch-e3e9"]} +{"id":"mulch-9465","title":"Fix path-segment boundary in src/utils/git.ts fileMatchesAny + add false-positive coverage","status":"open","type":"task","priority":2,"plan_step_index":3,"description":"\nStep 4 of plan pl-b637.\n\nParent seed: mulch-e3e9 — nightwatch patrol: 2026-06-15\nPlan template: refactor\nPlan approach: One step per finding so each lands as an isolated PR. Independent steps (1, 2, 3, 4, 5, 6) run in parallel; the release step (7) batches them. Step 1 (JSON key canonicalization) and step 4 (suffix-boundary fix) are the only…\n\nRun `sd plan show pl-b637` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-15T10:08:46.513Z","updatedAt":"2026-06-15T10:08:46.513Z","labels":["nightwatch"],"plan_id":"pl-b637","blocks":["mulch-0768","mulch-e3e9"]} +{"id":"mulch-a424","title":"Unify JSON vs human error wording in src/commands/ready.ts unknown-domain branch","status":"open","type":"task","priority":3,"plan_step_index":4,"description":"\nStep 5 of plan pl-b637.\n\nParent seed: mulch-e3e9 — nightwatch patrol: 2026-06-15\nPlan template: refactor\nPlan approach: One step per finding so each lands as an isolated PR. Independent steps (1, 2, 3, 4, 5, 6) run in parallel; the release step (7) batches them. Step 1 (JSON key canonicalization) and step 4 (suffix-boundary fix) are the only…\n\nRun `sd plan show pl-b637` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-15T10:08:46.513Z","updatedAt":"2026-06-15T10:08:46.513Z","labels":["nightwatch"],"plan_id":"pl-b637","blocks":["mulch-0768","mulch-e3e9"]} +{"id":"mulch-4dc4","title":"Backfill direct unit tests for src/utils/domain-rules.ts and src/utils/format-helpers.ts","status":"open","type":"task","priority":3,"plan_step_index":5,"description":"\nStep 6 of plan pl-b637.\n\nParent seed: mulch-e3e9 — nightwatch patrol: 2026-06-15\nPlan template: refactor\nPlan approach: One step per finding so each lands as an isolated PR. Independent steps (1, 2, 3, 4, 5, 6) run in parallel; the release step (7) batches them. Step 1 (JSON key canonicalization) and step 4 (suffix-boundary fix) are the only…\n\nRun `sd plan show pl-b637` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-15T10:08:46.513Z","updatedAt":"2026-06-15T10:08:46.513Z","labels":["nightwatch"],"plan_id":"pl-b637","blocks":["mulch-0768","mulch-e3e9"]} +{"id":"mulch-0768","title":"Release: run /release per .claude/commands/release.md","status":"open","type":"task","priority":3,"plan_step_index":6,"description":"\nStep 7 of plan pl-b637.\n\nParent seed: mulch-e3e9 — nightwatch patrol: 2026-06-15\nPlan template: refactor\nPlan approach: One step per finding so each lands as an isolated PR. Independent steps (1, 2, 3, 4, 5, 6) run in parallel; the release step (7) batches them. Step 1 (JSON key canonicalization) and step 4 (suffix-boundary fix) are the only…\n\nRun `sd plan show pl-b637` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n","createdAt":"2026-06-15T10:08:46.513Z","updatedAt":"2026-06-15T10:08:46.513Z","labels":["nightwatch"],"plan_id":"pl-b637","blockedBy":["mulch-4ca6","mulch-fed1","mulch-4bd0","mulch-9465","mulch-a424","mulch-4dc4"],"blocks":["mulch-e3e9"]} diff --git a/.seeds/plans.jsonl b/.seeds/plans.jsonl index 85d2fc6..a2846d4 100644 --- a/.seeds/plans.jsonl +++ b/.seeds/plans.jsonl @@ -10,3 +10,4 @@ {"id":"pl-4fb9","seed":"mulch-3204","template":"feature","status":"done","revision":1,"sections":{"context":"Mulch is the structured-expertise CLI tool in the os-eco ecosystem. The os-eco L5 uplift mission targets Level 5 (≥80% pass rate, matching warren's ceiling per docs/l5-uplift/library/warren-ceiling.md) for every sub-repo by porting templates/l5-toolkit/ (the warren-derived toolkit, finalized 2026-05-27) and authoring repo-specific artifacts. Mulch has NOT started uplift yet — this plan ports the toolkit from scratch and lifts mulch to ~50/63 ≈ ~80% → Level 5 ✓ per the per-repo expected math in docs/l5-uplift/library/warren-ceiling.md. The 6 children of this plan are self-contained: an agent reading `sd show ` has the full target dir, files-to-add/edit, source-of-truth refs, verification commands, rubric criteria closed, commit guidance, and mulch-specific pitfalls without needing the parent mission context.","approach":"Port the os-eco L5 toolkit (templates/l5-toolkit/) into mulch/ in six focused commits, in dependency order. Each child seed targets one feature from the mission's seed-plan-source/mulch.json. Mulch hasn't started, so the first child (mulch-repo-scaffolding) lays down all the baseline configs + devcontainer + env + gitignore + biome extension; subsequent children layer ratchet scripts + budgets, coverage + reporters, AGENTS.md + validator + RUNBOOK + skill, pino logger + governance hooks (pre-commit + dependabot cooldown + labels.yml), and finally the check:all aggregator + CI workflow extension. Each child commits one feature to mulch main; do NOT push (user pushes manually). After the final child seals, the user runs /readiness-report from mulch/ to confirm Level 5 ≥80%.","steps":[{"title":"mulch-repo-scaffolding: port baseline configs + devcontainer + env + gitignore + biome/knip/jscpd/bunfig"},{"title":"mulch-ratchet-scripts: port check-file-sizes + check-debt-markers + budgets"},{"title":"mulch-test-coverage-and-reporters: wire coverage + test:ci + report-test-timing + report-quality-metrics"},{"title":"mulch-agents-md-validator-runbook-skills: author AGENTS.md + validator + RUNBOOK + mulch-expertise skill"},{"title":"mulch-pino-logger-and-governance: add pino + redact + pre-commit hook + dependabot cooldown + labels.yml"},{"title":"mulch-check-all-and-ci-finalize: wire check:all aggregator + extend ci.yml + final verification"}],"acceptance":["VAL-MULCH-002 (naming_consistency), VAL-MULCH-003 (cyclomatic_complexity), VAL-MULCH-005 (duplicate_code_detection), VAL-MULCH-007 (unused_dependencies_detection), VAL-MULCH-012 (devcontainer), VAL-MULCH-017 (env_template), VAL-MULCH-018 (gitignore_comprehensive) closed by step 1","VAL-MULCH-004 (large_file_detection), VAL-MULCH-006 (tech_debt_tracking) closed by step 2","VAL-MULCH-008 (test_performance_tracking), VAL-MULCH-009 (test_coverage_thresholds), VAL-MULCH-015 (code_quality_metrics) closed by step 3","VAL-MULCH-010 (agents_md), VAL-MULCH-011 (agents_md_validation), VAL-MULCH-016 (runbooks_documented), VAL-MULCH-020 (skills) closed by step 4","VAL-MULCH-001 (pre_commit_hooks), VAL-MULCH-013 (structured_logging), VAL-MULCH-014 (log_scrubbing), VAL-MULCH-019 (min_release_age), VAL-MULCH-021 (issue_labeling_system) closed by step 5","VAL-MULCH-FINAL: post-mission /readiness-report from mulch/ shows Level 5 / 5 with pass rate ≥80%; each VAL-MULCH-001..021 criterion at 1/1","From cd /Users/jayminwest/Projects/os-eco/mulch: bun install && bun run lint && bun run typecheck && bun test && bun run check:all all exit 0 after step 6"]},"children":["mulch-409a","mulch-3fda","mulch-8cd7","mulch-d919","mulch-3fd5","mulch-6048"],"createdAt":"2026-05-28T03:22:52.773Z","updatedAt":"2026-05-28T18:57:32.181Z","name":"L5 uplift: mulch"} {"id":"pl-099d","seed":"mulch-5acb","template":"feature","status":"done","revision":1,"sections":{"context":"Mulch is one of five sub-repos targeted by the os-eco L5 readiness uplift mission. Prior /readiness-report audits placed mulch below Level 5 because it lacks the ratchet scripts, governance artifacts, validators, structured logger, and CI wiring that warren (the exemplar at Level 5) ships. The orchestrator has already finalised templates/l5-toolkit/ at the os-eco root; this work ports that toolkit into mulch so the next /readiness-report audit can certify Level 5 (≥80% pass rate) and close every VAL-MULCH-* assertion in docs/l5-uplift/validation-contract.md. Mulch's test directory layout (test/ rather than src/) and existing debug/output channels make this slightly different from the canopy and plot ports already shipped — those deltas are documented in docs/l5-uplift/library/porting-playbook.md.","approach":"Port the L5 toolkit (templates/l5-toolkit/) into mulch in six dependent stages, matching warren's ceiling and closing the VAL-MULCH-* assertions enumerated in docs/l5-uplift/validation-contract.md. Each stage lands in one commit on mulch's working branch (no push) and is gated by bun install / lint / typecheck / test exit 0. Special handling for mulch's test/ directory layout (no bunfig change needed for discovery) and the requirement to route the existing debug/output channels through pino in stage 5 instead of adding a parallel logger. Final stage wires check:all + extends ci.yml and asks the user to run /readiness-report.","steps":[{"title":"mulch-repo-scaffolding"},{"title":"mulch-ratchet-scripts"},{"title":"mulch-test-coverage-and-reporters"},{"title":"mulch-agents-md-validator-runbook-skills"},{"title":"mulch-pino-logger-and-governance"},{"title":"mulch-check-all-and-ci-finalize"}],"acceptance":["All six child seeds exist as dependent open seeds linked to parent mulch-5acb.","Each child seed has a self-contained description (>3000 chars) covering goal, working dir, references to templates/l5-toolkit/ + docs/l5-uplift/library/, files to add/edit, exact verification commands, acceptance rubric criteria, commit guidance, and pitfalls.","After all six children complete, bun install && bun run lint && bun run typecheck && bun test exit 0 from /Users/jayminwest/Projects/os-eco/mulch.","bun run check:all exits 0 after the final child lands.","The agent-readiness auditor (/readiness-report) confirms mulch reaches Level 5 (≥80% pass rate) closing each VAL-MULCH-001..021 plus VAL-MULCH-FINAL."]},"children":["mulch-3744","mulch-5c6f","mulch-f8d1","mulch-cbf4","mulch-9258","mulch-a11b"],"createdAt":"2026-05-28T13:14:50.739Z","updatedAt":"2026-05-28T17:38:48.524Z","name":"L5 uplift: mulch"} {"id":"pl-237d","seed":"mulch-f16f","template":"feature","status":"done","revision":1,"sections":{"context":"mulch already has the canonical terse check scripts (check:size/debt/dups/deps/agents/coverage) backed by l5-toolkit scripts and .jscpd.json/knip.json, but its check:all is a plain && chain that omits lint and typecheck and has no quiet runner, no `verify` alias, and no check:ci-parity. Conforming to docs/check-all-standard.md (os-eco-9048) means adopting the byte-identical runner (os-eco-5db7) and adding the missing gates. Depends on root tracker pl-760e steps 1-2.","approach":"Swap the && chain for the canonical quiet runner with a GATES manifest in the standard's order (folding in the already-present lint and typecheck scripts), then add the generalized ci-parity gate and the verify alias. mulch has no UI bundle or OpenAPI surface, so conditional gates are out of scope; only the core gate set applies.","steps":[{"title":"Add the canonical scripts/check-all.ts quiet runner copied byte-identical from templates/l5-toolkit/scripts/check-all.ts, with mulch's exported GATES manifest in the standard's order: lint, typecheck, check:agents, check:dups, check:deps, check:size, check:debt, check:coverage, check:ci-parity (last) -- note lint and typecheck must be ADDED to the manifest (they exist as scripts but are absent from the current && chain). Replace package.json check:all with `bun scripts/check-all.ts`, add `verify`: `bun run check:all`, and add scripts/check-all.test.ts. Confirm the quiet-output contract.","type":"task","priority":2,"blocks":[2]},{"title":"Add scripts/check-ci-parity.ts (with test) copied from templates/l5-toolkit/scripts, importing the GATES array from check-all.ts; add the check:ci-parity script as the final gate in the manifest. Reconcile any residual non-canonical gate name. Verify check:ci-parity passes against .github/workflows/ci.yml.","type":"task","priority":2,"blocks":[3]},{"title":"Wire .github/workflows/ci.yml to invoke the canonical gates (or `bun run check:all`) so the local manifest matches CI. Run `bun run check:all` and `bun run verify` green end-to-end with the quiet-output contract and a passing check:ci-parity.","type":"task","priority":2,"blocks":[]}],"acceptance":["check:all is `bun scripts/check-all.ts` with the byte-identical runner and a GATES manifest in the standard's order including lint and typecheck; verify aliases check:all.","scripts/check-ci-parity.ts imports GATES and passes against .github/workflows/ci.yml.","`bun run check:all` runs green with the quiet-output contract."]},"children":["mulch-ab79","mulch-c658","mulch-c6f8"],"createdAt":"2026-06-12T04:53:28.928Z","updatedAt":"2026-06-12T05:57:00.136Z","name":"Adopt canonical check:all standard (mulch)","outcome":"success"} +{"id":"pl-b637","seed":"mulch-e3e9","template":"refactor","status":"approved","revision":1,"sections":{"context":"Patrol scan found six categories of latent quality issues across the CLI: JSON output naming is inconsistent across commands (upToDate vs up_to_date for the same concept), four command files reimplement parseStrictPositiveInt locally instead of using the shared util in src/utils/numeric-flags.ts, ~40 sites use the unsafe `(err as Error).message` coercion that crashes on non-Error throws, src/utils/git.ts:fileMatchesAny suffix-matches without a path-segment boundary (so 'cli.ts' falsely matches 'other-cli.ts'), src/commands/ready.ts emits divergent JSON vs human wording for the same error, and src/utils/domain-rules.ts plus src/utils/format-helpers.ts lack dedicated unit tests. None of these warrant feature work or architecture changes — each is a targeted hygiene fix landing as its own small PR.","behavior_invariant":"Every existing `ml` subcommand keeps its current observable contract for the non-buggy paths: same exit codes, same successful JSON shape (except for the targeted up_to_date/upToDate canonicalization called out in step 1), same human output text (except for the targeted ready.ts unification in step 5), and same set of records returned by `ml prime --files ` for inputs that don't depend on the suffix-boundary fix. The full `bun run verify` gate (lint, typecheck, check:agents, check:dups, check:deps, check:size, check:debt, check:coverage, check:ci-parity) must pass on every step. No new dependencies, no public API signature changes, no command renames or removals.","approach":"One step per finding so each lands as an isolated PR. Independent steps (1, 2, 3, 4, 5, 6) run in parallel; the release step (7) batches them. Step 1 (JSON key canonicalization) and step 4 (suffix-boundary fix) are the only consumer-observable changes, so a single Release step is appended per AGENTS Article III. Internal-hygiene steps (2 — DRY parser dedup; 3 — defensive error coercion; 5 — error-message unification; 6 — test backfill) ride the same release.","steps":[{"title":"Canonicalize JSON `up_to_date` vs `upToDate` across upgrade/onboard output","type":"task","priority":3,"labels":["nightwatch"],"blocks":[7]},{"title":"Dedupe local parseStrictPositiveInt/parseStrictNonNegativeNumber copies; import from src/utils/numeric-flags.ts","type":"task","priority":3,"labels":["nightwatch"],"blocks":[7]},{"title":"Replace `(err as Error).message` with `err instanceof Error ? err.message : String(err)` across src/commands and src/utils","type":"task","priority":3,"labels":["nightwatch"],"blocks":[7]},{"title":"Fix path-segment boundary in src/utils/git.ts fileMatchesAny + add false-positive coverage","type":"task","priority":2,"labels":["nightwatch"],"blocks":[7]},{"title":"Unify JSON vs human error wording in src/commands/ready.ts unknown-domain branch","type":"task","priority":3,"labels":["nightwatch"],"blocks":[7]},{"title":"Backfill direct unit tests for src/utils/domain-rules.ts and src/utils/format-helpers.ts","type":"task","priority":3,"labels":["nightwatch"],"blocks":[7]},{"title":"Release: run /release per .claude/commands/release.md","type":"task","priority":3,"labels":["nightwatch"]}],"acceptance":["Step 1: `ml upgrade --json` and `ml onboard --json` both expose the same canonical key for the up-to-date concept (pick one and document it in CHANGELOG); existing snapshot tests updated; no other key renames slip in.","Step 2: src/commands/ready.ts, src/commands/prime.ts, src/commands/rank.ts, src/commands/compact.ts no longer define local parseStrictPositiveInt/parseStrictNonNegativeNumber; they import from src/utils/numeric-flags.ts; behavior on bad inputs is unchanged (NaN/typos still rejected, same null sentinel).","Step 3: zero matches for `grep -rn \"(err as Error).message\" src/` outside intentionally-asserted casts; every replaced site falls back to `String(err)` for non-Error throws; existing error-path tests still pass.","Step 4: `fileMatchesAny('cli.ts', ['src/other-cli.ts'])` returns false; `fileMatchesAny('cli.ts', ['src/cli.ts'])` still returns true; new test cases in test/commands/prime.test.ts cover the boundary; no records previously surfaced under intended file-anchor matches drop out.","Step 5: src/commands/ready.ts emits identical wording (verbatim, case-included) on the unknown-domain path in both --json and human modes; updated test asserts both.","Step 6: test/utils/domain-rules.test.ts and test/utils/format-helpers.test.ts exist and exercise every exported function; `bun run check:coverage` budget tightens or holds.","Steps 1–6: `bun run verify` exits 0 on each merged PR.","Step 7: release PR cuts a new minor/patch per RUNBOOK; CHANGELOG calls out the up_to_date key canonicalization and the fileMatchesAny boundary fix under user-visible changes."]},"children":["mulch-4ca6","mulch-fed1","mulch-4bd0","mulch-9465","mulch-a424","mulch-4dc4","mulch-0768"],"createdAt":"2026-06-15T10:08:46.513Z","updatedAt":"2026-06-15T10:08:46.513Z","name":"nightwatch patrol 2026-06-15: quality hygiene sweep"}