@event4u/agent-config 16.1.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 +98 -257
- 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 +5 -5
- 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/commands/work.md +4 -0
- 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/autonomy-mechanics.md +4 -8
- 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/ui-audit-gate.md +1 -2
- 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/accessibility-auditor/data/aria-patterns.csv +1 -1
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
- 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-review/SKILL.md +30 -4
- package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
- package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
- 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/markitdown/SKILL.md +4 -0
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
- 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 +25 -2
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +30 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
- package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
- package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
- package/dist/cli/python/knowledge_ingest.js +1 -1
- package/dist/cli/python/workspace_drive.js +1 -1
- 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-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -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-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
- package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
- 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-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
- package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
- package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
- 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 +1862 -809
- 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 +132 -80
- 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 +7972 -5186
- package/dist/hooks/dispatch.sha256 +1 -0
- 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 +2226 -1055
- 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 +40913 -34865
- 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 +29 -0
- package/dist/shared/skillRanking.js +74 -13
- package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
- package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
- package/dist/ui/index.html +2 -2
- package/docs/contracts/settings-classes.md +10 -6
- package/package.json +4 -4
- 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/app_spec.ts +10 -4
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
- package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
- package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
- package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
- package/src/config/agent-settings.template.yml +91 -22
- package/src/config/ci-local-parity.yml +18 -0
- package/src/config/continuity-surface.json +9 -2
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +327 -3
- package/src/config/gate-violation-baselines.json +21 -9
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-latency-budget.json +21 -0
- package/src/config/hook-token-budget.json +8 -3
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/metric-registry.yml +114 -0
- package/src/config/placeholder-drift-budget.json +10 -0
- package/src/config/routing-coverage-seed.json +38 -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 +28 -90
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
- package/src/scripts/_cli/doctor_execution.ts +100 -17
- package/src/scripts/_cli/doctor_network_posture.ts +226 -0
- package/src/scripts/_dispatch.bash +16 -2
- package/src/scripts/_lib/agent_settings.ts +11 -0
- package/src/scripts/_lib/body_portable.ts +102 -0
- package/src/scripts/_lib/cc_transcript.ts +132 -1
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/concern_sla_window.ts +200 -0
- 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/forge_protection.ts +114 -0
- package/src/scripts/_lib/forge_reader.ts +558 -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_env_write.ts +111 -0
- 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/llm_proposer_transport.ts +14 -4
- 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/obligations.ts +119 -8
- package/src/scripts/_lib/probe_inputs.ts +271 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/read_surface_scan.ts +322 -0
- package/src/scripts/_lib/release_highlights.ts +2 -1
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
- 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/shell_write_shapes.ts +108 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structural_hiding.ts +622 -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 +600 -4
- package/src/scripts/_lib/turn_end_transcript.ts +216 -0
- package/src/scripts/_lib/verification_command.ts +324 -0
- package/src/scripts/_lib/verification_evidence.ts +647 -0
- package/src/scripts/_lib/verify_clause.ts +280 -0
- 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/ai_team/team_dispatch.ts +4 -0
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/before_complete_hook.ts +573 -25
- package/src/scripts/bench_hook_latency.ts +412 -5
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/cache_realization_report.ts +61 -1
- package/src/scripts/check_argument_hint.ts +287 -0
- package/src/scripts/check_claims.ts +125 -1
- package/src/scripts/check_enforcement_coverage.ts +38 -9
- package/src/scripts/check_enforcement_matrix.ts +621 -22
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_finding_dispositions.ts +138 -7
- package/src/scripts/check_generator_sync.ts +71 -0
- package/src/scripts/check_hook_bundle_composition.ts +370 -0
- package/src/scripts/check_host_docs_digest.ts +786 -0
- package/src/scripts/check_host_format_column.ts +559 -0
- package/src/scripts/check_input_references.ts +228 -0
- package/src/scripts/check_inputs_parity.ts +235 -0
- package/src/scripts/check_kernel_edit_ratified.ts +89 -9
- package/src/scripts/check_kill_switch_table.ts +294 -0
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_placeholder_drift.ts +221 -0
- package/src/scripts/check_read_surface_coverage.ts +515 -0
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_holds.ts +2 -1
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_routing_coverage.ts +378 -11
- package/src/scripts/check_standing_rule_delivery.ts +33 -13
- package/src/scripts/check_static_parity.ts +17 -0
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/ci_settle.ts +145 -19
- package/src/scripts/closure_scan.ts +115 -1
- 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 +90 -14
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/external_sources_denylist.json +29 -4
- package/src/scripts/generate_host_cost_table.ts +1 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +192 -14
- package/src/scripts/hooks/block_config_weakening.ts +294 -4
- package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
- package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
- package/src/scripts/hooks/bundle_integrity.ts +291 -0
- package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
- package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
- package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/concern_timings.ts +94 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
- package/src/scripts/hooks/design_pass_hook.ts +100 -9
- package/src/scripts/hooks/design_slop_hook.ts +1 -2
- package/src/scripts/hooks/dispatch_hook.ts +77 -71
- package/src/scripts/hooks/edit_shape_hook.ts +1 -2
- package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
- package/src/scripts/hooks/evidence_independence.ts +1 -2
- package/src/scripts/hooks/exit_codes.ts +129 -0
- package/src/scripts/hooks/host_lowering.json +1 -0
- package/src/scripts/hooks/host_lowering.ts +146 -3
- package/src/scripts/hooks/host_lowering.yaml +262 -46
- package/src/scripts/hooks/host_semantics.ts +30 -2
- package/src/scripts/hooks/injection_budget.ts +9 -2
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
- package/src/scripts/hooks/journal_record_hook.ts +1 -2
- package/src/scripts/hooks/memory_recall_hook.ts +1 -2
- package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
- package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
- package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/permission_gate.ts +1 -2
- package/src/scripts/hooks/push_settle_hook.ts +1 -3
- package/src/scripts/hooks/replay_hook.ts +2 -1
- package/src/scripts/hooks/reread_guard_hook.ts +1 -2
- package/src/scripts/hooks/review_baseline_hook.ts +1 -2
- package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
- package/src/scripts/hooks/rule_inject_hook.ts +765 -68
- package/src/scripts/hooks/run_continuation_hook.ts +13 -15
- package/src/scripts/hooks/skill_route_hook.ts +1 -2
- package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
- package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
- package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
- package/src/scripts/hooks/table_fingerprint.ts +70 -0
- package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
- package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
- package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
- package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
- package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install.ts +75 -189
- 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_deny_text.ts +419 -0
- package/src/scripts/lint_exit_codes.ts +262 -0
- package/src/scripts/lint_hook_manifest.ts +108 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +63 -5
- package/src/scripts/lint_roadmap_blockers.ts +78 -12
- package/src/scripts/lint_rule_law_section.ts +517 -0
- package/src/scripts/lint_skill_descriptions.ts +1 -1
- package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
- 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/mcp_server/prompts.ts +142 -1
- package/src/scripts/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
- package/src/scripts/measure_turn_end_gate.ts +193 -0
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/memory_lookup.ts +1 -1
- package/src/scripts/model_rule_injection.ts +52 -5
- package/src/scripts/prepack-check.mjs +53 -0
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/release_publication.ts +13 -1
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +157 -0
- package/src/scripts/report_invocation_surface.ts +383 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_obligation_carriers.ts +699 -0
- package/src/scripts/report_obligation_mechanism.ts +230 -0
- package/src/scripts/report_obligation_writer_split.ts +236 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_menu_census.ts +208 -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/roadmap_verify_share.ts +213 -0
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/command.schema.json +44 -0
- package/src/scripts/schemas/review-findings.schema.json +7 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/schemas/skill.schema.json +44 -0
- package/src/scripts/self_review_gate.ts +421 -17
- package/src/scripts/semantic_parity_census.ts +314 -0
- package/src/scripts/session_eol_report.ts +54 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
- package/src/scripts/sweep_dead_scan_roots.ts +1 -1
- 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 -7
- package/src/scripts/trigger_eval_rotation.ts +122 -27
- package/src/scripts/ui_conformance_probe.ts +156 -4
- package/src/scripts/update_prices.ts +85 -3
- package/src/scripts/write_bundle_digest.mjs +74 -0
- package/src/server/schemas/settings.ts +41 -0
- package/src/shared/skillRanking.ts +117 -11
- package/src/templates/consumer-settings/ONBOARDING.md +1 -0
- package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
- package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
- package/dist/ui/assets/index-DH1xc62v.js +0 -29
- package/dist/ui/assets/index-jSfMW8_t.css +0 -1
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Placing a new component inside the taxonomy a project already chose.
|
|
3
|
+
*
|
|
4
|
+
* Leaf module — no intra-`work_engine` imports beyond its sibling detector's
|
|
5
|
+
* `NO_TAXONOMY` constant. That one import does pull `node:fs` in transitively;
|
|
6
|
+
* "stdlib-free" was the old wording here and it was simply wrong. Public API names stay snake_case to
|
|
7
|
+
* mirror the sibling detectors 1:1, per ADR-200.
|
|
8
|
+
*
|
|
9
|
+
* The contract, and the reason it is this small: placement reads the RECORDED
|
|
10
|
+
* tier list by name and conforms to whatever it holds. There is no table of
|
|
11
|
+
* tier names here, no ordering, no per-tier rule, and no numeric budget keyed
|
|
12
|
+
* to a tier — a component is placed when the brief names a tier the project
|
|
13
|
+
* has, and is reported as a gap when it does not. Anything richer would be the
|
|
14
|
+
* compiled-in taxonomy this suite refused to hard-code, arriving as an
|
|
15
|
+
* implementation detail rather than as a decision.
|
|
16
|
+
*
|
|
17
|
+
* That is also why an unplaceable component is never quietly put somewhere
|
|
18
|
+
* else. Choosing a tier for it would need exactly the per-tier rule the line
|
|
19
|
+
* above rules out, so the honest output is a named gap the author resolves.
|
|
20
|
+
*
|
|
21
|
+
* With {@link NO_TAXONOMY} recorded — the value for a project that evidences
|
|
22
|
+
* no taxonomy — every plan comes back empty and {@link conformance_lines}
|
|
23
|
+
* returns nothing, so the authoring step's output is byte-identical to what it
|
|
24
|
+
* was before this module existed. Holding to the project's own structures is
|
|
25
|
+
* the standing rule; a project that organises its components some other way
|
|
26
|
+
* must not be able to tell that this module shipped.
|
|
27
|
+
*/
|
|
28
|
+
import { NO_TAXONOMY } from './detect.js';
|
|
29
|
+
|
|
30
|
+
/** A component the design brief asks for. */
|
|
31
|
+
export interface ComponentRequest {
|
|
32
|
+
/** The component's name, as the brief writes it. */
|
|
33
|
+
name?: unknown;
|
|
34
|
+
/** The granularity tier the brief assigns it, when it assigns one. */
|
|
35
|
+
tier?: unknown;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Where one component lands, or why it could not be placed. */
|
|
39
|
+
export interface PlacementPlan {
|
|
40
|
+
/** The component's name as read from the brief. */
|
|
41
|
+
name: string;
|
|
42
|
+
/** The project's own tier name it was matched to, or `null`. */
|
|
43
|
+
tier: string | null;
|
|
44
|
+
/** The directory it belongs in, or `null` when unplaced. */
|
|
45
|
+
directory: string | null;
|
|
46
|
+
/** Why it could not be placed, or `null` when it was. */
|
|
47
|
+
gap: string | null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Component root used when the audit recorded none. */
|
|
51
|
+
/**
|
|
52
|
+
* Gap reported when a taxonomy is recorded without the root it lives under.
|
|
53
|
+
*
|
|
54
|
+
* Guessing `src/components` here is the same failure as placing a component in
|
|
55
|
+
* a tier the project does not have, at the other end of the path: a project
|
|
56
|
+
* rooted at `app/components` or `resources/js/components` — both of which the
|
|
57
|
+
* detector searches — would have been handed a directory that does not exist,
|
|
58
|
+
* with no gap and no warning. This module exists so nothing is placed
|
|
59
|
+
* somewhere the project did not choose, so it says so instead.
|
|
60
|
+
*/
|
|
61
|
+
export const MISSING_ROOT_GAP =
|
|
62
|
+
'the audit recorded a taxonomy but no `component_root`, so there is no ' +
|
|
63
|
+
'directory to place into — re-run the audit, or record the root by hand';
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Plan where each requested component belongs under a recorded taxonomy.
|
|
67
|
+
*
|
|
68
|
+
* @param taxonomy The recorded `state.ui_audit.component_taxonomy` value —
|
|
69
|
+
* the project's own tiers joined with `/`, or {@link NO_TAXONOMY}.
|
|
70
|
+
* @param component_root The recorded component root, relative to the project.
|
|
71
|
+
* @param components The components the design brief asks for.
|
|
72
|
+
*/
|
|
73
|
+
export function plan_component_placement(
|
|
74
|
+
taxonomy: string,
|
|
75
|
+
component_root: string,
|
|
76
|
+
components: ReadonlyArray<ComponentRequest>,
|
|
77
|
+
): PlacementPlan[] {
|
|
78
|
+
const tiers = read_tiers(taxonomy);
|
|
79
|
+
const root = _trim_slashes(component_root);
|
|
80
|
+
return components.map((component) => {
|
|
81
|
+
const name = _text(component.name) || '(unnamed)';
|
|
82
|
+
if (tiers.length === 0) {
|
|
83
|
+
return { name, tier: null, directory: null, gap: null };
|
|
84
|
+
}
|
|
85
|
+
if (root === '') {
|
|
86
|
+
return { name, tier: null, directory: null, gap: `\`${name}\` — ${MISSING_ROOT_GAP}` };
|
|
87
|
+
}
|
|
88
|
+
const hint = _text(component.tier);
|
|
89
|
+
if (hint === '') {
|
|
90
|
+
return {
|
|
91
|
+
name,
|
|
92
|
+
tier: null,
|
|
93
|
+
directory: null,
|
|
94
|
+
gap:
|
|
95
|
+
`\`${name}\` names no granularity tier, and the project's ` +
|
|
96
|
+
`taxonomy \`${taxonomy}\` carries no rule that assigns one ` +
|
|
97
|
+
'— left unplaced for the author to decide',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const matched = tiers.find((tier) => _normalise(tier) === _normalise(hint));
|
|
101
|
+
if (matched === undefined) {
|
|
102
|
+
return {
|
|
103
|
+
name,
|
|
104
|
+
tier: null,
|
|
105
|
+
directory: null,
|
|
106
|
+
gap:
|
|
107
|
+
`\`${name}\` declares tier \`${hint}\`, which the project's ` +
|
|
108
|
+
`taxonomy \`${taxonomy}\` does not contain — left unplaced ` +
|
|
109
|
+
'rather than moved somewhere the project did not choose',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return { name, tier: matched, directory: `${root}/${matched}`, gap: null };
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Split a recorded taxonomy value into the project's own tier names.
|
|
118
|
+
*
|
|
119
|
+
* **The sentinel comparison is case-insensitive, and that is not politeness.**
|
|
120
|
+
* This field is written by an agent following `existing-ui-audit` § 1b, so
|
|
121
|
+
* `'None'` is reachable, and an exact comparison let it through as a
|
|
122
|
+
* one-element tier list: a project with no taxonomy then got a "conforming to
|
|
123
|
+
* `None`" banner and a conformance gap per component — precisely the output
|
|
124
|
+
* AC-2 forbids. It is the one guard standing between a no-taxonomy project and
|
|
125
|
+
* a changed authoring step, so it refuses every spelling of the sentinel.
|
|
126
|
+
*/
|
|
127
|
+
export function read_tiers(taxonomy: string): string[] {
|
|
128
|
+
const value = _text(taxonomy);
|
|
129
|
+
if (value === '' || value.toLowerCase() === NO_TAXONOMY) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
return value
|
|
133
|
+
.split('/')
|
|
134
|
+
.map((part) => part.trim())
|
|
135
|
+
.filter((part) => part !== '');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Render the lines the authoring step says out loud.
|
|
140
|
+
*
|
|
141
|
+
* Empty for {@link NO_TAXONOMY}, which is what keeps a no-taxonomy project's
|
|
142
|
+
* output unchanged.
|
|
143
|
+
*/
|
|
144
|
+
export function conformance_lines(
|
|
145
|
+
taxonomy: string,
|
|
146
|
+
component_root: string,
|
|
147
|
+
plans: ReadonlyArray<PlacementPlan>,
|
|
148
|
+
): string[] {
|
|
149
|
+
if (read_tiers(taxonomy).length === 0) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
const root = _trim_slashes(component_root);
|
|
153
|
+
const under = root === '' ? 'an unrecorded component root' : `\`${root}/\``;
|
|
154
|
+
const lines: string[] = [
|
|
155
|
+
`> Conforming to the project's own component taxonomy ` +
|
|
156
|
+
`\`${taxonomy}\` under ${under} — detected, not imposed. ` +
|
|
157
|
+
'A component that fits no tier is reported, never relocated.',
|
|
158
|
+
];
|
|
159
|
+
for (const plan of plans) {
|
|
160
|
+
if (plan.gap === null && plan.directory !== null) {
|
|
161
|
+
lines.push(
|
|
162
|
+
`> - \`${plan.name}\` → \`${plan.directory}/\` (tier \`${plan.tier}\`)`,
|
|
163
|
+
);
|
|
164
|
+
} else if (plan.gap !== null) {
|
|
165
|
+
lines.push(`> - conformance gap: ${plan.gap}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return lines;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Lower-case and drop a trailing plural `s`, so `Molecule` matches `molecules`. */
|
|
172
|
+
function _normalise(name: string): string {
|
|
173
|
+
const lower = name.trim().toLowerCase();
|
|
174
|
+
return lower.endsWith('s') && lower.length > 2 ? lower.slice(0, -1) : lower;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function _text(value: unknown): string {
|
|
178
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function _trim_slashes(value: unknown): string {
|
|
182
|
+
return _text(value).replace(/^\/+|\/+$/gu, '');
|
|
183
|
+
}
|
|
@@ -464,6 +464,35 @@ delivery:
|
|
|
464
464
|
# that is why this key is Class C rather than a preference.
|
|
465
465
|
pr_topology: single
|
|
466
466
|
|
|
467
|
+
# --- What this package may write into the HOST's own environment ---
|
|
468
|
+
#
|
|
469
|
+
# THE GUARANTEE IS THE SHAPE, not a list. Only request-SIZE caps live here.
|
|
470
|
+
# Neither `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` nor `DISABLE_AUTOUPDATER`
|
|
471
|
+
# is expressible: both reach the host's update-disabled resolver -- the blanket
|
|
472
|
+
# one as its THIRD RUNG, measured on Claude Code 2.1.284 -- so a profile able to
|
|
473
|
+
# write either could disable a consumer's security updates. Owner-decided
|
|
474
|
+
# 2026-09-30: this package never writes them, and a schema that cannot say them
|
|
475
|
+
# holds that better than an exclusion list somebody has to keep true.
|
|
476
|
+
#
|
|
477
|
+
# Both keys are `null` by default, and null IS the off switch -- nothing is
|
|
478
|
+
# written. There is deliberately no separate enable flag: a flag plus a value
|
|
479
|
+
# would be two ways to say off, and one of them would drift.
|
|
480
|
+
#
|
|
481
|
+
# Size, never count. Lowering either cap suppresses no telemetry, no update
|
|
482
|
+
# check and no download; it bounds how big a request is, not how many there are.
|
|
483
|
+
# What each variable governs is in docs/setup/host-traffic-environment.md and is
|
|
484
|
+
# not copied here.
|
|
485
|
+
host_environment:
|
|
486
|
+
request_size_caps:
|
|
487
|
+
# Character cap on Bash tool output placed inline into a model request.
|
|
488
|
+
# null = not written, host default 30000 applies. Max 150000 -- above that
|
|
489
|
+
# the host caps it silently, so the schema refuses rather than writing a
|
|
490
|
+
# value the host changes behind you.
|
|
491
|
+
bash_max_output_length: null
|
|
492
|
+
# Token cap on a single MCP tool result. null = not written, host default
|
|
493
|
+
# 25000 applies.
|
|
494
|
+
max_mcp_output_tokens: null
|
|
495
|
+
|
|
467
496
|
# --- Augment Code projection (.augment/) ---
|
|
468
497
|
#
|
|
469
498
|
# Controls how rule files are written into .augment/rules/ during
|
|
@@ -924,6 +953,22 @@ consistency:
|
|
|
924
953
|
# flags + pre-redacts — never a clearance; the gate for a data-bearing screenshot
|
|
925
954
|
# is human confirmation (routing into `non-destructive-by-default`, since a
|
|
926
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
|
+
|
|
927
972
|
screenshots:
|
|
928
973
|
# Public identity tokens that are SAFE to show unredacted — the maintainer's
|
|
929
974
|
# OWN public handles (e.g. a username shown in an admin panel) plus well-known
|
|
@@ -1453,6 +1498,27 @@ hooks:
|
|
|
1453
1498
|
injection_scan:
|
|
1454
1499
|
enabled: false
|
|
1455
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
|
+
|
|
1456
1522
|
# NOTE — `turn_end_gate` has no keys here any more. The stop-slot turn-end
|
|
1457
1523
|
# gate is ALWAYS ARMED (2026-08-12); `hooks.turn_end_gate.*` was removed and
|
|
1458
1524
|
# a leftover block warns once on stderr and is ignored. Whether it fires is
|
|
@@ -1547,34 +1613,37 @@ hooks:
|
|
|
1547
1613
|
ui_route_nudge:
|
|
1548
1614
|
enabled: false
|
|
1549
1615
|
|
|
1550
|
-
#
|
|
1551
|
-
#
|
|
1552
|
-
#
|
|
1553
|
-
#
|
|
1554
|
-
#
|
|
1555
|
-
#
|
|
1556
|
-
#
|
|
1557
|
-
#
|
|
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).
|
|
1558
1632
|
#
|
|
1559
1633
|
# DEPRECATED (honest null, 2026-07-28): the pre-registered 2-arm retrieval
|
|
1560
1634
|
# benchmark measured the native graph at recall 0.365 vs grep 0.797 on
|
|
1561
1635
|
# graph-shaped questions across 3 real repos (internal/bench/reports/
|
|
1562
|
-
# code-graph-vs-grep.md; claim code-graph-retrieval-null).
|
|
1563
|
-
#
|
|
1564
|
-
#
|
|
1565
|
-
#
|
|
1566
|
-
# its reopen condition, which is the same one that was always written here:
|
|
1567
|
-
# external evidence — a consumer case the graph answers and disciplined grep
|
|
1568
|
-
# 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
|
|
1569
1640
|
# of 2026-08-22, which the 2026-07-28 figures predate.
|
|
1570
1641
|
#
|
|
1571
|
-
# The engine
|
|
1572
|
-
#
|
|
1573
|
-
#
|
|
1574
|
-
#
|
|
1575
|
-
#
|
|
1576
|
-
# Both versions are exact because the pair is ABI-coupled (grammar ABI 14).
|
|
1577
|
-
# 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`.
|
|
1578
1647
|
code_graph:
|
|
1579
1648
|
enabled: false
|
|
1580
1649
|
|
|
@@ -270,6 +270,24 @@ ci_only:
|
|
|
270
270
|
- id: release
|
|
271
271
|
class: release
|
|
272
272
|
reason: "tags, bumps, publishes, opens the release PR — the release itself"
|
|
273
|
+
- id: check_host_docs_digest
|
|
274
|
+
class: network
|
|
275
|
+
reason: >
|
|
276
|
+
road-to-hooks-on-every-host Phase 1.3. The watcher's whole subject is the
|
|
277
|
+
LIVE body of each host's hooks page, so its CI-side mode (`--fetch`) makes
|
|
278
|
+
eight outbound requests to vendor documentation sites. Putting that in
|
|
279
|
+
`task ci` would add eight network calls — and eight new ways to fail — to
|
|
280
|
+
every local run of an otherwise hermetic gate chain, for a signal that
|
|
281
|
+
changes on the order of vendor releases rather than of commits. It runs in
|
|
282
|
+
its own WEEKLY workflow (`host-docs-digest.yml`) and nowhere else.
|
|
283
|
+
It is also not a pull-request gate, so there is no failure a contributor
|
|
284
|
+
could discover only after pushing, which is the exact harm this checker
|
|
285
|
+
exists to prevent: a drift red is a standing finding about an upstream
|
|
286
|
+
page, never a verdict on anyone's branch.
|
|
287
|
+
Reachable locally without egress: `./scripts-run src/scripts/check_host_docs_digest`
|
|
288
|
+
(offline report) and `--self-test` (pure functions, no network); the
|
|
289
|
+
comparison logic itself is covered hermetically by
|
|
290
|
+
`tests/scripts/host_docs_digest.test.ts`.
|
|
273
291
|
|
|
274
292
|
# Gates a local chain runs that no workflow does — each needs a reason it is not
|
|
275
293
|
# worth remote enforcement, OR it should simply be added to a workflow. Prefer
|
|
@@ -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",
|
|
@@ -404,8 +411,8 @@
|
|
|
404
411
|
"id": "tool-result-census.jsonl",
|
|
405
412
|
"axis": "persistent_continuity_artefacts",
|
|
406
413
|
"disposition": "excluded",
|
|
407
|
-
"locus": "src/scripts/hooks/tool_result_bytes_hook.ts
|
|
408
|
-
"reason": "Tool-result byte census. Measurement output."
|
|
414
|
+
"locus": "src/scripts/hooks/tool_result_bytes_hook.ts",
|
|
415
|
+
"reason": "Tool-result byte census (raw_bytes / delivered_bytes). Measurement output, written only where the maintainer workspace resolves."
|
|
409
416
|
},
|
|
410
417
|
{
|
|
411
418
|
"id": "turn-end-gate",
|
|
@@ -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
|
}
|