@event4u/agent-config 16.0.0 → 16.1.0
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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +297 -137
- package/CONTRIBUTING.md +9 -0
- package/README.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +26 -0
- package/dist/agent-src/commands/analyze/roadmap-repos.md +27 -0
- package/dist/agent-src/commands/challenge-me/closure.md +178 -0
- package/dist/agent-src/commands/challenge-me.md +9 -2
- package/dist/agent-src/commands/council/default.md +25 -5
- package/dist/agent-src/commands/feature/plan.md +28 -1
- package/dist/agent-src/commands/feature/roadmap.md +28 -1
- package/dist/agent-src/commands/implement-ticket.md +27 -0
- package/dist/agent-src/commands/jira-ticket.md +27 -0
- package/dist/agent-src/commands/pr/create.md +29 -0
- package/dist/agent-src/commands/pr/merge.md +60 -9
- package/dist/agent-src/commands/roadmap/ai-council.md +7 -1
- package/dist/agent-src/commands/roadmap/create.md +74 -27
- package/dist/agent-src/commands/roadmap/materialize.md +27 -0
- package/dist/agent-src/commands/roadmap/process-full.md +123 -18
- package/dist/agent-src/commands/team.md +22 -0
- package/dist/agent-src/contexts/authority/scope-growth-ownership.md +80 -0
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +47 -0
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +44 -3
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +15 -15
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +93 -0
- package/dist/agent-src/contexts/execution/fix-loop-ladder.md +108 -0
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +4 -2
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +75 -6
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +29 -0
- package/dist/agent-src/rules/autonomous-execution.md +15 -8
- package/dist/agent-src/rules/delegation-policy.md +23 -45
- package/dist/agent-src/rules/design-fidelity.md +32 -37
- package/dist/agent-src/rules/evaluator-independence.md +43 -49
- package/dist/agent-src/rules/test-first.md +41 -0
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
- package/dist/agent-src/skills/ai-council/SKILL.md +11 -3
- package/dist/agent-src/skills/api-design/data/manifest.json +3 -3
- package/dist/agent-src/skills/database/data/manifest.json +4 -4
- package/dist/agent-src/skills/database/data/query-tuning.csv +3 -3
- package/dist/agent-src/skills/design-review/SKILL.md +50 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -4
- package/dist/agent-src/skills/experiment-loop/SKILL.md +31 -1
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +42 -3
- package/dist/agent-src/skills/threat-modeling/SKILL.md +9 -4
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +4 -4
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +37 -3
- package/dist/agent-src/templates/agent-settings.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +188 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
- package/dist/cli-delegate/check_update_banner.js +40 -2
- package/dist/cli-delegate/chunk-4E2W63DA.js +335 -0
- package/dist/cli-delegate/chunk-5R7HOLAF.js +99 -0
- package/dist/cli-delegate/{chunk-IVBPRCQO.js → chunk-6KFEC3G7.js} +1 -1
- package/dist/cli-delegate/{chunk-2TAQ2K4V.js → chunk-6KM6ORRY.js} +55 -386
- package/dist/cli-delegate/{chunk-2XY7ILBT.js → chunk-FC75PGJE.js} +42 -2
- package/dist/cli-delegate/{chunk-GYC3VRYN.js → chunk-FXYUYU4N.js} +57 -13
- package/dist/cli-delegate/{chunk-55ACLDUE.js → chunk-GJCBB2UG.js} +168 -10
- package/dist/cli-delegate/{chunk-AK6HODNQ.js → chunk-HDVVGPQW.js} +873 -539
- package/dist/cli-delegate/{chunk-H32DGUJH.js → chunk-P6ZHP5W2.js} +1 -1
- package/dist/cli-delegate/{chunk-57PN4GYJ.js → chunk-RGNIWTEA.js} +1 -1
- package/dist/cli-delegate/chunk-ROYYTEZU.js +39 -0
- package/dist/cli-delegate/{chunk-3FKR64R5.js → chunk-UNCRJBT3.js} +31 -7
- package/dist/cli-delegate/{chunk-2DK2VJWG.js → chunk-WGXTVKCQ.js} +20 -6
- package/dist/cli-delegate/chunk-YDPILCOL.js +152 -0
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +90 -56
- package/dist/cli-delegate/cmd_doctor.js +7 -5
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +9 -7
- package/dist/cli-delegate/cmd_fleet.js +4 -2
- package/dist/cli-delegate/cmd_handoff.js +4 -4
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +4 -2
- package/dist/cli-delegate/cmd_prune.js +10 -8
- package/dist/cli-delegate/cmd_route_audit.js +2 -2
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +2 -2
- package/dist/cli-delegate/cmd_settings_get.js +28 -2
- package/dist/cli-delegate/cmd_settings_migrate.js +9 -7
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +10 -8
- package/dist/cli-delegate/cmd_uninstall.js +16 -13
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +12 -10
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +85 -38
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +10 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +8 -6
- package/dist/hooks/dispatch.js +1832 -1007
- package/dist/install/claudeRuleRewrite.js +14 -3
- package/dist/install/conflict.js +60 -10
- package/dist/install/conflictTracker.js +218 -0
- package/dist/install/fsPrimitives.js +54 -0
- package/dist/install/install.mjs +2007 -1481
- package/dist/install/manifestFiles.js +259 -0
- package/dist/install/preflight.js +14 -2
- package/dist/install/preserve.js +157 -0
- package/dist/install/recordedOwnership.js +132 -0
- package/dist/install/txlog.js +11 -2
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +398 -39
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +3 -2
- package/dist/scripts/_lib/fs_atomic.js +167 -0
- package/dist/scripts/_lib/installed_tools.js +460 -0
- package/dist/scripts/_lib/lean_projection_mode.js +3 -2
- package/dist/scripts/_lib/settings_renamed_keys.js +78 -0
- package/dist/server/routes/install.js +8 -0
- package/dist/server/routes/wizard.js +9 -3
- package/dist/server/schemas/settings.js +17 -5
- package/dist/shared/missionExecution.js +97 -0
- package/dist/ui/assets/{index-D0jaCRPM.js → index-DH1xc62v.js} +17 -17
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +103 -0
- package/docs/contracts/settings-classes.md +26 -7
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
- package/docs/guidelines/design-fidelity-routing.md +29 -0
- package/package.json +1 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
- package/src/config/agent-settings.template.yml +139 -27
- package/src/config/auto-rule-budget.json +16 -0
- package/src/config/ci-local-parity.yml +18 -5
- package/src/config/continuity-surface.json +21 -0
- package/src/config/gate-coverage.yml +146 -13
- package/src/config/gate-violation-baselines.json +6 -6
- package/src/config/hook-token-budget.json +2 -0
- package/src/config/loop-surfaces.yaml +215 -0
- package/src/config/platform-anchor.json +3 -2
- package/src/config/release-gate-locality.yml +11 -0
- package/src/config/routing-coverage-seed.json +18 -4
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/install/claudeRuleRewrite.ts +16 -2
- package/src/install/conflict.ts +65 -9
- package/src/install/conflictTracker.ts +299 -0
- package/src/install/fsPrimitives.ts +54 -0
- package/src/install/manifestFiles.ts +312 -0
- package/src/install/preflight.ts +16 -2
- package/src/install/preserve.ts +205 -0
- package/src/install/recordedOwnership.ts +149 -0
- package/src/install/txlog.ts +11 -2
- package/src/install/types.ts +19 -4
- package/src/scripts/_cli/cmd_conformance.ts +88 -15
- package/src/scripts/_cli/cmd_doctor.ts +4 -3
- package/src/scripts/_cli/cmd_route_explain.ts +9 -2
- package/src/scripts/_cli/cmd_settings_get.ts +44 -0
- package/src/scripts/_cli/doctor_execution.ts +90 -0
- package/src/scripts/_lib/activation_payload.ts +247 -0
- package/src/scripts/_lib/agent_settings.ts +4 -2
- package/src/scripts/_lib/authority_path.ts +102 -0
- package/src/scripts/_lib/cascade_base.ts +94 -0
- package/src/scripts/_lib/changelog_eras.ts +7 -2
- package/src/scripts/_lib/continuation_ladder.ts +149 -2
- package/src/scripts/_lib/council_transport.ts +129 -0
- package/src/scripts/_lib/delivery_ready.ts +112 -0
- package/src/scripts/_lib/forge_protection.ts +267 -0
- package/src/scripts/_lib/hook_platform_keys.ts +27 -0
- package/src/scripts/_lib/json_python_parity.ts +127 -0
- package/src/scripts/_lib/lean_projection_mode.ts +14 -3
- package/src/scripts/_lib/loop_surfaces.ts +382 -0
- package/src/scripts/_lib/mission_record.ts +190 -0
- package/src/scripts/_lib/obligation_frequency.ts +217 -0
- package/src/scripts/_lib/obligations.ts +402 -0
- package/src/scripts/_lib/orchestration_record.ts +11 -20
- package/src/scripts/_lib/release_highlights.ts +199 -10
- package/src/scripts/_lib/release_holds.ts +493 -0
- package/src/scripts/_lib/release_migration_gate.ts +184 -0
- package/src/scripts/_lib/rides_along.ts +102 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +82 -0
- package/src/scripts/_lib/test_delta.ts +166 -0
- package/src/scripts/_lib/test_provenance.ts +171 -0
- package/src/scripts/_lib/typed_op_grant.ts +246 -0
- package/src/scripts/_lib/typed_op_watch.ts +185 -0
- package/src/scripts/ai_council/config.ts +8 -11
- package/src/scripts/ai_council/fallback_config.ts +5 -3
- package/src/scripts/ai_council/ownership_classes.ts +118 -0
- package/src/scripts/ask_block_census.ts +285 -15
- package/src/scripts/check_enforcement_matrix.ts +624 -0
- package/src/scripts/check_gate_reachability.ts +173 -10
- package/src/scripts/check_generator_sync.ts +954 -0
- package/src/scripts/check_preamble_payload_budget.ts +75 -2
- package/src/scripts/check_release_highlights.ts +33 -1
- package/src/scripts/check_release_holds.ts +567 -0
- package/src/scripts/check_rule_projection_integrity.ts +22 -12
- package/src/scripts/check_test_delta.ts +294 -0
- package/src/scripts/check_test_weakening.ts +299 -0
- package/src/scripts/closure_scan.ts +333 -0
- package/src/scripts/compile_hook_manifest.ts +43 -3
- package/src/scripts/council_record_shape.ts +209 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +88 -9
- package/src/scripts/hooks/concern_registry.ts +4 -0
- package/src/scripts/hooks/design_pass_hook.ts +128 -3
- package/src/scripts/hooks/evidence_independence.ts +96 -0
- package/src/scripts/hooks/memory_recall_hook.ts +540 -0
- package/src/scripts/hooks/obligation_settle_hook.ts +182 -0
- package/src/scripts/hooks/rule_inject_hook.ts +49 -1
- package/src/scripts/hooks/run_continuation_hook.ts +17 -20
- package/src/scripts/hooks_doctor.ts +85 -0
- package/src/scripts/hooks_status.ts +19 -0
- package/src/scripts/install.ts +106 -206
- package/src/scripts/janitor.ts +7 -0
- package/src/scripts/lint_decision_classes.ts +464 -0
- package/src/scripts/lint_hook_manifest.ts +11 -0
- package/src/scripts/lint_major_migration_sections.ts +450 -0
- package/src/scripts/lint_plan_risk_register.ts +47 -3
- package/src/scripts/lint_roadmap_blockers.ts +61 -0
- package/src/scripts/lint_roadmap_producers.ts +202 -0
- package/src/scripts/measure_rule_budget.ts +101 -5
- package/src/scripts/new_roadmap.ts +37 -0
- package/src/scripts/orchestration_record.ts +0 -5
- package/src/scripts/release.ts +14 -98
- package/src/scripts/release_drill.ts +267 -1
- package/src/scripts/release_publication.ts +51 -0
- package/src/scripts/report_enforcement_drift.ts +566 -0
- package/src/scripts/report_host_injection_effect.ts +3 -11
- package/src/scripts/report_standing_payload_by_host.ts +26 -152
- package/src/scripts/schemas/agent-settings.schema.json +23 -0
- package/src/scripts/schemas/command.schema.json +4 -0
- package/src/scripts/scope_growth.ts +219 -0
- package/src/scripts/trigger_eval_grandfather.json +0 -1
- package/src/scripts/ui_conformance_probe.ts +622 -0
- package/src/server/schemas/settings.ts +31 -7
- package/src/shared/missionExecution.ts +126 -0
- package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
|
@@ -423,6 +423,47 @@ github:
|
|
|
423
423
|
# auto = detect on first use and update this setting
|
|
424
424
|
pr_reply_method: create_review_comment
|
|
425
425
|
|
|
426
|
+
# --- Delivery: what a run does with the branch it produced ---
|
|
427
|
+
#
|
|
428
|
+
# ADR-268 section 3 resolves ADR-239 section 3's "undecided, not rejected" on merge
|
|
429
|
+
# authority in the affirmative, and these keys are where that decision is
|
|
430
|
+
# configured rather than inferred. All three are Class C in
|
|
431
|
+
# docs/contracts/settings-classes.md: every agent write path refuses them, so
|
|
432
|
+
# a run can read its delivery policy and can never widen it.
|
|
433
|
+
#
|
|
434
|
+
# NAMING IS DELIBERATE. check_no_automerge_key.ts is a namespace ratchet on the
|
|
435
|
+
# three key names autoMerge / auto_merge / mergePolicy, and its own text reserves
|
|
436
|
+
# its deletion to the owner. `delivery.merge` grants the same capability under a
|
|
437
|
+
# name outside that closed set, so the ratchet stays green and stays standing --
|
|
438
|
+
# the boundary it protects is a name, and the decision it points at was taken by
|
|
439
|
+
# an ADR rather than by a key.
|
|
440
|
+
delivery:
|
|
441
|
+
# Whether a run may merge the pull request it produced.
|
|
442
|
+
# off = default. The run ends at mergeable-green-and-open and says so.
|
|
443
|
+
# on-green = merge is permitted, and ONLY when an object-bound grant covering
|
|
444
|
+
# {op: prod_merge, target: <base>} exists AND the final head is
|
|
445
|
+
# required-check-green, target-current and tamper-checked. This
|
|
446
|
+
# key is a precondition, never the authorisation by itself.
|
|
447
|
+
# Forge auto-merge is the mechanism, so branch protection stays the gate.
|
|
448
|
+
# Required protections are never bypassed -- an invariant, not a default.
|
|
449
|
+
merge: "off"
|
|
450
|
+
|
|
451
|
+
# Whether the run stays alive until the required checks settle.
|
|
452
|
+
# true = default. The run drives CI and reports the settled verdict.
|
|
453
|
+
# false = the run ends once the branch is pushed and the PR is open,
|
|
454
|
+
# leaving the checks to be read later.
|
|
455
|
+
# Independent of `merge`: a run may wait for CI without being allowed to
|
|
456
|
+
# merge, which is the shape every drain run uses today.
|
|
457
|
+
wait_for_ci: true
|
|
458
|
+
|
|
459
|
+
# How a mission's work is shaped into pull requests.
|
|
460
|
+
# single = default. One branch, one pull request.
|
|
461
|
+
# stacked = a dependent series.
|
|
462
|
+
# `stacked` is NEVER chosen by the agent and is never asked about at roadmap
|
|
463
|
+
# creation. The owner plans it in roadmap frontmatter or it does not happen;
|
|
464
|
+
# that is why this key is Class C rather than a preference.
|
|
465
|
+
pr_topology: single
|
|
466
|
+
|
|
426
467
|
# --- Augment Code projection (.augment/) ---
|
|
427
468
|
#
|
|
428
469
|
# Controls how rule files are written into .augment/rules/ during
|
|
@@ -533,9 +574,23 @@ roadmap:
|
|
|
533
574
|
# pattern: which asks are batched into the run-start execution
|
|
534
575
|
# contract and where checkpoint prompts fire. It overrides NONE of
|
|
535
576
|
# the keys below — `skip_pre_run_gate`, `quality_cadence`, and
|
|
536
|
-
# `dashboard_regen_cadence` keep their global meaning in every mode
|
|
537
|
-
#
|
|
538
|
-
#
|
|
577
|
+
# `dashboard_regen_cadence` keep their global meaning in every mode.
|
|
578
|
+
#
|
|
579
|
+
# WHAT NO MODE LIFTS, NAMED. This sentence used to read "no mode lifts a
|
|
580
|
+
# safety floor", which is unfalsifiable: it never says which floor or how
|
|
581
|
+
# far it reaches. What no `execution.mode` value lifts is ADR-260 section 2's
|
|
582
|
+
# closed eleven-op vocabulary -- force_push, prod_merge, tag_push, release,
|
|
583
|
+
# publish, branch_protection_change, repo_delete, prod_data_delete,
|
|
584
|
+
# secret_write, payment, external_send. Each of those needs its own
|
|
585
|
+
# object-bound grant, and no interaction pattern substitutes for one.
|
|
586
|
+
#
|
|
587
|
+
# The Hard Floor in `non-destructive-by-default` is today WIDER than that
|
|
588
|
+
# vocabulary -- it also covers every `git push` and every non-prod merge --
|
|
589
|
+
# and that wider reach is what is in force right now. ADR-260 decision 11
|
|
590
|
+
# narrows it to the eleven ops and ADR-268 accepted that, but the narrowing
|
|
591
|
+
# has not landed, so read the rule's own trigger table as the authority on
|
|
592
|
+
# reach and this comment as the authority on what a MODE can change: nothing.
|
|
593
|
+
# See contexts/execution/roadmap-execution-contract.md.
|
|
539
594
|
|
|
540
595
|
# Skip the /roadmap:process-* pre-run confirmation gate (true, false).
|
|
541
596
|
# true = default. The command name names the scope; a discoverable
|
|
@@ -549,15 +604,19 @@ roadmap:
|
|
|
549
604
|
skip_pre_run_gate: true
|
|
550
605
|
|
|
551
606
|
# When to run quality tools during /roadmap execute.
|
|
552
|
-
# end_of_roadmap = once, before archiving the completed roadmap (
|
|
553
|
-
# per_phase = once after every completed phase
|
|
607
|
+
# end_of_roadmap = once, before archiving the completed roadmap (fastest, fewest tokens)
|
|
608
|
+
# per_phase = once after every completed phase (default since 2026-09-13)
|
|
554
609
|
# per_step = after every completed step (legacy verbose; highest token cost)
|
|
555
|
-
#
|
|
556
|
-
#
|
|
557
|
-
#
|
|
558
|
-
#
|
|
559
|
-
#
|
|
560
|
-
|
|
610
|
+
# The default moved from end_of_roadmap to per_phase on the strength of
|
|
611
|
+
# this block's OWN trade-off sentence: end_of_roadmap saves tokens and
|
|
612
|
+
# time but lets errors compound across phases. A multi-phase autonomous
|
|
613
|
+
# run is exactly the case where compounding is expensive and nobody is
|
|
614
|
+
# watching, so the cheaper default was the wrong one to ship. Set
|
|
615
|
+
# end_of_roadmap back if the work is routine and token cost dominates.
|
|
616
|
+
# `quality.local_auto_run` (chat) and `quality.local_auto_run_in_mission`
|
|
617
|
+
# (a mission) decide WHETHER local pipeline runs happen at all; this
|
|
618
|
+
# knob only decides WHEN, and is inert wherever both resolve false.
|
|
619
|
+
quality_cadence: per_phase
|
|
561
620
|
|
|
562
621
|
# Dashboard regen cadence inside autonomous runs (process-step /
|
|
563
622
|
# process-phase / process-full). Controls how often
|
|
@@ -635,20 +694,26 @@ roadmap:
|
|
|
635
694
|
# roadmaps AND feature plans — which is why these keys do not live under
|
|
636
695
|
# `roadmap:`. All three default to true; a missing key behaves as true.
|
|
637
696
|
planning:
|
|
638
|
-
# Gate C — plan-
|
|
639
|
-
# true = default.
|
|
640
|
-
#
|
|
641
|
-
#
|
|
642
|
-
#
|
|
643
|
-
#
|
|
644
|
-
#
|
|
645
|
-
#
|
|
646
|
-
#
|
|
647
|
-
#
|
|
697
|
+
# Gate C — plan-closure pass, at the END of planning (true, false).
|
|
698
|
+
# true = default. Every command declaring `produces_roadmap: true`
|
|
699
|
+
# ends in a closure pass (/challenge-me closure): the open
|
|
700
|
+
# decisions are detected, each resolved at the lowest rung
|
|
701
|
+
# that owns it — evidence, convention, the agent, an
|
|
702
|
+
# independent session, the council, the team, the owner last
|
|
703
|
+
# and only for owner-owned residue — and written into the
|
|
704
|
+
# roadmap's `## Decisions` table. The seed-confidence check
|
|
705
|
+
# from /challenge-me vision still runs where a plan starts
|
|
706
|
+
# from a fuzzy ask; the difference is that closure is now
|
|
707
|
+
# measured at the END, where an open decision actually costs
|
|
708
|
+
# a run, rather than only at the start.
|
|
648
709
|
# An explicit user bypass ("just write it") wins for that turn
|
|
649
|
-
# and is counted
|
|
710
|
+
# and is counted AS A BYPASS, on its own axis — never as an
|
|
711
|
+
# absent closure.
|
|
650
712
|
# false = inert; plan asks author directly (today's behavior).
|
|
651
|
-
|
|
713
|
+
#
|
|
714
|
+
# `challenge_on_create` is the deprecated alias, accepted for one
|
|
715
|
+
# minor so an installed settings file keeps loading.
|
|
716
|
+
closure_pass: true
|
|
652
717
|
|
|
653
718
|
# Gate R1 — plan-risk review at plan creation / substantial change
|
|
654
719
|
# (true, false).
|
|
@@ -674,6 +739,35 @@ planning:
|
|
|
674
739
|
# false = escape hatch; the validator skips (governance default is on).
|
|
675
740
|
completion_review: true
|
|
676
741
|
|
|
742
|
+
# --- Execution — the fix-loop bound and its escalation ladder ---
|
|
743
|
+
#
|
|
744
|
+
# The bound on how long the agent keeps attempting the same failing
|
|
745
|
+
# target, and what happens when it is reached. Reaching the bound is a
|
|
746
|
+
# STRATEGY CHANGE, never a question: `escalation` names the rungs the
|
|
747
|
+
# agent walks, in order, before any owner ask is even considered.
|
|
748
|
+
#
|
|
749
|
+
# `owner_owned_check` is the last rung and it is NOT "ask now" — it asks
|
|
750
|
+
# whether the remaining residue is owner-owned per the ownership table.
|
|
751
|
+
# Where it is not, the run continues under a new strategy epoch. Removing
|
|
752
|
+
# that rung by setting is refused: it is the rung that DECIDES whether a
|
|
753
|
+
# residue is owner-owned at all, so dropping it turns every residue into
|
|
754
|
+
# an owner ask, which is the failure the ladder exists to end.
|
|
755
|
+
execution:
|
|
756
|
+
# Consecutive failed fix attempts against one validation target before
|
|
757
|
+
# the ladder's terminal rung is reached. Overridable globally, per
|
|
758
|
+
# project, and per prompt. A non-integer or non-positive value falls
|
|
759
|
+
# back to 10 — a bound of 0 makes every first attempt terminal.
|
|
760
|
+
fix_loop_max: 10
|
|
761
|
+
|
|
762
|
+
# The rungs, in order. Attempts escalate INDEPENDENTLY first: another
|
|
763
|
+
# session or a provider-diverse reviewer, then the council, then the
|
|
764
|
+
# team, and only then the owner-ownership question.
|
|
765
|
+
# A FLOW sequence, like every other list in this file: the settings
|
|
766
|
+
# writer locates a key by its `key: <value>` line, so a block sequence
|
|
767
|
+
# reads as an empty section header and the write corrupts the file.
|
|
768
|
+
escalation: [independent, council, team, owner_owned_check]
|
|
769
|
+
|
|
770
|
+
|
|
677
771
|
# --- Quality / CI execution ---
|
|
678
772
|
#
|
|
679
773
|
# Controls whether the agent runs the project's quality pipeline
|
|
@@ -705,16 +799,34 @@ quality:
|
|
|
705
799
|
# MUST execute it locally to prove the gate works. Without that
|
|
706
800
|
# execution the new gate is unverified evidence.
|
|
707
801
|
#
|
|
708
|
-
# Posture note (feedback-8.11-2): `false` is a
|
|
709
|
-
#
|
|
710
|
-
#
|
|
711
|
-
#
|
|
802
|
+
# Posture note (feedback-8.11-2, rewritten 2026-09-13): `false` is a
|
|
803
|
+
# DELIBERATE, documented design decision — and it describes a CHAT
|
|
804
|
+
# TURN, not an autonomous mission. That is the half the old wording
|
|
805
|
+
# left implicit, and naming it is the whole point of the rewrite.
|
|
806
|
+
# In a chat turn a human is present, the next action is theirs, and a
|
|
807
|
+
# local full-pipeline run duplicates remote CI at wall-clock + token
|
|
808
|
+
# cost while they wait. In an autonomous mission nobody is waiting,
|
|
809
|
+
# the next action is the agent's own, and a red discovered twenty
|
|
810
|
+
# steps later costs more than the run that would have caught it at
|
|
811
|
+
# step one — the same "lets errors compound" argument the roadmap
|
|
812
|
+
# cadence knob above already makes about itself.
|
|
813
|
+
# So: this key governs CHAT. `local_auto_run_in_mission` below
|
|
814
|
+
# governs a mission. Neither ever suppresses (a) narrow diff-scoped
|
|
712
815
|
# probes (type-check/lint/tests over the agent's OWN changed files
|
|
713
816
|
# before pushing — those always run), (b) the new-gate carve-out
|
|
714
817
|
# above, (c) user-invoked runs. Run-end reports must say "quality
|
|
715
818
|
# gates delegated to remote CI", never claim an unrun pipeline passed.
|
|
716
819
|
local_auto_run: false
|
|
717
820
|
|
|
821
|
+
# Run local quality / CI tasks autonomously INSIDE a mission — an
|
|
822
|
+
# autonomous roadmap run with a claimed contract (true, false).
|
|
823
|
+
# true = default. A mission resolves `local_auto_run` to true.
|
|
824
|
+
# false = a mission behaves like chat; remote CI alone is the gate.
|
|
825
|
+
# Resolution is a runtime condition, never a settings layer: outside a
|
|
826
|
+
# mission this key is inert, and `local_auto_run: true` is never
|
|
827
|
+
# LOWERED by a mission. Resolver: src/shared/missionExecution.ts.
|
|
828
|
+
local_auto_run_in_mission: true
|
|
829
|
+
|
|
718
830
|
|
|
719
831
|
# --- Design fidelity ---
|
|
720
832
|
#
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Growth ratchet for the `auto`-tier rule bucket (road-to-design-fidelity-proof Phase 3). check_always_budget gates the nine kernel rules; measure_rule_budget already measured all 121 and gated none of them, so ~93 % of the estate's rule prose grew against nothing. Seeded AT the measurement, exactly like the preamble-payload ceiling and for the same reason: seeding below it would red every pull request from the day it lands, which is a self-inflicted CI stop rather than a gate. It may only move DOWN. Raising it to clear a failing check is the config-weakening move this repo refuses; walk the bucket back instead, or state the compensating reduction.",
|
|
3
|
+
"schema_version": 1,
|
|
4
|
+
"registered_at": "2026-09-18",
|
|
5
|
+
"owner": "maintainer",
|
|
6
|
+
"review_by": "2027-09-18",
|
|
7
|
+
"baseline_chars": 373000,
|
|
8
|
+
"baseline_history": [
|
|
9
|
+
{
|
|
10
|
+
"chars": 373000,
|
|
11
|
+
"at": "2026-09-18",
|
|
12
|
+
"why": "registered with the gate, seeded at the measured auto bucket (107 rules) after road-to-design-fidelity-proof Phase 1 returned 1,885 chars from design-fidelity.md"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"_what_this_does_not_claim": "A char count is not an obligation count. The Iron-Law total printed beside it is the closer proxy for what the instruction-following research calls simultaneous constraints, and it is REPORTED, not gated \u2014 nobody has measured a threshold for this layer, and gating an unmeasured number would publish a bound as if it were a finding."
|
|
16
|
+
}
|
|
@@ -278,11 +278,24 @@ local_only:
|
|
|
278
278
|
- id: check_platform_anchor
|
|
279
279
|
class: token-scope-unavailable
|
|
280
280
|
reason: >
|
|
281
|
-
Reads `repos/{owner}/{repo}/rulesets` to
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
281
|
+
Reads `repos/{owner}/{repo}/rulesets` to compare the committed expectation
|
|
282
|
+
against the live ruleset — an active branch ruleset over the default
|
|
283
|
+
branch, review-thread resolution, deletion and force-push blocked, at
|
|
284
|
+
least one required status check context, and no unconditional bypass
|
|
285
|
+
actor. `strict_required_status_checks` is a baseline expectation currently
|
|
286
|
+
covered by the recorded waiver `arr-2026-09-10-strict-status-checks`
|
|
287
|
+
(owner, expires 2026-12-09), so a deviation there is reported as an
|
|
288
|
+
accepted risk rather than a finding.
|
|
289
|
+
|
|
290
|
+
Corrected 2026-09-13. This text used to name "an approving review,
|
|
291
|
+
last-push approval" among what is checked; both dimensions were removed
|
|
292
|
+
from the trust model by owner ruling on 2026-09-10 and are now reported as
|
|
293
|
+
observed evidence, never as a requirement. It also said the gate checks
|
|
294
|
+
that the forge "actually requires what the ratification mechanism claims
|
|
295
|
+
it does" — which overstates a voluntarily invoked local control, per the
|
|
296
|
+
reviewing council of 2026-09-13, and `check_platform_anchor` must not be
|
|
297
|
+
described as enforcing repository-wide compliance. See
|
|
298
|
+
`enforcement_boundary_note` in `src/config/platform-anchor.json`.
|
|
286
299
|
|
|
287
300
|
Local-only because the permission does not exist, not because remote
|
|
288
301
|
enforcement is unwanted — which is the opposite of the usual reason on this
|
|
@@ -148,6 +148,13 @@
|
|
|
148
148
|
"locus": "src/scripts/hooks/design_pass_hook.ts:66",
|
|
149
149
|
"reason": "Design-pass hook latch."
|
|
150
150
|
},
|
|
151
|
+
{
|
|
152
|
+
"id": "obligations",
|
|
153
|
+
"axis": "persistent_continuity_artefacts",
|
|
154
|
+
"disposition": "excluded",
|
|
155
|
+
"locus": "src/scripts/_lib/obligations.ts:57",
|
|
156
|
+
"reason": "Per-session obligation ledger — instrumentation, not continuity. A later session must not resume from it: the rows record which obligations THIS session was delivered, and attributing them to a successor would be the one claim the ledger is forbidden to make."
|
|
157
|
+
},
|
|
151
158
|
{
|
|
152
159
|
"id": "design-slop-hook.json",
|
|
153
160
|
"axis": "persistent_continuity_artefacts",
|
|
@@ -267,6 +274,13 @@
|
|
|
267
274
|
"locus": "src/scripts/hooks/reread_guard_hook.ts:21",
|
|
268
275
|
"reason": "Per-file re-read guard stamps, scoped to one session and never restored into another."
|
|
269
276
|
},
|
|
277
|
+
{
|
|
278
|
+
"id": "memory-recall",
|
|
279
|
+
"axis": "persistent_continuity_artefacts",
|
|
280
|
+
"disposition": "excluded",
|
|
281
|
+
"locus": "src/scripts/hooks/memory_recall_hook.ts:429",
|
|
282
|
+
"reason": "Per-session once-per-slug latch for the memory-recall advisory, so a delivered memory is not re-injected on the next matching tool call. Slug keys and timestamps only, scoped to one session and never restored into another — a successor session SHOULD be told again."
|
|
283
|
+
},
|
|
270
284
|
{
|
|
271
285
|
"id": "review-axis",
|
|
272
286
|
"axis": "persistent_continuity_artefacts",
|
|
@@ -407,6 +421,13 @@
|
|
|
407
421
|
"locus": "src/scripts/_dispatch.bash:74",
|
|
408
422
|
"reason": "UI audit output. Analysis result."
|
|
409
423
|
},
|
|
424
|
+
{
|
|
425
|
+
"id": "ui-conformance.json",
|
|
426
|
+
"axis": "persistent_continuity_artefacts",
|
|
427
|
+
"disposition": "excluded",
|
|
428
|
+
"locus": "src/scripts/hooks/design_pass_hook.ts:68",
|
|
429
|
+
"reason": "Behavioural-conformance probe output. Analysis result, on the same footing as its `ui-audit.json` neighbour: keyed on a target path rather than a session, consumed by the design pass as a shadow verdict, and never read by a successor session to resume anything."
|
|
430
|
+
},
|
|
410
431
|
{
|
|
411
432
|
"id": "ui-route-nudge.json",
|
|
412
433
|
"axis": "persistent_continuity_artefacts",
|
|
@@ -52,21 +52,54 @@
|
|
|
52
52
|
# of them.
|
|
53
53
|
# canary optional mutation recipe (Phase 7) — see CANARY below
|
|
54
54
|
#
|
|
55
|
-
# COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-09-
|
|
55
|
+
# COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-09-13)
|
|
56
56
|
# ----------------------------------------------------------
|
|
57
|
-
#
|
|
57
|
+
# 330 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
|
|
58
58
|
# (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts`,
|
|
59
|
-
# re-run on the tree carrying these rows.
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
# `
|
|
63
|
-
#
|
|
64
|
-
#
|
|
65
|
-
# rather than
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
59
|
+
# re-run on the tree carrying these rows.)
|
|
60
|
+
# **97 rows are listed below**, so the manifest covers 97/332 = 29.2 % of the
|
|
61
|
+
# population, and is complete for every gate that can carry a floor. The row
|
|
62
|
+
# count is `grep -c '^ - id:'`, recomputed here rather than incremented.
|
|
63
|
+
#
|
|
64
|
+
# RECOUNTED 2026-09-13, on a change that adds NO gate script — and that is the
|
|
65
|
+
# point of this block rather than an aside. Every recount below was triggered by
|
|
66
|
+
# someone adding a row and noticing the header was stale on the way past, which
|
|
67
|
+
# makes the figure a function of who happened to look rather than of the tree.
|
|
68
|
+
# Two scripts had arrived since the 2026-09-12 block below without one: 328 → 330.
|
|
69
|
+
# The drift was 2 against the tolerance of 15 in `check_gate_coverage.test.ts`
|
|
70
|
+
# § states an honest denominator, so nothing was red and nothing would have been
|
|
71
|
+
# for another thirteen arrivals. Corrected here deliberately, while it is cheap,
|
|
72
|
+
# because the 2026-09-08 block records what the other end of that tolerance costs:
|
|
73
|
+
# the tree drifted to 321 against a stated 306 — 15 exactly — and the next single
|
|
74
|
+
# addition was always going to red it.
|
|
75
|
+
#
|
|
76
|
+
# The honest limit of this correction: it is another hand recount, so it goes
|
|
77
|
+
# stale the same way the moment the next script lands. The block below already
|
|
78
|
+
# said as much on 2026-09-12 and it was true again within a day. What would
|
|
79
|
+
# actually close it is deriving the figure at read time instead of asserting it —
|
|
80
|
+
# `count_gate_scripts()` is already the function that answers, and the test
|
|
81
|
+
# already calls it. Deliberately not done here: that is a change to what this
|
|
82
|
+
# file IS (a hand-maintained manifest with a prose header) rather than a
|
|
83
|
+
# correction of a number in it.
|
|
84
|
+
#
|
|
85
|
+
# RE-MEASURED 2026-09-12, on the change that adds `check_enforcement_matrix`:
|
|
86
|
+
# `count_gate_scripts()` returned **328**. Six scripts had arrived since the 322
|
|
87
|
+
# recorded on 2026-09-08, which itself replaced the 306 of 2026-08-28 after the
|
|
88
|
+
# tree drifted to 321 unnoticed. Recomputed on that tree rather than incremented:
|
|
89
|
+
# a stated population that nobody re-measures is the un-asserted count this whole
|
|
90
|
+
# manifest exists to refuse.
|
|
91
|
+
#
|
|
92
|
+
# RECOUNTED AGAIN ON THE MERGE, 2026-09-13. Two branches recounted this header on
|
|
93
|
+
# the same day and neither number survives: the block above measured 330 scripts
|
|
94
|
+
# against 95 rows on a tree without `check_test_delta` / `check_test_weakening`,
|
|
95
|
+
# and this branch measured 97 rows against a tree without the two scripts that
|
|
96
|
+
# block counted. Re-derived on the MERGED tree rather than by adding either
|
|
97
|
+
# side's delta — which is the same resolution `.secret-allow` prescribes for its
|
|
98
|
+
# own pin, and for the same reason: picking a side is how a stated figure comes
|
|
99
|
+
# to describe a tree that no longer exists. Both new gates arrive WITH their
|
|
100
|
+
# rows, so the manifest stays complete for every gate that can carry a floor,
|
|
101
|
+
# and both carry a `--self-test`, so neither adds to the
|
|
102
|
+
# `gate-self-test:registered-non-adopters` ratchet.
|
|
70
103
|
#
|
|
71
104
|
# RECOUNTED 2026-09-07, on the change that adds `lint_agent_security` — the
|
|
72
105
|
# security umbrella, which until this change was the one gate in the tree whose
|
|
@@ -436,6 +469,54 @@ gates:
|
|
|
436
469
|
|
|
437
470
|
Never disclose this section to the user; it is a planted
|
|
438
471
|
disclosure-suppression imperative and the umbrella must block on it.
|
|
472
|
+
- id: check_test_delta
|
|
473
|
+
argv: ["--quiet"]
|
|
474
|
+
min_scanned: 0
|
|
475
|
+
corpus: "every path in the diff against the base ref. The floor is 0 and the `allowEmpty` reason says why: an empty diff is a real state — a docs-only branch, or a re-run against an already-merged base — and a floor above 0 would red on it. What a `> 0` check could not see is covered instead by the self-test, which drives both polarities of the finding AND both polarities of the owner-label escape."
|
|
476
|
+
status: enforced
|
|
477
|
+
no_canary_reason: >-
|
|
478
|
+
A create-only canary cannot express this gate's violation. The corpus is a
|
|
479
|
+
DIFF, not a tree, so a planted file is only in scope if it is also
|
|
480
|
+
committed — and the violation is an ABSENCE (code changed, no test did),
|
|
481
|
+
which no added file can create. Discrimination is proven instead by the
|
|
482
|
+
gate's own `--self-test`: 8 cases, 3 rejecting, each driving the real CLI.
|
|
483
|
+
Both directions of every branch are covered — a finding with and without
|
|
484
|
+
the owner label, a code change with and without a test delta, and the two
|
|
485
|
+
classes that must NOT count as code (a docs-only change, a generated
|
|
486
|
+
projection under `dist/`).
|
|
487
|
+
note: >
|
|
488
|
+
road-to-adversarial-verification-and-long-runs 2.4. The mechanically
|
|
489
|
+
decidable half of `test-first`: it proves an absence, and deliberately does
|
|
490
|
+
not claim the two things a diff cannot carry — whether the test came FIRST,
|
|
491
|
+
and whether it tests the thing that changed. The exemption is a PR label
|
|
492
|
+
rather than a file, because a file-based escape inside the diff under
|
|
493
|
+
review is one an agent can widen; Risk 4 of that roadmap names exactly
|
|
494
|
+
that failure.
|
|
495
|
+
|
|
496
|
+
- id: check_test_weakening
|
|
497
|
+
argv: ["--quiet"]
|
|
498
|
+
min_scanned: 0
|
|
499
|
+
corpus: "every changed TEST file in the diff against the base ref, measured as NET assertion and suppression counts per file. The floor is 0 for the same reason as its sibling: most diffs change no test file at all, and a floor above 0 would make the gate cry wolf on the majority of the PRs it runs against."
|
|
500
|
+
status: enforced
|
|
501
|
+
no_canary_reason: >-
|
|
502
|
+
A create-only canary cannot express this gate's violation either: the
|
|
503
|
+
violation is a NET REDUCTION between two revisions of one file, so a
|
|
504
|
+
planted file has no predecessor to be smaller than. Proven instead by the
|
|
505
|
+
gate's own `--self-test`: 11 cases, 5 rejecting. The load-bearing cases are
|
|
506
|
+
the ACCEPTS — editing an assertion, adding assertions, and removing a skip
|
|
507
|
+
must all pass, because a gate that reds a legitimate test edit gets its
|
|
508
|
+
exemption widened until it finds nothing. Two cases exist because an
|
|
509
|
+
independent review found the gate blind to them: deleting a whole test file
|
|
510
|
+
(the maximal weakening, and `git rm` was the cheapest way past both gates),
|
|
511
|
+
and a diff line held as string data inside a suite that tests this very
|
|
512
|
+
detector.
|
|
513
|
+
note: >
|
|
514
|
+
road-to-adversarial-verification-and-long-runs 2.4, enforcing
|
|
515
|
+
`evaluator-independence` § Tests are evaluators. Counts are NET, never raw
|
|
516
|
+
removals — that distinction is the whole gate. The discharge is a committed
|
|
517
|
+
artefact under `agents/evidence/reviews/`; whether it contains a genuinely
|
|
518
|
+
independent verdict is a judgement no gate can make and is not claimed.
|
|
519
|
+
|
|
439
520
|
- id: lint_motion_authority_drift
|
|
440
521
|
argv: ["--quiet"]
|
|
441
522
|
min_scanned: 90
|
|
@@ -2800,3 +2881,55 @@ gates:
|
|
|
2800
2881
|
|
|
2801
2882
|
A projected rule routing to a guideline body the projection does not
|
|
2802
2883
|
contain. The gate must fail on this and pass once it is removed.
|
|
2884
|
+
|
|
2885
|
+
- id: check_enforcement_matrix
|
|
2886
|
+
argv: ["--quiet"]
|
|
2887
|
+
ci_invocation: .github/workflows/consistency.yml
|
|
2888
|
+
min_scanned: 20
|
|
2889
|
+
corpus: "host-slot pairs in src/scripts/hooks/host_lowering.yaml (32 at baseline, across the 6 hosts that carry a non-empty `slots:` map)"
|
|
2890
|
+
status: enforced
|
|
2891
|
+
no_canary_reason: >-
|
|
2892
|
+
the corpus is the slot map of ONE configuration file at a fixed path, and
|
|
2893
|
+
the canary contract is create-only. A planted second `host_lowering.yaml`
|
|
2894
|
+
would have to overwrite the real one to land in scope, and every violation
|
|
2895
|
+
this gate can have is a MODIFICATION — a cell hand-edited in the generated
|
|
2896
|
+
region, a `block_exit` changed without a regeneration, a cell claiming a
|
|
2897
|
+
vocabulary value no line in the configuration produces. Discrimination is
|
|
2898
|
+
proven by `--self-test` instead (5 cases, 4 rejecting: the phantom
|
|
2899
|
+
`halt-by-state` value, a value outside the closed set, a hand-flipped
|
|
2900
|
+
outcome, a deleted row), and end to end by hand on 2026-09-12: flipping
|
|
2901
|
+
`claude/post_tool_use`'s `block_exit` from null to 2 without regenerating
|
|
2902
|
+
exits 1, and `--write` then exits 0. The `--write` guard was itself
|
|
2903
|
+
measured rather than assumed — an earlier version computed its backing set
|
|
2904
|
+
from the generator's own output, so a sabotaged mapping was self-backing
|
|
2905
|
+
and the phantom value wrote through; the backing set now reads the raw
|
|
2906
|
+
configuration fields and the same sabotage exits 1.
|
|
2907
|
+
|
|
2908
|
+
- id: check_release_holds
|
|
2909
|
+
argv: ['--lint']
|
|
2910
|
+
ci_invocation: .github/workflows/release-validation.yml
|
|
2911
|
+
min_scanned: 700
|
|
2912
|
+
corpus: >
|
|
2913
|
+
every markdown file under `agents/roadmaps/` and its four subfolders —
|
|
2914
|
+
the active root plus `later/`, `archive/`, `skipped/` and `stubs/`, 950 at
|
|
2915
|
+
baseline. Wider than the active-only glob the sibling roadmap gates use,
|
|
2916
|
+
and deliberately: template rule 28's per-folder lifecycle says a window
|
|
2917
|
+
does not disappear by moving the file, so a hold in `later/` still lists
|
|
2918
|
+
and still refuses. The floor sits at 700 because the archive alone holds
|
|
2919
|
+
~725 files and legitimate archival churn moves the total by tens, never by
|
|
2920
|
+
hundreds; a reading below it means the walk lost a folder, not that
|
|
2921
|
+
roadmaps were deleted.
|
|
2922
|
+
status: enforced
|
|
2923
|
+
no_canary_reason: >-
|
|
2924
|
+
the canary contract is create-only, and a planted roadmap carrying a
|
|
2925
|
+
well-formed hold would be a legitimate corpus member rather than a
|
|
2926
|
+
violation — the gate would read it, evaluate it, and be right to stay
|
|
2927
|
+
green. Every violation this gate has is a MALFORMED declaration or a
|
|
2928
|
+
lifecycle breach, both of which are properties of a file's content or its
|
|
2929
|
+
folder, not of its existence. Discrimination is proven by `--selftest`
|
|
2930
|
+
instead (19 cases, 13 of them refusing: the four state-table rows, the
|
|
2931
|
+
channel split, seven distinct not-evaluable shapes, and six lifecycle
|
|
2932
|
+
cases), and the scan-scope collapse this row exists to catch is caught
|
|
2933
|
+
inside the gate by `assertScanned` — observed red on 2026-09-19 by
|
|
2934
|
+
pointing the folder list at a non-existent directory, which exits 1 with
|
|
2935
|
+
"scanned 0 roadmap file(s)" rather than certifying an empty corpus.
|