@event4u/agent-config 16.2.0 → 16.3.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 +89 -237
- package/README.md +14 -12
- package/dist/agent-src/commands/analyze/inbox.md +1 -1
- package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
- package/dist/agent-src/commands/bug/fix.md +17 -2
- package/dist/agent-src/commands/feature/plan.md +1 -1
- package/dist/agent-src/commands/feature/roadmap.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +1 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +4 -4
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
- package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
- package/dist/agent-src/commands/roadmap.md +18 -4
- package/dist/agent-src/commands/tests/create.md +17 -3
- package/dist/agent-src/commands/tests/execute.md +22 -5
- package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
- package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
- package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -0
- package/dist/agent-src/rules/broken-access-control.md +1 -0
- package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
- package/dist/agent-src/rules/context-hygiene.md +1 -1
- package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
- package/dist/agent-src/rules/design-fidelity.md +13 -16
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
- package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
- package/dist/agent-src/rules/domain-safety-pii.md +1 -0
- package/dist/agent-src/rules/domain-safety-retention.md +1 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
- package/dist/agent-src/rules/evaluator-independence.md +3 -2
- package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
- package/dist/agent-src/rules/finance-safety-floor.md +1 -0
- package/dist/agent-src/rules/git-history-discipline.md +1 -0
- package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
- package/dist/agent-src/rules/legal-safety-floor.md +3 -2
- package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
- package/dist/agent-src/rules/media-governance-routing.md +14 -17
- package/dist/agent-src/rules/persona-governance.md +2 -2
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
- package/dist/agent-src/rules/question-not-instruction.md +1 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/runtime-safety.md +1 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
- package/dist/agent-src/rules/session-canary.md +8 -62
- package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
- package/dist/agent-src/rules/source-confidentiality.md +1 -0
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
- package/dist/agent-src/rules/tool-safety.md +1 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
- package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/dist/agent-src/scripts/deferral_carry.ts +339 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
- package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
- package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
- package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/cli/registry.js +1 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
- package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
- package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
- package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
- package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
- package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
- package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
- package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-JQVYKIZA.js} +10 -0
- package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
- package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
- package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
- package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-NQ7WT43P.js} +1186 -244
- package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
- package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
- package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
- package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
- package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
- package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-RQNNW7IF.js} +1314 -560
- package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-S4UMZNES.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
- package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-TRI6DQZ6.js} +2781 -340
- package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
- package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
- package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
- package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
- 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 +1167 -234
- package/dist/cli-delegate/cmd_doctor.js +13 -6
- package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
- package/dist/cli-delegate/cmd_explain.js +5 -5
- package/dist/cli-delegate/cmd_export.js +11 -8
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_handoff.js +10 -7
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +3 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +3 -3
- package/dist/cli-delegate/cmd_preflight.js +6 -6
- package/dist/cli-delegate/cmd_prune.js +11 -8
- package/dist/cli-delegate/cmd_refresh.js +2 -1
- package/dist/cli-delegate/cmd_route_audit.js +8 -6
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +4 -3
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
- package/dist/cli-delegate/cmd_settings_set.js +4 -4
- package/dist/cli-delegate/cmd_sync.js +11 -8
- package/dist/cli-delegate/cmd_uninstall.js +11 -8
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +11 -8
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/deferral_carry.js +16 -0
- package/dist/cli-delegate/gate_execute.js +2 -2
- package/dist/cli-delegate/roadmap_gates.js +5 -5
- package/dist/cli-delegate/update_roadmap_progress.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +127 -75
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +7 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +6 -4
- package/dist/hooks/dispatch.js +5357 -6656
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/install/claudePathsPlan.js +47 -6
- package/dist/install/claudeRuleRewrite.js +7 -0
- package/dist/install/emit_host_rules_cli.js +39 -36
- package/dist/install/globalRuleScope.js +87 -0
- package/dist/install/host_rule_ownership.js +160 -0
- package/dist/install/install.mjs +2080 -1024
- package/dist/install/installThinLayer.js +261 -0
- package/dist/install/installedRuleLinks.js +176 -0
- package/dist/install/wizard-plan.js +24 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +31965 -27154
- package/dist/scripts/_lib/agent_settings.js +11 -0
- package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
- package/dist/scripts/_lib/installed_layer.js +378 -0
- package/dist/scripts/_lib/lean_projection_mode.js +218 -15
- package/dist/scripts/_lib/rule_consequence_class.js +45 -0
- package/dist/scripts/_lib/rule_injection.js +67 -10
- package/dist/scripts/_lib/rule_law_section.js +122 -0
- package/dist/scripts/_lib/thin_rules.js +458 -0
- package/dist/scripts/_lib/windsurf_render.js +60 -0
- package/dist/scripts/condense.js +14 -26
- package/dist/scripts/project_thin_rules.js +14 -294
- package/dist/server/schemas/settings.js +6 -0
- package/dist/shared/skillRanking.js +74 -13
- package/docs/contracts/settings-classes.md +7 -5
- package/package.json +1 -1
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/src/agent-src/scripts/deferral_carry.ts +339 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/config/agent-settings.template.yml +62 -22
- package/src/config/continuity-surface.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +96 -3
- package/src/config/gate-violation-baselines.json +17 -9
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-token-budget.json +6 -1
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/routing-coverage-seed.json +24 -3
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-consequence-class.json +161 -0
- package/src/config/rule-law-ceilings.json +99 -0
- package/src/install/claudePathsPlan.ts +46 -4
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/emit_host_rules_cli.ts +43 -34
- package/src/install/globalRuleScope.ts +109 -0
- package/src/install/host_rule_ownership.ts +170 -0
- package/src/install/installThinLayer.ts +312 -0
- package/src/install/installedRuleLinks.ts +220 -0
- package/src/install/wizard-plan.ts +24 -0
- package/src/scripts/_cli/cmd_doctor.ts +23 -71
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
- package/src/scripts/_dispatch.bash +16 -2
- package/src/scripts/_lib/agent_settings.ts +11 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/estate_offsets.ts +241 -0
- package/src/scripts/_lib/exemption_shape.ts +143 -0
- package/src/scripts/_lib/fnv.ts +23 -0
- package/src/scripts/_lib/foreign_scan.ts +106 -0
- package/src/scripts/_lib/gitignore_block.ts +314 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
- package/src/scripts/_lib/graph_feeder_record.ts +214 -0
- package/src/scripts/_lib/hook_settings.ts +73 -0
- package/src/scripts/_lib/host_capability.ts +40 -19
- package/src/scripts/_lib/host_hook_merge.ts +165 -0
- package/src/scripts/_lib/installed_layer.ts +538 -0
- package/src/scripts/_lib/json_merge.ts +82 -0
- package/src/scripts/_lib/json_pointers.ts +93 -11
- package/src/scripts/_lib/lean_projection_mode.ts +275 -15
- package/src/scripts/_lib/machine_wake.ts +16 -3
- package/src/scripts/_lib/neighbour_census.ts +760 -0
- package/src/scripts/_lib/neighbour_scan.ts +122 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- package/src/scripts/_lib/review_coverage.ts +134 -0
- package/src/scripts/_lib/rule_consequence_class.ts +71 -0
- package/src/scripts/_lib/rule_injection.ts +130 -10
- package/src/scripts/_lib/rule_law_section.ts +147 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structured_ask.ts +64 -21
- package/src/scripts/_lib/thin_rules.ts +540 -0
- package/src/scripts/_lib/touched_file_quality.ts +434 -0
- package/src/scripts/_lib/turn_end_refusals.ts +77 -2
- package/src/scripts/_lib/windsurf_render.ts +63 -0
- package/src/scripts/ai_council/cli_call_budget.ts +13 -5
- package/src/scripts/ai_council/clients.ts +26 -57
- package/src/scripts/ai_council/config.ts +1 -1
- package/src/scripts/ai_council/vendor_defaults.ts +45 -0
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/before_complete_hook.ts +243 -12
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/check_enforcement_matrix.ts +377 -20
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_finding_dispositions.ts +116 -4
- package/src/scripts/check_hook_bundle_composition.ts +370 -0
- package/src/scripts/check_kernel_edit_ratified.ts +49 -11
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_standing_rule_delivery.ts +33 -13
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/code_graph/detect.ts +127 -7
- package/src/scripts/code_graph/foreign.ts +194 -0
- package/src/scripts/code_graph/query.ts +217 -4
- package/src/scripts/code_graph/types.ts +26 -2
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +103 -0
- package/src/scripts/compile_hook_manifest.ts +33 -1
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/generate_host_cost_table.ts +1 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +150 -9
- package/src/scripts/hooks/block_config_weakening.ts +67 -2
- package/src/scripts/hooks/block_plumbing_writes.ts +29 -1
- package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/dispatch_hook.ts +52 -52
- package/src/scripts/hooks/exit_codes.ts +2 -1
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.ts +19 -1
- package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/rule_inject_hook.ts +757 -63
- package/src/scripts/hooks/table_fingerprint.ts +21 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +64 -8
- package/src/scripts/hooks/turn_end_gate_hook.ts +84 -0
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install.ts +72 -185
- package/src/scripts/installed_layer_report.ts +103 -0
- package/src/scripts/language_mirror_hook.ts +15 -6
- package/src/scripts/learning_sidecar.ts +119 -8
- package/src/scripts/lint_hook_manifest.ts +53 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +63 -5
- package/src/scripts/lint_rule_law_section.ts +517 -0
- package/src/scripts/lint_workflow_security.ts +161 -5
- package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
- package/src/scripts/mcp_server/graph_tools.ts +72 -3
- package/src/scripts/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +216 -8
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/model_rule_injection.ts +52 -5
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +157 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_obligation_mechanism.ts +230 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_ranker_confusion.ts +442 -0
- package/src/scripts/report_standing_payload_by_host.ts +188 -15
- package/src/scripts/report_verification_record_coverage.ts +306 -0
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/review-findings.schema.json +3 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/self_review_gate.ts +62 -7
- package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
- package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
- package/src/scripts/sync_gitignore.ts +29 -235
- package/src/scripts/trigger_eval_grandfather.json +0 -5
- package/src/server/schemas/settings.ts +10 -0
- package/src/shared/skillRanking.ts +117 -11
- package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
|
@@ -953,6 +953,22 @@ consistency:
|
|
|
953
953
|
# flags + pre-redacts — never a clearance; the gate for a data-bearing screenshot
|
|
954
954
|
# is human confirmation (routing into `non-destructive-by-default`, since a
|
|
955
955
|
# shipped screenshot is an irreversible published egress).
|
|
956
|
+
code_graph:
|
|
957
|
+
# Extra paths, relative to the project root, where THIS project keeps a
|
|
958
|
+
# code-graph index another tool wrote. The built-in list is deliberately
|
|
959
|
+
# generic (`graph.json`, `code-graph.json`, `.code-graph/graph.json`) and
|
|
960
|
+
# names no vendor; if your tool writes its index elsewhere, name the path
|
|
961
|
+
# here rather than waiting for this package to learn about that tool.
|
|
962
|
+
#
|
|
963
|
+
# A graph found this way LOADS and answers `query` and `explain`, with every
|
|
964
|
+
# edge tagged as read-from-elsewhere. The gate verbs (`impact`, `untested`,
|
|
965
|
+
# `dead`) refuse a graph made only of such edges and say why — an empty
|
|
966
|
+
# answer from a gate reads as "nothing found" rather than "nothing trusted".
|
|
967
|
+
#
|
|
968
|
+
# Absolute paths and paths escaping the project root are ignored.
|
|
969
|
+
# Default: [] (the built-in list only).
|
|
970
|
+
consumer_index_paths: []
|
|
971
|
+
|
|
956
972
|
screenshots:
|
|
957
973
|
# Public identity tokens that are SAFE to show unredacted — the maintainer's
|
|
958
974
|
# OWN public handles (e.g. a username shown in an admin panel) plus well-known
|
|
@@ -1482,6 +1498,27 @@ hooks:
|
|
|
1482
1498
|
injection_scan:
|
|
1483
1499
|
enabled: false
|
|
1484
1500
|
|
|
1501
|
+
# Shadow quality pass over the files a turn edited
|
|
1502
|
+
# (road-to-touched-files-that-pass-their-own-tools, Phase 1). Default `off`.
|
|
1503
|
+
#
|
|
1504
|
+
# off the recorder behaves exactly as it did before this key existed —
|
|
1505
|
+
# nothing spawns, no manifest is read, no new field is written.
|
|
1506
|
+
# shadow at stop, the commands YOUR toolchain already resolves
|
|
1507
|
+
# (`npx eslint`, `vendor/bin/phpstan analyse`, `ruff check`, …) run
|
|
1508
|
+
# against the touched files and the result lands in `quality_runs[]`
|
|
1509
|
+
# in the per-session record. Nothing is emitted and nothing blocks.
|
|
1510
|
+
# warn the same, plus ONE advisory line (≤ 200 bytes) naming the command
|
|
1511
|
+
# and the file when a check came back non-zero. Still exit 0 —
|
|
1512
|
+
# this hook is observability infra and never blocks.
|
|
1513
|
+
#
|
|
1514
|
+
# Three properties worth knowing before switching it on: a command that writes
|
|
1515
|
+
# files runs only in its check form (`pint --test`) or not at all; a command
|
|
1516
|
+
# with no per-file form (`tsc --noEmit`, `go vet ./...`) is skipped rather than
|
|
1517
|
+
# run project-wide at every stop; and a recorded quality run is NEVER read as
|
|
1518
|
+
# verification — `verified_this_turn` is unaffected by anything here.
|
|
1519
|
+
verify_before_complete:
|
|
1520
|
+
touched_file_quality: "off" # quoted: bare `off` is boolean false in YAML 1.1
|
|
1521
|
+
|
|
1485
1522
|
# NOTE — `turn_end_gate` has no keys here any more. The stop-slot turn-end
|
|
1486
1523
|
# gate is ALWAYS ARMED (2026-08-12); `hooks.turn_end_gate.*` was removed and
|
|
1487
1524
|
# a leftover block warns once on stderr and is ignored. Whether it fires is
|
|
@@ -1576,34 +1613,37 @@ hooks:
|
|
|
1576
1613
|
ui_route_nudge:
|
|
1577
1614
|
enabled: false
|
|
1578
1615
|
|
|
1579
|
-
#
|
|
1580
|
-
#
|
|
1581
|
-
#
|
|
1582
|
-
#
|
|
1583
|
-
#
|
|
1584
|
-
#
|
|
1585
|
-
#
|
|
1586
|
-
#
|
|
1616
|
+
# INERT, AND REGISTERED ON PURPOSE (ADR-124 Phase 4 -> ADR-259).
|
|
1617
|
+
#
|
|
1618
|
+
# Nothing reads this key. The PreToolUse nudge it used to gate was replaced
|
|
1619
|
+
# on 2026-09-07 by the `code-graph-context` concern
|
|
1620
|
+
# (src/scripts/hooks/code_graph_context_hook.ts), which reads no flag: it is
|
|
1621
|
+
# silent whenever no graph source exists, so a consumer who never runs
|
|
1622
|
+
# `agent-config code-graph build` never hears from it, and the flag's premise
|
|
1623
|
+
# — "do not advertise a capability the consumer cannot have" — is gone.
|
|
1624
|
+
# Setting this to `true` therefore enables nothing, and setting it to `false`
|
|
1625
|
+
# disables nothing.
|
|
1626
|
+
#
|
|
1627
|
+
# The key STAYS because docs/MIGRATION.md (the code_graph row) commits to
|
|
1628
|
+
# exactly that — "the surfaces stay registered and disabled". Deleting a key a
|
|
1629
|
+
# consumer may already have set is the breaking change the commitment exists
|
|
1630
|
+
# to avoid; docs/contracts/settings-classes.md classifies it accordingly
|
|
1631
|
+
# (classified, not deleted).
|
|
1587
1632
|
#
|
|
1588
1633
|
# DEPRECATED (honest null, 2026-07-28): the pre-registered 2-arm retrieval
|
|
1589
1634
|
# benchmark measured the native graph at recall 0.365 vs grep 0.797 on
|
|
1590
1635
|
# graph-shaped questions across 3 real repos (internal/bench/reports/
|
|
1591
|
-
# code-graph-vs-grep.md; claim code-graph-retrieval-null).
|
|
1592
|
-
#
|
|
1593
|
-
#
|
|
1594
|
-
#
|
|
1595
|
-
# its reopen condition, which is the same one that was always written here:
|
|
1596
|
-
# external evidence — a consumer case the graph answers and disciplined grep
|
|
1597
|
-
# cannot — or a re-measurement on a build that postdates the extractor repair
|
|
1636
|
+
# code-graph-vs-grep.md; claim code-graph-retrieval-null). That null is about
|
|
1637
|
+
# the ENGINE, not about this key, and it still stands — the reopen condition
|
|
1638
|
+
# is external evidence (a consumer case the graph answers and disciplined grep
|
|
1639
|
+
# cannot) or a re-measurement on a build that postdates the extractor repair
|
|
1598
1640
|
# of 2026-08-22, which the 2026-07-28 figures predate.
|
|
1599
1641
|
#
|
|
1600
|
-
# The engine
|
|
1601
|
-
#
|
|
1602
|
-
#
|
|
1603
|
-
#
|
|
1604
|
-
#
|
|
1605
|
-
# Both versions are exact because the pair is ABI-coupled (grammar ABI 14).
|
|
1606
|
-
# The loader raises this same hint if the pair is missing.
|
|
1642
|
+
# The engine ships to consumers. `web-tree-sitter` is a runtime dependency
|
|
1643
|
+
# (package.json) and the three loadable grammars are vendored at
|
|
1644
|
+
# src/vendor/grammars/, so there is no separate parser install to perform and
|
|
1645
|
+
# no ABI pair to line up by hand. Build the cache with
|
|
1646
|
+
# `agent-config code-graph build`.
|
|
1607
1647
|
code_graph:
|
|
1608
1648
|
enabled: false
|
|
1609
1649
|
|
|
@@ -211,6 +211,13 @@
|
|
|
211
211
|
"locus": "src/scripts/bench_hook_injection.ts:42",
|
|
212
212
|
"reason": "Hook-injection benchmark output. Measurement, not state."
|
|
213
213
|
},
|
|
214
|
+
{
|
|
215
|
+
"id": "learning-dogfood.jsonl",
|
|
216
|
+
"axis": "persistent_continuity_artefacts",
|
|
217
|
+
"disposition": "excluded",
|
|
218
|
+
"locus": "src/scripts/memory_learn_hook.ts:191",
|
|
219
|
+
"reason": "One line per session-end learning run — wall time, signals in, lessons out. The two numbers the `memory.learn_on_session_end` flip condition names, recorded so a 30-day window can read a zero rather than a silence. Measurement about a session, never state a successor session reads: deleting it costs the window its history and costs no resume anything."
|
|
220
|
+
},
|
|
214
221
|
{
|
|
215
222
|
"id": "injection-turn",
|
|
216
223
|
"axis": "persistent_continuity_artefacts",
|
|
@@ -65,11 +65,11 @@
|
|
|
65
65
|
"baseline_note": "80 → 81 on 2026-08-03 (release 9.15.0 gate). This RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The +1 is f02db54c2 (fix(cli): register routing:doctor in the CLI registry) — the command existed, only its registry entry was missing, and the registering PR did not move this budget. The gate did its job again: breach WARNS on main and BLOCKS on release, which is the conscious-decision point rather than a silently raised cap. Re-measured 2026-08-03 via the pinned method: 81. Headroom stays zero by design — the next registry addition must move this number in its own PR. 81 → 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 → 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 → 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 — the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 → 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 — replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 → 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination — the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88. 88 → 89 on 2026-08-08: the `council:status` verb registers in the same PR that adds the surface, per this record's own contract. It exists because an agent in a consumer project announced \"kein Council konfiguriert (keine .agent-settings.yml)\" and substituted a weaker path while the council was configured user-globally the whole time — there was no verb that answered availability, so the only route was an inference from a filename, and the intuitive filename is the one location ADR-104 guarantees is never consulted. Re-measured via the pinned method: 89. 89 → 91 on 2026-08-08: the `self-repair:status` + `self-repair:release` verbs (the queued-defect reader and the single Hard-Floor-gated outward step of the self-repair loop — the loop is deliberately unable to publish unless a human runs the release command) register in the same PR that adds the surface, per this record's own contract. Landed alongside the +1 council:status move in the same branch. Re-measured via the pinned method: 91. 91 → 94 on 2026-08-08: the `packs:active`, `settings:get` and `mcp:available` verbs (road-to-capability-answerability Phase 2 — the three capability probes for the gaps that had none) register in the same PR that adds the surface, per this record's own contract. Each answers a question that was previously only inferable from a filename: which packs are active and from which file, what a setting resolves to and which file set it, and what is declared in mcp.json versus what can actually launch. 94 -> 95 in the same PR: `brand:status` (Phase 2.4 — brand-layer presence, which the rule depended on and no surface could answer). Re-measured twice via the pinned method on the unchanged tree: 95/95. 95 → 96 on 2026-08-10: the `session:recycle` verb (road-to-token-economy-recycling Phase 2.2 — the deterministic producer of the main-session recycle envelope; the recycle advisory names this exact verb, so it must exist as a shell surface) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 96. 96 -> 97 on 2026-08-10: the `gates` verb registers in the same PR that adds the surface, per this record's own contract. It exists because the blocker fields the dashboard already parses (Owner, What to do, Resolved when — CI-enforced by lint_roadmap_blockers) had no owner-filtered reader: the dashboard counts the open blockers across a 600-line file and links each to a per-roadmap anchor, so \"which of these are mine\" was a manual read of every anchor. The same inference-from-a-filename shape as the council:status entry above, one layer up. This branch and the session:recycle branch each measured 96 independently and landed on the same number for different verbs; the merge makes it 97, re-measured twice via the pinned method on the merged tree: 97/97. 97 -> 98 on 2026-08-15: the `workspace:doctor` verb (road-to-inbox-harvest-2026-08-c-workspace-identity Phase 3 — the read-only report over the new `workspaceIdentity()` resolver) registers in the same PR that adds the surface, per this record's own contract. It exists for the same inference-from-a-filename shape as the council:status and gates entries above, one layer down: the tree answered \"where am I\" in eight ad-hoc places across six files, and the 12.0.0 span shipped the same worktree misclassification twice, so no verb could be asked which checkout is the main one. Read-only by construction — the roadmap's Non-goals put worktree disposal out of scope and its Risk 3 names \"the pressure read becomes a disposal path by accident\" as the failure to design against, so the command carries no --fix and no --prune. Re-measured twice via the pinned method on the unchanged tree: 98/98. 98 -> 99 on 2026-08-17: the `council:quota` verb (road-to-council-quota-accounting-truth Phase 2) registers in the same PR that adds the surface, per this record's own contract. Exactly the inference-from-a-filename shape as the council:status entry above, one layer down: `cmd_quota` had existed in council_cli.ts and been reachable only via `scripts-run`, so the documented recovery path for an exhausted shared counter -- read the usage, reset one provider -- did not resolve through `agent-config`, and an operator debugging a quota failure met `unknown command`. The verb is read-only apart from the pre-existing `--reset <provider>`, which already required `--confirm`. Re-measured twice via the pinned method on the unchanged tree: 99/99. 99 -> 100 on 2026-08-19: the `decision:memo` verb (road-to-long-horizon-execution Phase 2.2, sequencing UOTL Phase 4.3 -- the decision-memo channel) registers in the same PR that adds the surface, per this record's own contract. It exists because the question ladder gained a rung between \"halt and ask\" and \"decide silently\": a resolution the run makes without contacting the operator is only legitimate if it is reviewable afterwards, and there was no surface that wrote such a record with a fixed shape. Write-and-list only, local-only (agents/runtime/ is gitignored), and it gates nothing -- the locked decision classes are refused at the config schema, never in the ledger. 100 -> 101 in the same PR: `run:supervise` (Phase 3.1 -- the out-of-process watcher for runs whose session died with open steps left). It is the operator-facing half of session continuity: nothing anywhere had the job of noticing that a claimed run stopped moving, so a roadmap 40% done and a roadmap finished looked identical from outside the dead session. Report-only by default and it NEVER merges, pushes or closes -- the auto-merge the reference design carries is a named rejection in the roadmap's harvest section, not an unbuilt feature. Re-measured twice via the pinned method on the unchanged tree: 101/101. 101 → 102 on 2026-08-22: the `adr:effective` verb (road-to-evidence-based-adr-governance step 2.2 — the effective-state projection over one decision record) registers in the same PR that adds the surface, per this record's own contract. It exists because current truth about an ADR was only reconstructable from linear prose: an agent had to read the body, then every amendment, and decide for itself which clauses still stand. The verb reports status, the Decision verbatim, clauses the record's own amendments superseded, active amendments, the three descriptive axes and the review-trigger state. It AUTHORIZES NOTHING — Phase 2 of that roadmap is titled \"surfacing only; no authority\" and its AC-7 forbids any authority consequence, so the verb reports an absent axis as absent (`— (no provenance axis)`, `— (ungraded)`, `absent → evidence`) and an unresolvable trigger as `indeterminate` rather than inferring one. Re-measured twice via the pinned method on the unchanged tree: 102/102. 102 → 104 on 2026-08-22: the `council:grant-billing` + `council:revoke-billing` verbs (road-to-billing-cliff-gate Phase 2 — the run-scoped billing grant that lets `ai_council.fallback.api_on_quota: 'ask'` be answered once per run instead of once per seat) register in the same PR that adds the surface, per this record's own contract. The two are a pair by construction rather than by convenience: a grant that can be issued and not revoked would outlive its run, which is the failure the run-scoped TTL exists to prevent. Re-measured via the pinned method: 104. 104 -> 106 on 2026-08-23: the `ui:audit` + `ui:render` verbs (road-to-frontend-power E2.1 and E3.1 -- the two Class-A commands that give the frontend obligations an artefact a gate can read and a render a verdict can cite) register in the same PR that adds the surface, per this record's own contract. The two are a pair by construction rather than by convenience: `ui-audit-gate`'s enforced_by moved from `none` to a carrier in the same change, and that carrier reports `verification: degraded` whenever the render artefact is absent -- so an audit verb without a render verb would ship a gate that can never reach `verified`. Both are Class A under ADR-124: they terminate, their whole state is a rebuildable directory under agents/runtime/state/, and ui:render closes chromium in a `finally` on every path with no --serve, watch or cache for a resident browser to hide in. Re-measured via the pinned method on the unchanged tree: 106. 106 → 107 on 2026-08-23: the `roadmap:context` verb (road-to-roadmap-situational-awareness — the single live probe that answers what else is in flight before a roadmap is picked) registers in the same PR that adds the surface, per this record's own contract. Its branch measured 105 against a base of 104 and this branch measured 106 against the same base for `ui:audit` + `ui:render`; the merge makes it 107, re-measured on the merged tree via the pinned method (registry enumeration): 107. 107 → 108 on 2026-08-26: the `roadmap:set-step` verb (road-to-skill-ecosystem-runtime-enforcement Phase 6 — the single sanctioned writer of a checkbox glyph) registers in the same PR that adds the surface, per this record's own contract. It exists because the glyph is written today by whatever edits the file, and a concurrent writer destroys work SILENTLY: the loser of an overwrite receives no error. The verb carries an advisory lock, a line-anchored edit that cannot span entries even in principle, a step-count invariant asserted against the LIVE pre-write file rather than an in-memory snapshot, and a post-write survival check. Re-measured via the pinned method (registry enumeration) on the unchanged tree: 108. 108 → 109 on 2026-08-26: the `stubs:due` verb (road-to-inbox-harvest-2026-08-f-owner-decision-queue step 2.1 — the read-only reader over `agents/roadmaps/stubs/` frontmatter) registers in the same PR that adds the surface, per this record's own contract. It exists because step 1.2 backfills a `review_by:` date into 77 parked files, and an AI council (2026-08-26, 2/2) made the ordering a RULE rather than a preference: dates without a reader are strictly worse than no dates, because a stale date certifies attention nobody paid. The verb is read-only by construction — it authors nothing under `agents/roadmaps/stubs/`, so `check_no_stub_inventory_table` stays green and unmodified, and `roadmap:progress` consumes only its two COUNTS for the dashboard header (two integers, no rows, nothing for the deleted index tables to grow back from). Re-measured via the pinned method (registry enumeration) on the unchanged tree: 109. 109 → 110 on 2026-09-03: the `hooks:effect` verb (road-to-wired-instruments Phase 1.1 — the CLI entry for `hook_effect_doctor`) registers in the same PR that adds the surface, per this record's own contract. It exists because the probe and its five-state vocabulary were built, tested and reachable from nothing: `grep -rn 'hook_effect_doctor|hook_effect_probe' src Taskfile.yml .github` returned only the two modules themselves, and a closed roadmap recorded the wiring as landed at `src/scripts/hooks_doctor.ts:88`, a line that is the closing brace of a filesystem helper in a file with zero references to the probe. Deliberately NOT merged into `hooks:doctor`: that verb reads the MANIFEST (what is declared) and this one reads what happened (what took effect), and the probe's own header names merging them as the thing to avoid — a declaration report and an execution report are different instruments, and merging them makes the cheap one expensive. Read-only apart from a scratch root it removes in a `finally`. Re-measured via the pinned method (registry enumeration) on the unchanged tree: 110."
|
|
66
66
|
},
|
|
67
67
|
"mcp_public_tool_count": {
|
|
68
|
-
"max":
|
|
69
|
-
"last_measured":
|
|
70
|
-
"last_measured_at": "2026-
|
|
68
|
+
"max": 26,
|
|
69
|
+
"last_measured": 26,
|
|
70
|
+
"last_measured_at": "2026-10-01",
|
|
71
71
|
"method": "tools/list length on the stdio server (post-ADR-132: implemented tools only)",
|
|
72
|
-
"baseline_note": "19 → 20 on 2026-08-17 (release 13.0.0 gate). The +1 is 866bd9861 (feat(mcp): recover what the host dropped — real ranker tool + a route to it, road-to-inbox-harvest-2026-08-d-runtime-skill-routing Phase 4): `suggest_skill_for_task` was promoted from a discovery STUB to a real ALLOWLIST entry and removed from STUB_TOOLS. Worth stating precisely, because the consumer-visible NAME did not grow — the stub already published that name and its `task` + `limit` input schema, which the promotion carried over verbatim. What grew is the count of tools tools/list actually returns, which is exactly what this metric measures post-ADR-132: implemented tools only. Same shape as the cli_help_command_count history above — this RECORDS growth that already shipped through its own reviewed PR (866bd9861 is on main), it does not authorize new surface. The registering PR did not move this budget, so the gate did its job: the breach warned on main and blocked on the release ref, which is the conscious-decision point rather than a silently raised cap. Re-measured twice via the pinned method on a freshly built dist/mcp/server.mjs: 20/20. Headroom stays zero by design — the next tool that leaves STUB_TOOLS must move this number in its own PR. 20 → 25 on 2026-09-09 (release 14.23.0 gate). The +5 are `graph_impact`, `graph_tests_for`, `graph_dead`, `graph_query` and `graph_path` — 9452f29b4 (feat(mcp): five graph tools, the pinned install hint, and the skill description; road-to-a-graph-that-is-shipped Phase 4.1), which is on main. They are the agent-facing readers of the code graph: the roadmap Risk-Register rank 1 is \"the install grows and the graph is still unread\", and an agent that has to shell out to reach a verb will not, so the tools ARE the mitigation rather than a convenience. Same shape as every entry above — this RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The registering PR did not move this budget, so the gate did its job again: the breach warned on main and BLOCKED on the release ref, which is the conscious-decision point rather than a silently raised cap. The move is +25%, over the 10% creep rule, and that is the intended reading: five tools in one commit is a surface decision, not creep. Re-measured three times via the pinned method on a freshly built dist/mcp/server.mjs: 25/25/25, the returned name set differing from the 20-tool set by exactly the five graph_* entries. Headroom stays zero by design — the next tool that leaves STUB_TOOLS must move this number in its own PR."
|
|
72
|
+
"baseline_note": "19 → 20 on 2026-08-17 (release 13.0.0 gate). The +1 is 866bd9861 (feat(mcp): recover what the host dropped — real ranker tool + a route to it, road-to-inbox-harvest-2026-08-d-runtime-skill-routing Phase 4): `suggest_skill_for_task` was promoted from a discovery STUB to a real ALLOWLIST entry and removed from STUB_TOOLS. Worth stating precisely, because the consumer-visible NAME did not grow — the stub already published that name and its `task` + `limit` input schema, which the promotion carried over verbatim. What grew is the count of tools tools/list actually returns, which is exactly what this metric measures post-ADR-132: implemented tools only. Same shape as the cli_help_command_count history above — this RECORDS growth that already shipped through its own reviewed PR (866bd9861 is on main), it does not authorize new surface. The registering PR did not move this budget, so the gate did its job: the breach warned on main and blocked on the release ref, which is the conscious-decision point rather than a silently raised cap. Re-measured twice via the pinned method on a freshly built dist/mcp/server.mjs: 20/20. Headroom stays zero by design — the next tool that leaves STUB_TOOLS must move this number in its own PR. 20 → 25 on 2026-09-09 (release 14.23.0 gate). The +5 are `graph_impact`, `graph_tests_for`, `graph_dead`, `graph_query` and `graph_path` — 9452f29b4 (feat(mcp): five graph tools, the pinned install hint, and the skill description; road-to-a-graph-that-is-shipped Phase 4.1), which is on main. They are the agent-facing readers of the code graph: the roadmap Risk-Register rank 1 is \"the install grows and the graph is still unread\", and an agent that has to shell out to reach a verb will not, so the tools ARE the mitigation rather than a convenience. Same shape as every entry above — this RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The registering PR did not move this budget, so the gate did its job again: the breach warned on main and BLOCKED on the release ref, which is the conscious-decision point rather than a silently raised cap. The move is +25%, over the 10% creep rule, and that is the intended reading: five tools in one commit is a surface decision, not creep. Re-measured three times via the pinned method on a freshly built dist/mcp/server.mjs: 25/25/25, the returned name set differing from the 20-tool set by exactly the five graph_* entries. Headroom stays zero by design — the next tool that leaves STUB_TOOLS must move this number in its own PR. 25 → 26 on 2026-10-01: the +1 is `graph_node` (road-to-a-graph-that-feeds-the-gate step 3.1), and this entry moves in the SAME PR that adds the surface, which is what every entry above asks of the next one. Why a sixth graph tool rather than an argument on one of the five: the five all answer about a NEIGHBOURHOOD (`graph_query`, `graph_path`, `graph_impact`) or about a SET (`graph_dead`, `graph_tests_for`), and none answers the question an agent asks first — where does this symbol live, who reaches it, what does it reach, how connected is it — which had to be assembled from two calls plus a file read. It walks the edge maps `affected` already walks, so it adds a view and not an index. It is also the one graph tool that REFUSES rather than guesses: it resolves on the exact tiers of the existing seed ladder (node id, then label) and returns a refusal naming the candidates when a label is ambiguous or nothing matches exactly, because free-text retrieval is the row the graph measurably lost (`docs/CLAIMS.md` code-graph-retrieval-null) and every field it returns is a statement about ONE node. Re-measured twice via the pinned method on a freshly built dist/mcp/server.mjs: 26/26, the returned name set differing from the 25-tool set by exactly `graph_node`. Headroom stays zero by design."
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
}
|
|
@@ -52,12 +52,12 @@
|
|
|
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-
|
|
55
|
+
# COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-10-01)
|
|
56
56
|
# ----------------------------------------------------------
|
|
57
|
-
#
|
|
57
|
+
# 347 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
|
|
58
58
|
# (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts`,
|
|
59
59
|
# re-run on the tree carrying these rows.)
|
|
60
|
-
# **
|
|
60
|
+
# **109 rows are listed below**, so the manifest covers 109/347 = 31.4 % of the
|
|
61
61
|
# population, and is complete for every gate that can carry a floor. The row
|
|
62
62
|
# count is `grep -c '^ - id:'`, recomputed here rather than incremented.
|
|
63
63
|
#
|
|
@@ -1496,6 +1496,30 @@ gates:
|
|
|
1496
1496
|
cannot survive a collapse: at that point the gate's own `reportScanned`
|
|
1497
1497
|
fires first. (Set to 50 in the first version, corrected on an R2 finding.)
|
|
1498
1498
|
|
|
1499
|
+
- id: check_verify_expectation_delta
|
|
1500
|
+
argv: []
|
|
1501
|
+
min_scanned: 0
|
|
1502
|
+
corpus: "the `verify:` clauses a change ADDS under agents/roadmaps/ — a set difference against the base ref, not a file set, which is why the floor is 0: a change touching no roadmap legitimately adds none, and a floor above 0 would fail every unrelated pull request. The denominator the gate reports is added clauses, so a change that adds ten to one file scanned ten things."
|
|
1503
|
+
status: enforced
|
|
1504
|
+
no_canary_reason: >
|
|
1505
|
+
A canary cannot express this gate's violation. The violation is a property
|
|
1506
|
+
of the DIFF — a clause that was ADDED without an expectation — so a file
|
|
1507
|
+
planted in the tree is, from the gate's point of view, a clause somebody
|
|
1508
|
+
added, which is either a true positive (and the canary is indistinguishable
|
|
1509
|
+
from the thing it is meant to detect) or, once committed on main, invisible
|
|
1510
|
+
forever. The negative control is the gate's own `--self-test`, run as its
|
|
1511
|
+
own CI step: 10 cases, 4 rejecting — an added bare clause, a bare clause
|
|
1512
|
+
among expectation-carrying siblings, a `cat` command asked for an oracle
|
|
1513
|
+
despite a weak exit status, and an `./path/script.ts` invocation that the
|
|
1514
|
+
pointer carve-out must NOT exempt — plus six ACCEPT cases pinning what must
|
|
1515
|
+
not fire (an expectation in either form, the prose MANUAL form, a backticked
|
|
1516
|
+
file pointer with and without a `:line` suffix, and a bare clause already at
|
|
1517
|
+
base). One limit is stated rather than implied: the already-at-base case
|
|
1518
|
+
does not exercise context-line handling, because under `--unified=0` the
|
|
1519
|
+
unchanged clause does not appear in the patch at all; the unit test
|
|
1520
|
+
`reads ADDED lines only` is what pins that. Same class as
|
|
1521
|
+
check_estate_count's diff-scoped half.
|
|
1522
|
+
|
|
1499
1523
|
- id: check_static_parity
|
|
1500
1524
|
argv: ["--quiet"]
|
|
1501
1525
|
min_scanned: 20
|
|
@@ -3017,6 +3041,47 @@ gates:
|
|
|
3017
3041
|
exits 1 with "scanned 0 read surface(s)" rather than certifying a table it
|
|
3018
3042
|
never compared.
|
|
3019
3043
|
|
|
3044
|
+
- id: check_hook_bundle_composition
|
|
3045
|
+
argv: []
|
|
3046
|
+
ci_invocation: .github/workflows/consistency.yml
|
|
3047
|
+
min_scanned: 150
|
|
3048
|
+
corpus: >
|
|
3049
|
+
modules esbuild inlines into `dist/hooks/dispatch.js` — 276 at baseline,
|
|
3050
|
+
read from the metafile of a build this gate performs rather than from the
|
|
3051
|
+
untracked bundle on disk. The floor sits at 150 because the dispatcher's
|
|
3052
|
+
concern chain alone accounts for most of that graph and the figure moves by
|
|
3053
|
+
ones as a concern is added or a dependency dropped; a reading below it means
|
|
3054
|
+
the entry point moved or the build produced a stub, not that half the hook
|
|
3055
|
+
layer was deleted. Note the floor is a MODULE count while the gate's own
|
|
3056
|
+
bound is a BYTE count — deliberately two different units, because a bundle
|
|
3057
|
+
can collapse to a stub at constant byte size only by also collapsing its
|
|
3058
|
+
module graph, and neither number alone sees both failures.
|
|
3059
|
+
status: enforced
|
|
3060
|
+
no_canary_reason: >-
|
|
3061
|
+
the canary contract is create-only and this gate's corpus is a BUILD
|
|
3062
|
+
OUTPUT, not a tree. A planted file under `src/` is in scope only if
|
|
3063
|
+
something imports it, and a planted file under `dist/hooks/` is read by
|
|
3064
|
+
nothing here — the gate builds its own bundle to a temporary directory
|
|
3065
|
+
precisely so no on-disk artefact can steer its verdict. Both violations it
|
|
3066
|
+
has are properties of that build: a second YAML package contributing bytes,
|
|
3067
|
+
and a byte count over the committed ceiling. Discrimination is proven by
|
|
3068
|
+
`--self-test` instead (4 cases, 3 rejecting: a second YAML reader, a bundle
|
|
3069
|
+
one byte over the ceiling, and a metafile with no entry-point output — the
|
|
3070
|
+
last being the build-produced-nothing case, which must exit non-zero rather
|
|
3071
|
+
than certify a composition of 0 bytes). Proven additionally against the
|
|
3072
|
+
REAL artefact rather than only against fixtures: run over the metafile of
|
|
3073
|
+
the pre-swap bundle, both findings fire with the measured figures
|
|
3074
|
+
(`js-yaml` 95,846 B beside `yaml` 258,839 B, 1,563,576 bytes against a
|
|
3075
|
+
1,500,000 ceiling), which is the regression this gate was built for seen
|
|
3076
|
+
red on the bytes that actually shipped.
|
|
3077
|
+
note: >
|
|
3078
|
+
road-to-a-hook-bundle-with-one-yaml-reader 1.3 + 2.1. Its two siblings are
|
|
3079
|
+
local-only by construction (`dist/hooks/` is untracked, so CI has no bundle
|
|
3080
|
+
to read); this one is not, because it builds the bundle it measures. What it
|
|
3081
|
+
deliberately does NOT claim is anything about latency — the wall-clock axis
|
|
3082
|
+
is `src/config/hook-latency-budget.json` and no number here is derived from
|
|
3083
|
+
it.
|
|
3084
|
+
|
|
3020
3085
|
- id: check_enforcement_matrix
|
|
3021
3086
|
argv: ["--quiet"]
|
|
3022
3087
|
ci_invocation: .github/workflows/consistency.yml
|
|
@@ -3164,3 +3229,31 @@ gates:
|
|
|
3164
3229
|
asserted in BOTH places — it was credited to `--self-test` before it was
|
|
3165
3230
|
actually there, which a review caught and which is why the assertion now
|
|
3166
3231
|
exists rather than the sentence being softened.
|
|
3232
|
+
- id: lint_workflow_security
|
|
3233
|
+
argv: []
|
|
3234
|
+
min_scanned: 25
|
|
3235
|
+
corpus: "workflow files under .github/workflows/ — `*.yml` then `*.yaml`, the two globs the gate scans in that order (34 today). The floor is 25 because workflows are consolidated and split routinely, so a handful leaving is normal, while a glob that stopped matching or a directory that moved reads far below it. Counting FILES and not findings is the point: this gate legitimately reports zero findings, so a floor over findings would be the false-count shape this file rejects."
|
|
3236
|
+
status: enforced
|
|
3237
|
+
ci_invocation: .github/workflows/consistency.yml
|
|
3238
|
+
no_canary_reason: >-
|
|
3239
|
+
A create-only canary cannot change this gate's verdict. It is warn-only by
|
|
3240
|
+
design — the council-locked severity model (2026-06-13) makes MEDIUM
|
|
3241
|
+
advisory and only `--strict` turns a HIGH into exit 1 — and the CI
|
|
3242
|
+
invocation this row pins carries no `--strict`, so a planted workflow with
|
|
3243
|
+
a `pull_request_target` untrusted checkout would be REPORTED and the gate
|
|
3244
|
+
would still exit 0. A canary run under a different argv would prove
|
|
3245
|
+
something about an invocation CI does not make, which is the drift
|
|
3246
|
+
`ci_invocation` exists to stop. Discrimination is proven by `--self-test`
|
|
3247
|
+
instead (5 cases, 3 rejecting), which drives the two exits the gate really
|
|
3248
|
+
has rather than the one the CI invocation cannot reach: an empty workflows
|
|
3249
|
+
directory exits 2 instead of printing "0 HIGH, 0 MEDIUM" over nothing, a
|
|
3250
|
+
`pull_request_target` checkout of the untrusted ref exits 1 under
|
|
3251
|
+
`--strict`, and an over-cap allowlist exits 2 instead of suppressing
|
|
3252
|
+
silently. The two accepting cases pin the warn-only tier from the other
|
|
3253
|
+
side — a MEDIUM under `--strict` must still PASS, which is the direction a
|
|
3254
|
+
future re-tiering would silently break, and a clean workflow must pass at
|
|
3255
|
+
all. Seen red deliberately on 2026-10-01 by emptying `DANGEROUS_TRIGGERS`:
|
|
3256
|
+
the HIGH case alone fails, 4/5, and restoring it returns 5/5. Promoting the
|
|
3257
|
+
tier so a canary becomes expressible is a separate decision, recorded
|
|
3258
|
+
unresolved in
|
|
3259
|
+
agents/evidence/analysis/workflow-security-net-degraded-decision.md.
|