@event4u/agent-config 16.2.0 → 16.4.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 +337 -234
- package/README.md +15 -13
- package/agents/templates/.ai-council.yml.example +26 -8
- package/dist/agent-src/commands/analyze/inbox.md +11 -8
- 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/bug/investigate.md +1 -1
- package/dist/agent-src/commands/commit/in-chunks.md +40 -31
- package/dist/agent-src/commands/commit.md +72 -33
- package/dist/agent-src/commands/condense.md +2 -8
- package/dist/agent-src/commands/council/debate.md +11 -7
- package/dist/agent-src/commands/council/default.md +10 -9
- package/dist/agent-src/commands/council.md +1 -1
- package/dist/agent-src/commands/estimate-ticket.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +3 -3
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +18 -4
- package/dist/agent-src/commands/fix/commit-messages.md +48 -23
- package/dist/agent-src/commands/fix/pr-comments.md +3 -6
- package/dist/agent-src/commands/implement-ticket.md +4 -4
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/memory/add.md +4 -16
- package/dist/agent-src/commands/memory/load.md +5 -6
- package/dist/agent-src/commands/memory/promote.md +3 -16
- package/dist/agent-src/commands/mission/upgrade.md +3 -2
- package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
- package/dist/agent-src/commands/optimize/deep.md +4 -2
- package/dist/agent-src/commands/optimize/rtk.md +4 -26
- package/dist/agent-src/commands/pr/create/description-only.md +18 -15
- package/dist/agent-src/commands/pr/create.md +42 -34
- package/dist/agent-src/commands/pr/merge.md +136 -9
- package/dist/agent-src/commands/prepare-for-review.md +13 -11
- package/dist/agent-src/commands/project/analyze.md +7 -35
- package/dist/agent-src/commands/refine-ticket.md +1 -1
- package/dist/agent-src/commands/review/changes.md +14 -19
- 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/next.md +10 -1
- package/dist/agent-src/commands/roadmap/process-full.md +56 -42
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +411 -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/worktree/create.md +7 -3
- package/dist/agent-src/commands/worktree/verify.md +2 -1
- 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/communication/rules-auto/think-before-action-mechanics.md +5 -3
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
- package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +7 -7
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
- package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
- package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +99 -54
- package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
- package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
- package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
- package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +95 -7
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
- package/dist/agent-src/guidelines/php/git.md +15 -2
- package/dist/agent-src/rules/active-remediation.md +1 -2
- package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
- package/dist/agent-src/rules/architecture.md +0 -1
- package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
- package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
- package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -1
- package/dist/agent-src/rules/brand-consistency.md +0 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
- package/dist/agent-src/rules/broken-access-control.md +1 -1
- package/dist/agent-src/rules/cli-output-handling.md +0 -1
- package/dist/agent-src/rules/code-comment-discipline.md +0 -1
- package/dist/agent-src/rules/code-provenance.md +0 -1
- package/dist/agent-src/rules/command-suggestion-policy.md +1 -1
- package/dist/agent-src/rules/commit-conventions.md +1 -2
- package/dist/agent-src/rules/communication-through-line.md +1 -2
- package/dist/agent-src/rules/content-quoting-floor.md +1 -2
- package/dist/agent-src/rules/context-hygiene.md +6 -6
- package/dist/agent-src/rules/copilot-routing.md +1 -2
- package/dist/agent-src/rules/council-availability.md +4 -4
- package/dist/agent-src/rules/cross-source-consistency.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +17 -35
- package/dist/agent-src/rules/delegation-policy.md +2 -3
- package/dist/agent-src/rules/design-fidelity.md +12 -16
- package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
- package/dist/agent-src/rules/devcontainer-routing.md +1 -2
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
- package/dist/agent-src/rules/docker-commands.md +0 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
- package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +1 -1
- package/dist/agent-src/rules/domain-safety-retention.md +1 -1
- package/dist/agent-src/rules/downstream-changes.md +0 -1
- package/dist/agent-src/rules/engineering-safety-floor.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +3 -2
- package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
- package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -2
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/fix-what-you-see.md +6 -32
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
- package/dist/agent-src/rules/git-history-discipline.md +2 -2
- package/dist/agent-src/rules/guidelines.md +0 -1
- package/dist/agent-src/rules/history-discipline.md +0 -1
- package/dist/agent-src/rules/icon-consistency.md +0 -1
- package/dist/agent-src/rules/image-likeness-and-rights.md +1 -1
- package/dist/agent-src/rules/improve-before-implement.md +0 -1
- package/dist/agent-src/rules/invite-challenge.md +0 -1
- package/dist/agent-src/rules/laravel-routing.md +1 -2
- package/dist/agent-src/rules/laravel-translations.md +0 -1
- package/dist/agent-src/rules/legal-safety-floor.md +3 -3
- package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -1
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
- package/dist/agent-src/rules/media-governance-routing.md +13 -17
- package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
- package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
- package/dist/agent-src/rules/missing-tool-handling.md +0 -1
- package/dist/agent-src/rules/model-recommendation.md +0 -1
- package/dist/agent-src/rules/neighbour-precedence.md +64 -0
- package/dist/agent-src/rules/no-attribution-footers.md +0 -1
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
- package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
- package/dist/agent-src/rules/no-roadmap-references.md +0 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
- package/dist/agent-src/rules/onboarding-gate.md +0 -1
- package/dist/agent-src/rules/output-discipline.md +0 -1
- package/dist/agent-src/rules/package-ci-checks.md +0 -1
- package/dist/agent-src/rules/persona-governance.md +4 -5
- package/dist/agent-src/rules/php-coding.md +0 -1
- package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
- package/dist/agent-src/rules/preservation-guard.md +0 -1
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -4
- package/dist/agent-src/rules/question-not-instruction.md +1 -1
- package/dist/agent-src/rules/reviewer-awareness.md +0 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +4 -7
- package/dist/agent-src/rules/role-mode-adherence.md +0 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -1
- package/dist/agent-src/rules/runtime-safety.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +0 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +3 -3
- package/dist/agent-src/rules/self-repair-loop.md +0 -1
- package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
- package/dist/agent-src/rules/session-canary.md +7 -62
- package/dist/agent-src/rules/settings-ask-protocol.md +6 -6
- package/dist/agent-src/rules/size-enforcement.md +0 -1
- package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
- package/dist/agent-src/rules/skill-quality.md +0 -1
- package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
- package/dist/agent-src/rules/source-confidentiality.md +1 -1
- package/dist/agent-src/rules/source-discovery-gate.md +0 -1
- package/dist/agent-src/rules/source-of-truth.md +0 -1
- package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/symfony-routing.md +1 -2
- package/dist/agent-src/rules/think-before-action.md +0 -1
- package/dist/agent-src/rules/token-budget-discipline.md +12 -46
- package/dist/agent-src/rules/token-efficiency.md +0 -1
- package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
- package/dist/agent-src/rules/tool-safety.md +1 -1
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
- package/dist/agent-src/rules/upstream-proposal.md +0 -1
- package/dist/agent-src/rules/user-interaction.md +0 -1
- package/dist/agent-src/rules/user-interrupt-priority.md +1 -1
- 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/gate_budget.ts +47 -23
- package/dist/agent-src/scripts/gate_execute.ts +12 -4
- package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
- package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
- package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -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/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
- package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
- package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
- package/dist/agent-src/skills/database/data/manifest.json +2 -2
- package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
- package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.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/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
- package/dist/agent-src/skills/iconography/SKILL.md +1 -1
- package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/po-discovery/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/refine-ticket/SKILL.md +4 -4
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -2
- 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/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +46 -129
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/roadmaps.md +6 -1
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/agent-src/templates/skill.md +1 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
- package/dist/cli-delegate/check_update_banner.js +207 -120
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-5GPULQBE.js} +2797 -338
- package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-6SRJTYJS.js} +42 -176
- package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
- package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
- package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
- package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
- package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
- package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-AED2VQGM.js} +1245 -249
- package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
- package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
- package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
- package/dist/cli-delegate/chunk-F3QDG2GT.js +2569 -0
- package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-G5VVIZRC.js} +3 -3
- package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-H76PHZBI.js} +149 -61
- package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
- package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
- 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-KXXWJTDO.js} +6 -11
- package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-MDPPKQCQ.js} +58 -9
- package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-MSUL5NYP.js} +5 -5
- package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
- 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-P6ZHP5W2.js → chunk-PWX7CKMD.js} +4 -4
- package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
- package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-T7XSJSUQ.js} +1144 -589
- package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
- package/dist/cli-delegate/chunk-WQWXGIWB.js +1779 -0
- package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-XQTPXKFA.js} +1 -1
- 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 +223 -43
- package/dist/cli-delegate/cmd_brand_status.js +3 -2
- package/dist/cli-delegate/cmd_conformance.js +1252 -249
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +19 -9
- package/dist/cli-delegate/cmd_doctor_neighbours.js +30 -0
- package/dist/cli-delegate/cmd_explain.js +45 -21
- package/dist/cli-delegate/cmd_export.js +13 -10
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_git_convention.js +1851 -0
- package/dist/cli-delegate/cmd_handoff.js +44 -22
- package/dist/cli-delegate/cmd_mcp_available.js +3 -2
- package/dist/cli-delegate/cmd_memory_get.js +3 -1
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +5 -4
- package/dist/cli-delegate/cmd_preflight.js +6 -6
- package/dist/cli-delegate/cmd_prune.js +14 -11
- package/dist/cli-delegate/cmd_refresh.js +2 -1
- package/dist/cli-delegate/cmd_route_audit.js +10 -8
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +10 -7
- package/dist/cli-delegate/cmd_settings_check.js +54 -7
- package/dist/cli-delegate/cmd_settings_get.js +18 -8
- package/dist/cli-delegate/cmd_settings_migrate.js +13 -10
- package/dist/cli-delegate/cmd_settings_set.js +4 -4
- package/dist/cli-delegate/cmd_sync.js +14 -11
- package/dist/cli-delegate/cmd_uninstall.js +15 -12
- package/dist/cli-delegate/cmd_update.js +7 -7
- package/dist/cli-delegate/cmd_upgrade.js +9 -8
- package/dist/cli-delegate/cmd_validate.js +15 -12
- package/dist/cli-delegate/cmd_versions.js +5 -5
- package/dist/cli-delegate/deferral_carry.js +16 -0
- package/dist/cli-delegate/gate_budget.js +1 -1
- package/dist/cli-delegate/gate_execute.js +3 -3
- package/dist/cli-delegate/roadmap_gates.js +6 -6
- package/dist/cli-delegate/update_roadmap_progress.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +232 -141
- 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 +26 -9
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +7 -4
- package/dist/hooks/dispatch.js +5655 -6623
- 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 +2336 -1249
- package/dist/install/installThinLayer.js +289 -0
- package/dist/install/installedRuleLinks.js +262 -0
- package/dist/install/wizard-plan.js +24 -0
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
- package/dist/mcp/registry-manifest.json +5 -5
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +36504 -30986
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +26 -120
- package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
- package/dist/scripts/_lib/compile_time_toggles.js +12 -21
- package/dist/scripts/_lib/git_convention.js +232 -0
- package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
- package/dist/scripts/_lib/installed_layer.js +704 -0
- package/dist/scripts/_lib/lean_projection_mode.js +218 -15
- package/dist/scripts/_lib/package_root.js +68 -0
- 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/settings_removed_keys.js +168 -0
- package/dist/scripts/_lib/thin_rules.js +535 -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/app.js +2 -1
- package/dist/server/gitKeysGate.js +105 -0
- package/dist/server/routes/settings.js +67 -8
- package/dist/server/routes/wizard.js +4 -0
- package/dist/server/schemas/settings.js +29 -81
- package/dist/shared/skillRanking.js +103 -16
- package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +72 -1
- package/docs/contracts/settings-classes.md +39 -67
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/docs/guidelines/agent-infra/layered-settings.md +13 -1
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
- package/docs/guidelines/php/git.md +15 -2
- 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/gate_budget.ts +47 -23
- package/src/agent-src/scripts/gate_execute.ts +12 -4
- package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/config/agent-settings.template.yml +141 -334
- package/src/config/agents-paths.yml +16 -0
- package/src/config/assurance-capability-registry.json +7 -3
- package/src/config/ci-local-parity.yml +3 -0
- package/src/config/continuity-surface.json +10 -3
- package/src/config/discovery/packs.yml +17 -1
- package/src/config/evaluator-budgets.json +23 -10
- package/src/config/gate-coverage.yml +138 -3
- package/src/config/gate-violation-baselines.json +64 -16
- package/src/config/gitignore-block.txt +19 -0
- 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/release-gate-locality.yml +2 -1
- package/src/config/routing-coverage-seed.json +67 -4
- 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 +105 -0
- package/src/config/rule-obligations.json +833 -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 +378 -0
- package/src/install/installedRuleLinks.ts +308 -0
- package/src/install/wizard-plan.ts +24 -0
- package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
- package/src/scripts/_cli/cmd_conformance.ts +13 -2
- package/src/scripts/_cli/cmd_doctor.ts +33 -81
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +426 -0
- package/src/scripts/_cli/cmd_explain.ts +72 -14
- package/src/scripts/_cli/cmd_git_convention.ts +637 -0
- package/src/scripts/_cli/cmd_settings_check.ts +66 -8
- package/src/scripts/_cli/cmd_settings_get.ts +18 -3
- package/src/scripts/_cli/doctor_execution.ts +72 -1
- package/src/scripts/_dispatch.bash +53 -4
- package/src/scripts/_lib/agent_settings.ts +26 -124
- package/src/scripts/_lib/blocked_by_marker.ts +1 -1
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/compile_time_toggles.ts +12 -21
- package/src/scripts/_lib/dispatch_import_closure.ts +163 -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/git_base_ref.ts +92 -0
- package/src/scripts/_lib/git_convention.ts +291 -0
- package/src/scripts/_lib/git_convention_carrier.ts +389 -0
- package/src/scripts/_lib/git_convention_grammar.ts +246 -0
- package/src/scripts/_lib/git_convention_measure.ts +344 -0
- package/src/scripts/_lib/gitignore_block.ts +314 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +106 -0
- package/src/scripts/_lib/graph_feeder_record.ts +437 -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 +963 -0
- package/src/scripts/_lib/json_merge.ts +82 -0
- package/src/scripts/_lib/json_pointers.ts +93 -11
- package/src/scripts/_lib/knowledge_global.ts +14 -1
- package/src/scripts/_lib/lean_projection_mode.ts +275 -15
- package/src/scripts/_lib/machine_wake.ts +16 -3
- package/src/scripts/_lib/module_reach.ts +456 -0
- package/src/scripts/_lib/neighbour_census.ts +760 -0
- package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
- package/src/scripts/_lib/neighbour_scan.ts +122 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +187 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/ratification_artifact.ts +220 -1
- package/src/scripts/_lib/ratification_subject.ts +92 -0
- package/src/scripts/_lib/release_findings_ingest.ts +15 -7
- package/src/scripts/_lib/release_highlights.ts +5 -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/rule_obligations.ts +205 -0
- package/src/scripts/_lib/self_repair.ts +1 -1
- package/src/scripts/_lib/settings_removed_keys.ts +173 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structured_ask.ts +64 -21
- package/src/scripts/_lib/test_red_state.ts +5 -0
- package/src/scripts/_lib/thin_rules.ts +620 -0
- package/src/scripts/_lib/touched_file_quality.ts +570 -0
- package/src/scripts/_lib/turn_end_refusals.ts +77 -2
- package/src/scripts/_lib/windsurf_render.ts +63 -0
- package/src/scripts/_lib/worker_budget.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +16 -1
- 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 +8 -8
- package/src/scripts/ai_council/modification_review.ts +100 -0
- package/src/scripts/ai_council/modification_review_questions.ts +90 -0
- package/src/scripts/ai_council/orchestrator.ts +5 -5
- package/src/scripts/ai_council/spend_gate.ts +18 -7
- package/src/scripts/ai_council/vendor_defaults.ts +45 -0
- package/src/scripts/ai_team/config.ts +11 -16
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/audit_user_type_axis.ts +20 -8
- package/src/scripts/before_complete_hook.ts +243 -12
- package/src/scripts/bench_ab_clone.ts +1 -2
- package/src/scripts/bench_concern_spawn_path.ts +129 -0
- package/src/scripts/bench_graph_feeder_latency.ts +584 -0
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/check_agent_artifact_location.ts +36 -0
- package/src/scripts/check_branch_freshness.ts +147 -24
- package/src/scripts/check_enforcement_coverage.ts +130 -0
- package/src/scripts/check_enforcement_matrix.ts +377 -20
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_evaluator_budgets.ts +4 -0
- package/src/scripts/check_finding_dispositions.ts +196 -21
- package/src/scripts/check_gate_coverage.ts +4 -3
- package/src/scripts/check_gate_reachability.ts +48 -1
- package/src/scripts/check_generator_sync.ts +48 -0
- package/src/scripts/check_hook_bundle_composition.ts +477 -0
- package/src/scripts/check_kernel_edit_ratified.ts +132 -14
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_manifest_content.ts +189 -0
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_standing_rule_delivery.ts +129 -13
- package/src/scripts/check_suppression_hygiene.ts +2 -5
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/ci_settle.ts +42 -5
- package/src/scripts/classify_merge_risk.ts +320 -0
- package/src/scripts/closure_scan.ts +91 -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/command_suggester/settings.ts +8 -108
- package/src/scripts/command_suggester/types.ts +4 -5
- package/src/scripts/compile_hook_manifest.ts +33 -1
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/consumer_matrix.ts +102 -0
- package/src/scripts/context_hygiene_hook.ts +13 -23
- package/src/scripts/cost/preflight.mjs +12 -1
- package/src/scripts/council_cli.ts +7 -7
- package/src/scripts/dispatch_r2_reviewer.ts +24 -11
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/explain_run.ts +8 -13
- package/src/scripts/generate_git_convention_grammar.ts +127 -0
- package/src/scripts/generate_host_cost_table.ts +21 -4
- package/src/scripts/handoff_context_hook.ts +86 -37
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +175 -15
- package/src/scripts/hooks/block_config_weakening.ts +115 -7
- package/src/scripts/hooks/block_plumbing_writes.ts +37 -5
- 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/concern_registry.ts +2 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
- package/src/scripts/hooks/dispatch_hook.ts +52 -52
- package/src/scripts/hooks/evidence_independence.ts +12 -4
- 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/mcp_usage_observation_hook.ts +121 -0
- 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/push_settle_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +795 -60
- package/src/scripts/hooks/state_io.ts +8 -4
- package/src/scripts/hooks/table_fingerprint.ts +21 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +24 -7
- package/src/scripts/hooks/turn_end_gate_hook.ts +85 -0
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install-hooks.sh +42 -14
- package/src/scripts/install.ts +78 -215
- 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_blocker_citations.ts +198 -0
- package/src/scripts/lint_evidence_artifacts.ts +9 -0
- package/src/scripts/lint_hook_concern_budget.ts +10 -21
- 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 +465 -29
- package/src/scripts/lint_roadmap_blockers.ts +282 -29
- package/src/scripts/lint_roadmap_complexity.ts +4 -2
- package/src/scripts/lint_rule_law_section.ts +647 -0
- package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
- package/src/scripts/lint_settings_classes.ts +1 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
- package/src/scripts/lint_workflow_security.ts +173 -6
- 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 +221 -8
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/model_rule_injection.ts +55 -8
- package/src/scripts/onboarding_gate_hook.ts +7 -6
- package/src/scripts/print_required_checks.ts +15 -3
- package/src/scripts/probe_host_compliance.ts +33 -5
- package/src/scripts/probe_turnaround.ts +183 -3
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/ratification_header.ts +77 -0
- package/src/scripts/refusal_envelope.ts +138 -0
- package/src/scripts/release_publication.ts +29 -3
- package/src/scripts/report_dispatch_import_closure.ts +76 -0
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +274 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_module_reach.ts +212 -0
- package/src/scripts/report_obligation_mechanism.ts +228 -0
- package/src/scripts/report_parked_blockers.ts +222 -0
- package/src/scripts/report_required_checks_drift.ts +196 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_ranker_confusion.ts +543 -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/routing_doctor.ts +2 -2
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/agent-settings.schema.json +17 -31
- package/src/scripts/schemas/command.schema.json +1 -1
- package/src/scripts/schemas/review-findings.schema.json +3 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/schemas/skill.schema.json +1 -1
- package/src/scripts/self_review_gate.ts +101 -9
- package/src/scripts/skill_tools/score_skill_relevance.ts +314 -40
- package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
- package/src/scripts/sync_gitignore.ts +29 -235
- package/src/scripts/sync_pr_branch.ts +403 -132
- package/src/scripts/trigger_eval_grandfather.json +0 -21
- package/src/server/schemas/settings.ts +42 -176
- package/src/shared/skillRanking.ts +169 -14
- package/dist/cli-delegate/chunk-5R7HOLAF.js +0 -99
- package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
- package/src/scripts/_lib/config_chain.ts +0 -477
- package/src/scripts/_lib/conformance_report.ts +0 -403
- package/src/scripts/_lib/eval_discrimination.ts +0 -95
- package/src/scripts/_lib/evaluator_promotion.ts +0 -225
- package/src/scripts/_lib/file_slicer.ts +0 -117
- package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
- package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
- package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
- package/src/scripts/_lib/role_split.ts +0 -338
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The registry of DELETED settings keys, and the once-per-run notice a leftover
|
|
3
|
+
* value gets. Extracted from `agent_settings.ts`, which sits at the 1500-line
|
|
4
|
+
* source ceiling — every retirement batch adds entries here, and here they cost
|
|
5
|
+
* no ratchet. `agent_settings.ts` re-exports `REMOVED_KEYS` so existing
|
|
6
|
+
* importers (the loader, `lint_settings_classes`) are unchanged.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
type SettingsDict = Record<string, unknown>;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Settings keys this package has DELETED. A leftover value from an older
|
|
13
|
+
* install is ignored — never applied by any reader — and surfaced with ONE
|
|
14
|
+
* deprecation line per key per process run (stderr; the exit code never
|
|
15
|
+
* changes).
|
|
16
|
+
*
|
|
17
|
+
* The map carries a per-key REASON rather than one shared sentence, because
|
|
18
|
+
* the list now spans more than one deletion doctrine and a single blanket
|
|
19
|
+
* phrase would mis-attribute every future entry. A reader who hits the line
|
|
20
|
+
* should learn why the key went, not just that it did.
|
|
21
|
+
*
|
|
22
|
+
* `subagents.*` — the always-on-orchestration doctrine
|
|
23
|
+
* (road-to-always-on-orchestration Phase 1): the layer has no per-layer
|
|
24
|
+
* on/off setting any more. `ai_team.enabled` joined in Step 1.3 — the
|
|
25
|
+
* `/team` family's availability is a codex-CLI/auth FACT
|
|
26
|
+
* (`src/scripts/ai_team/availability.ts`), not a flag; the `ai_team` config
|
|
27
|
+
* loader (`src/scripts/ai_team/config.ts`) separately accepts a leftover
|
|
28
|
+
* `enabled` key without failing closed, so this warning is the only surfaced
|
|
29
|
+
* signal of that deletion.
|
|
30
|
+
*
|
|
31
|
+
* `hooks.turn_end_gate.*` — the turn-end gate is always armed (2026-08-12).
|
|
32
|
+
* A default-off safety gate cannot soak, so the switch protecting the soak
|
|
33
|
+
* made the soak impossible; whether the gate fires is now decided by each
|
|
34
|
+
* detector's own trigger conditions. See `turn_end_gate_hook.ts` § "Always
|
|
35
|
+
* armed".
|
|
36
|
+
*
|
|
37
|
+
* The five `derivable` leaves below (2026-08-12, road-to-zero-settings Phase
|
|
38
|
+
* 2.1) are a different case from every entry above them, and the difference is
|
|
39
|
+
* the whole safety argument: no code path ever *consulted* them. Each appeared
|
|
40
|
+
* in the template, the schema and the reference page, and several in the setup
|
|
41
|
+
* wizard, while the decision they looked like they governed was taken
|
|
42
|
+
* elsewhere. A key nothing reads cannot change a default by leaving — so this
|
|
43
|
+
* is the one deletion batch that needs no replacement mechanism, only the
|
|
44
|
+
* per-key statement of what already decides.
|
|
45
|
+
*
|
|
46
|
+
* A sixth unread key, `screenshots.data_bearing_gate`, was found in the same
|
|
47
|
+
* pass and deliberately NOT deleted — it is `consent`, and the open question is
|
|
48
|
+
* whether the repair is to build its missing reader or to delete a promise a
|
|
49
|
+
* Hard Floor can never honour. See `settings-classes.md` § The six unread keys.
|
|
50
|
+
*
|
|
51
|
+
* `worktrees.mode` (2026-08-13, ADR-229) is a third doctrine again: not
|
|
52
|
+
* always-on, not unread. It WAS read, and the reader honoured all three values —
|
|
53
|
+
* the deletion says the decision was never the agent's to make. `ask` bought a
|
|
54
|
+
* round trip per spawn, `on` let the agent start parallel work unprompted, and
|
|
55
|
+
* `off` described the wanted behavior, so `off` became the hardcoded rule and
|
|
56
|
+
* the switch went. What decides instead is the user's own sentence in the chat.
|
|
57
|
+
*
|
|
58
|
+
* The 2026-10-09 batch (road-to-settings-classes-derivable-surface-stagnation
|
|
59
|
+
* Phase 2) is a fourth doctrine: `derivable` keys whose shipped default is the
|
|
60
|
+
* only behavior the package supports. Each WAS read — by code or by rule and
|
|
61
|
+
* command prose — and every reader was rewritten to state the old default as
|
|
62
|
+
* fixed behavior in the same change, so retiring the key changes no effective
|
|
63
|
+
* default; what a consumer who had set a non-default value loses is named by
|
|
64
|
+
* the reason.
|
|
65
|
+
*
|
|
66
|
+
* Every reason string must name what decides INSTEAD, never just "removed".
|
|
67
|
+
* Exported so `lint_settings_classes` can check the deletion side of the
|
|
68
|
+
* surface: a reason that names no replacement, or an entry whose key is live in
|
|
69
|
+
* the template again, is a contradiction the loader itself cannot notice.
|
|
70
|
+
*/
|
|
71
|
+
export const REMOVED_KEYS: ReadonlyMap<string, string> = new Map([
|
|
72
|
+
['subagents.enabled', 'always-on orchestration'],
|
|
73
|
+
['subagents.auto', 'always-on orchestration'],
|
|
74
|
+
['subagents.host_capabilities', 'always-on orchestration'],
|
|
75
|
+
['subagents.budget_routing', 'always-on orchestration'],
|
|
76
|
+
['ai_team.enabled', 'always-on orchestration'],
|
|
77
|
+
['hooks.turn_end_gate.enabled', 'the turn-end gate is always armed'],
|
|
78
|
+
['hooks.turn_end_gate.promissory', 'the turn-end gate is always armed'],
|
|
79
|
+
['hooks.turn_end_gate.language', 'the turn-end gate is always armed'],
|
|
80
|
+
['hooks.turn_end_gate.verification', 'the turn-end gate is always armed'],
|
|
81
|
+
['telegraph.speak_scope', 'the rule body states its own scope; compile_time_toggles decides whether the rule ships'],
|
|
82
|
+
['chat_history.max_size_kb', 'the rotate command takes --max-kb from argv; session-count pruning bounds the file'],
|
|
83
|
+
['chat_history.on_overflow', 'the overflow mode comes from the rotate command --mode argv'],
|
|
84
|
+
['quality.wait_for_remote_ci', 'whether to poll follows from the push plus a detectable remote pipeline'],
|
|
85
|
+
['legal_review_prep.consented_at', 'the provenance sidecar settings:set writes and consentVerdict reads'],
|
|
86
|
+
['worktrees.mode', 'the user asking for a worktree in the chat; creation is instruction-only and hardcoded'],
|
|
87
|
+
// 2026-10-09 — output and tone
|
|
88
|
+
['personal.minimal_output', 'direct-answers Iron Law 3 mandates terse replies; there is no verbose mode'],
|
|
89
|
+
['personal.play_by_play', 'direct-answers: no narration unless the user asks for it in the turn'],
|
|
90
|
+
['personal.pr_comment_bot_icon', 'no-decorative-emojis-in-git-surfaces forbids the 🤖 prefix'],
|
|
91
|
+
['verbosity.intent_announcements', 'direct-answers: act and emit the result, no "Let me…" openers'],
|
|
92
|
+
['verbosity.preview_artifacts', 'generated content is used directly; preview-on-error and the Iron-Law gates decide when a preview shows'],
|
|
93
|
+
['verbosity.routine_confirmations', 'the no-cheap-questions Pre-Send Self-Check; Iron-Law gates always ask'],
|
|
94
|
+
['verbosity.post_action_reports', 'direct-answers Iron Law 3: a one-line confirmation and one end-summary'],
|
|
95
|
+
['telegraph.speak', 'the telegraph-speak predicate in compile_time_toggles.ts; the bench verdict is package-level (ADR telegraph/0002)'],
|
|
96
|
+
['tokens.rich_skills', "the skill's own token_budget_class: rich plus the lint_token_budget_discipline ceiling"],
|
|
97
|
+
// 2026-10-09 — reasoning protocol switches
|
|
98
|
+
['reasoning.auto_gate', 'the RDP gate task signal plus the host self-assessment in rdp-gate.md'],
|
|
99
|
+
['reasoning.components.orchestrator', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
|
|
100
|
+
['reasoning.components.notes_first', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
|
|
101
|
+
['reasoning.components.grounding', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
|
|
102
|
+
['reasoning.components.intent', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
|
|
103
|
+
['reasoning.components.complexity_first', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
|
|
104
|
+
['reasoning.components.verifier_default', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
|
|
105
|
+
['reasoning.components.prediction_tracking', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
|
|
106
|
+
['reasoning.components.decision_ledger', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
|
|
107
|
+
['reasoning.components.uncertainty_budget', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
|
|
108
|
+
// 2026-10-09 — roadmap cadence
|
|
109
|
+
['roadmap.skip_pre_run_gate', 'the command name names the scope; only an ambiguous roadmap or an unresolvable conflict shows the gate'],
|
|
110
|
+
['roadmap.dashboard_regen_cadence', 'a fixed cadence: every 5th closed step, every phase boundary, reply end and any file-shape touch'],
|
|
111
|
+
// 2026-10-09 — command suggestion and PR creation
|
|
112
|
+
['commands.auto_detect', "an orchestrator's own auto_detect front-matter and the --no-auto-detect flag"],
|
|
113
|
+
['commands.suggestion.enabled', 'the suggester match-score floor and cooldown; /command-suggestion-off silences one conversation'],
|
|
114
|
+
['commands.suggestion.confidence_floor', "the suggester's fixed 0.6 floor; a command's own suggestion frontmatter can tighten it"],
|
|
115
|
+
['commands.suggestion.cooldown_seconds', "the suggester's fixed 600-second cooldown; a command's own suggestion frontmatter can lengthen it"],
|
|
116
|
+
['commands.suggestion.max_options', 'the fixed cap of 4 suggestions plus the always-present as-is option'],
|
|
117
|
+
['commands.create_pr.api_examples', "/create-pr's grounding rule: an example only from a real source, otherwise a one-line pointer"],
|
|
118
|
+
['commands.create_pr.ui_paths', "/create-pr's light frontend heuristic, which fails open"],
|
|
119
|
+
['commands.create_pr.api_paths', "/create-pr's light API-endpoint heuristic, which fails open"],
|
|
120
|
+
// 2026-10-09 — memory and knowledge sharing
|
|
121
|
+
['memory.cadence', 'a fixed cadence: the memory line renders whenever a memory type was asked; memory.visibility: off still silences it'],
|
|
122
|
+
['memory.review_threshold', "/memory load's fixed preview threshold of 10 unreviewed intake signals"],
|
|
123
|
+
['knowledge.global_sharing.redaction.enabled', 'the write-time redaction scan, which always runs before a card goes global'],
|
|
124
|
+
['knowledge.global_sharing.redaction.halt_on_trigger', 'the redaction gate, which always halts on a confidential-pattern hit'],
|
|
125
|
+
['knowledge.global_sharing.auto_promote_threshold', 'the fixed two-repo sighting count that triggers a promotion suggestion'],
|
|
126
|
+
['knowledge.global_sharing.freshness.hypothesis_after_days', "the card's age over last_verified against the fixed 90-day lead-only window"],
|
|
127
|
+
['knowledge.global_sharing.freshness.stale_after_days', "the card's age over last_verified against the fixed 180-day skip window"],
|
|
128
|
+
// 2026-10-09 — hooks and engine
|
|
129
|
+
['hooks.concern_budget.max_per_event', "the concern-budget gate's own constant of 8 per (platform, event) cell"],
|
|
130
|
+
['hooks.concern_budget.hard_fail', "the concern-budget gate's --strict argv; without it the gate warns"],
|
|
131
|
+
['decision_engine.surface_traces', 'nothing: the per-phase decision trace stays off, the old default'],
|
|
132
|
+
['decision_engine.on_block_fallback', 'the fail-safe: an on_block ask that times out always stops'],
|
|
133
|
+
['explain.enable_last', 'the presence of a work-state trace; explain last always renders it'],
|
|
134
|
+
// 2026-10-09 — remaining
|
|
135
|
+
['project.pr_template', '/create-pr, which reads .github/pull_request_template.md'],
|
|
136
|
+
['pipelines.skill_improvement', 'the skill-improvement-trigger rule; the capture is a proposal the user confirms'],
|
|
137
|
+
['consistency.cross_source', 'the cross-source-consistency rule, always on; batching and the no-cheap-questions floor bound the noise'],
|
|
138
|
+
['subagents.downshift', 'the model_tier each sub-task declares; downshift is always on'],
|
|
139
|
+
['ai_team.suppress_setup_hint', 'nothing: the one-line team-mode setup hint is always shown'],
|
|
140
|
+
]);
|
|
141
|
+
|
|
142
|
+
/** Keys already warned about in THIS process — the "once per run" dedupe. */
|
|
143
|
+
const _warnedRemovedKeys = new Set<string>();
|
|
144
|
+
|
|
145
|
+
/** Read one dotted path out of a merged settings tree; `undefined` when absent. */
|
|
146
|
+
function _readDotted(root: SettingsDict, dotted: string): unknown {
|
|
147
|
+
let node: unknown = root;
|
|
148
|
+
for (const part of dotted.split('.')) {
|
|
149
|
+
if (typeof node !== 'object' || node === null || Array.isArray(node)) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
node = (node as SettingsDict)[part];
|
|
153
|
+
}
|
|
154
|
+
return node;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Warn once per process, on stderr, for every {@link REMOVED_KEYS} entry still
|
|
159
|
+
* present in a resolved settings tree. Never throws, never changes what the
|
|
160
|
+
* caller does with `merged` — a pure notification side effect.
|
|
161
|
+
*/
|
|
162
|
+
export function warnRemovedKeys(merged: SettingsDict): void {
|
|
163
|
+
for (const [key, reason] of REMOVED_KEYS) {
|
|
164
|
+
if (_warnedRemovedKeys.has(key)) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (_readDotted(merged, key) === undefined) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
_warnedRemovedKeys.add(key);
|
|
171
|
+
process.stderr.write(`${key} was removed (${reason}); ignored.\n`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who put a ranked skill on disk, and whether its body has been looked at.
|
|
3
|
+
*
|
|
4
|
+
* SPLIT OUT OF `neighbour_census.ts` FOR ONE CONCRETE REASON. The ranker
|
|
5
|
+
* (`skill_tools/score_skill_relevance`) needs these primitives, and the ranker
|
|
6
|
+
* runs inside the shared hook bundle on `user_prompt_submit`. The census module
|
|
7
|
+
* reaches the host-hook merger, the secret detector and the install-ownership
|
|
8
|
+
* reader; every byte of that would be inlined into one bundle that every concern
|
|
9
|
+
* loads on every dispatch, under a ceiling `check_hook_bundle_composition` holds.
|
|
10
|
+
* So the primitives live here, importing only the manifest reader, and the census
|
|
11
|
+
* re-exports them — one definition, two call sites, no second module graph.
|
|
12
|
+
*
|
|
13
|
+
* ORIGIN IS READ FROM A CLAIM RECORD, NEVER INFERRED FROM A ROOT. The temptation
|
|
14
|
+
* is to call `~/.claude/skills` foreign and the workspace ours. That is wrong in
|
|
15
|
+
* both directions: `agent-config install` writes this package's own skills into
|
|
16
|
+
* the host-global root, and a consumer's hand-written skills sit in the project
|
|
17
|
+
* root. The one artifact that records what this package actually wrote is the
|
|
18
|
+
* installed-tools manifest, so the manifest is the authority and the root is only
|
|
19
|
+
* a tie-break between the two NON-package labels.
|
|
20
|
+
*/
|
|
21
|
+
import { createHash } from 'node:crypto';
|
|
22
|
+
import * as fs from 'node:fs';
|
|
23
|
+
import * as os from 'node:os';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
|
|
26
|
+
import { parse as parseYaml } from 'yaml';
|
|
27
|
+
|
|
28
|
+
import { manifest_path } from './installed_tools.js';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Where a RANKED skill came from — a question about AUTHORSHIP.
|
|
32
|
+
*
|
|
33
|
+
* Deliberately not the census's `origin` id segment, which is WHERE a file was
|
|
34
|
+
* found (`project`, `user`, `cursor`, …). Location does not answer authorship in
|
|
35
|
+
* either direction, which is the whole reason this type exists beside that one.
|
|
36
|
+
*
|
|
37
|
+
* `home` is spelled `home` rather than the census's `user` because this value is
|
|
38
|
+
* printed on a ROUTE LINE beside a skill name, where it has to read as a place a
|
|
39
|
+
* reader can go and look.
|
|
40
|
+
*/
|
|
41
|
+
export type SkillOrigin = 'package' | 'project' | 'home';
|
|
42
|
+
|
|
43
|
+
/** One `compat` label per neighbour skill. Order decided in {@link classifyCompat}. */
|
|
44
|
+
export type Compat = 'shadowed' | 'overlapping' | 'unscanned' | 'unclassified';
|
|
45
|
+
|
|
46
|
+
/** The authored source tree, relative to a maintainer checkout's root. */
|
|
47
|
+
export const AUTHORED_SKILL_ROOT = path.join('src', 'skills');
|
|
48
|
+
|
|
49
|
+
/** Where the scan verdicts the ranker reads are written, relative to the root. */
|
|
50
|
+
export const SCAN_CACHE_RELATIVE = path.join('agents', 'reports', 'neighbour-scan.json');
|
|
51
|
+
|
|
52
|
+
/** Default scan-cache path for a project root. */
|
|
53
|
+
export function scanCachePath(projectRoot: string): string {
|
|
54
|
+
return path.join(projectRoot, SCAN_CACHE_RELATIVE);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* What a route line prints: bare for ours, `origin:name` for a neighbour.
|
|
59
|
+
*
|
|
60
|
+
* One function, so the ranker, the census and every report agree on the
|
|
61
|
+
* spelling. Two spellings of one name is how a collision stops being visible,
|
|
62
|
+
* which is the defect this whole step exists to close.
|
|
63
|
+
*/
|
|
64
|
+
export function qualifiedSkillName(name: string, origin: SkillOrigin): string {
|
|
65
|
+
return origin === 'package' ? name : `${origin}:${name}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Split a qualified name back apart. A bare name resolves to `package`. */
|
|
69
|
+
export function splitQualifiedName(qualified: string): { origin: SkillOrigin; name: string } {
|
|
70
|
+
const m = /^(project|home):([\s\S]*)$/.exec(qualified);
|
|
71
|
+
if (m) return { origin: m[1] as SkillOrigin, name: m[2] as string };
|
|
72
|
+
return { origin: 'package', name: qualified };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Every absolute path this package's installed-tools manifest claims, or `null`
|
|
77
|
+
* when there is no manifest to claim anything.
|
|
78
|
+
*
|
|
79
|
+
* `null` and an empty set are different answers and callers must keep them
|
|
80
|
+
* apart. An empty set means the manifest was read and claims nothing; `null`
|
|
81
|
+
* means nothing recorded a claim at all, which is a tree that has never run an
|
|
82
|
+
* install — this repository, for one.
|
|
83
|
+
*
|
|
84
|
+
* WHY THIS PARSES THE MANIFEST ITSELF, which is a thing to justify rather than
|
|
85
|
+
* do quietly. Three readers of this file already exist and none answers this
|
|
86
|
+
* question at a cost this path can pay. `installed_tools.read_manifest` drops
|
|
87
|
+
* the nested `tools[].files[]` rows by design — its own header says so, and
|
|
88
|
+
* those rows are the entire input here. `install_drift.collect_drift` and
|
|
89
|
+
* `recordedOwnership.readRecordedHashes` both parse the YAML directly FOR THAT
|
|
90
|
+
* REASON, so parsing it directly is the established answer rather than a new
|
|
91
|
+
* idea; what is new is the fourth question — the PATHS only, with no sha, no
|
|
92
|
+
* tool grouping and no hash map. `readRecordedHashes` would have answered it
|
|
93
|
+
* and was measured costing 1,706 bytes of the shared hook bundle, which is the
|
|
94
|
+
* budget this whole module was split out to protect. The `~` expansion below is
|
|
95
|
+
* the same one all three use.
|
|
96
|
+
*/
|
|
97
|
+
export function packageClaimedPaths(projectRoot: string): ReadonlySet<string> | null {
|
|
98
|
+
const manifest = manifest_path(projectRoot);
|
|
99
|
+
let doc: unknown;
|
|
100
|
+
try {
|
|
101
|
+
doc = parseYaml(fs.readFileSync(manifest, 'utf-8'), { version: '1.1' });
|
|
102
|
+
} catch {
|
|
103
|
+
// Unreadable and absent are the same answer: nothing recorded a claim.
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
if (doc === null || typeof doc !== 'object' || Array.isArray(doc)) return null;
|
|
107
|
+
const tools = (doc as Record<string, unknown>)['tools'];
|
|
108
|
+
const out = new Set<string>();
|
|
109
|
+
if (!Array.isArray(tools)) return out;
|
|
110
|
+
for (const tool of tools) {
|
|
111
|
+
if (tool === null || typeof tool !== 'object' || Array.isArray(tool)) continue;
|
|
112
|
+
const files = (tool as Record<string, unknown>)['files'];
|
|
113
|
+
if (!Array.isArray(files)) continue;
|
|
114
|
+
for (const entry of files) {
|
|
115
|
+
if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) continue;
|
|
116
|
+
const raw = (entry as Record<string, unknown>)['path'];
|
|
117
|
+
if (typeof raw !== 'string' || raw === '') continue;
|
|
118
|
+
out.add(path.resolve(projectRoot, _expanduser(raw)));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Expand a leading `~`, matching the three sibling manifest readers. */
|
|
125
|
+
function _expanduser(p: string): string {
|
|
126
|
+
if (p === '~') return os.homedir();
|
|
127
|
+
if (p.startsWith('~/') || (process.platform === 'win32' && p.startsWith('~\\'))) {
|
|
128
|
+
return path.join(os.homedir(), p.slice(2));
|
|
129
|
+
}
|
|
130
|
+
return p;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface SkillOriginOptions {
|
|
134
|
+
/** Pre-read claim set, to avoid a second manifest read. `null` = no manifest. */
|
|
135
|
+
claims?: ReadonlySet<string> | null;
|
|
136
|
+
/** Maintainer checkout root whose `src/skills` is the authored tree. */
|
|
137
|
+
packageRoot?: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Resolve one `SKILL.md` path to the origin of the skill it defines.
|
|
142
|
+
*
|
|
143
|
+
* NO CLAIM RECORD MEANS NO QUALIFIER. With no manifest, nothing on disk carries
|
|
144
|
+
* evidence that any skill is foreign, so everything resolves to `package`, the
|
|
145
|
+
* ranker qualifies nothing, and its output is exactly what it was before this
|
|
146
|
+
* function existed. That is deliberate rather than a gap being tolerated: a
|
|
147
|
+
* `home:` prefix asserted without a claim record is a guess printed in the shape
|
|
148
|
+
* of a fact, and a reader cannot tell the two apart. The cost is stated rather
|
|
149
|
+
* than hidden — where no manifest exists a foreign skill is invisible here, and
|
|
150
|
+
* the thing that fixes it is running an install, not loosening this rule.
|
|
151
|
+
*
|
|
152
|
+
* The authored tree is the one exception, and it is a construction rather than a
|
|
153
|
+
* guess: `<root>/src/skills` exists only in a maintainer checkout of THIS
|
|
154
|
+
* package and holds its source of truth, so nothing foreign can be under it.
|
|
155
|
+
*/
|
|
156
|
+
export function makeSkillOriginResolver(
|
|
157
|
+
projectRoot: string,
|
|
158
|
+
opts: SkillOriginOptions = {},
|
|
159
|
+
): (skillMdPath: string) => SkillOrigin {
|
|
160
|
+
const claims = opts.claims !== undefined ? opts.claims : packageClaimedPaths(projectRoot);
|
|
161
|
+
const root = path.resolve(projectRoot);
|
|
162
|
+
const authored = path.join(path.resolve(opts.packageRoot ?? projectRoot), AUTHORED_SKILL_ROOT);
|
|
163
|
+
const under = (abs: string, dir: string): boolean =>
|
|
164
|
+
abs === dir || abs.startsWith(dir + path.sep);
|
|
165
|
+
return (skillMdPath: string): SkillOrigin => {
|
|
166
|
+
const abs = path.resolve(skillMdPath);
|
|
167
|
+
if (under(abs, authored)) return 'package';
|
|
168
|
+
if (claims === null) return 'package';
|
|
169
|
+
if (claims.has(abs)) return 'package';
|
|
170
|
+
return under(abs, root) ? 'project' : 'home';
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* The one label, and the order it is decided in.
|
|
176
|
+
*
|
|
177
|
+
* `unscanned` — the shape scan refused the body. FIRST, because an overlap
|
|
178
|
+
* score is derived FROM a body this census declined to read,
|
|
179
|
+
* and publishing it would be the refusal cancelling itself.
|
|
180
|
+
* `shadowed` — one of ours carries the same bare name. Name-derived, so it
|
|
181
|
+
* stays true under `unscanned`; it loses the slot only
|
|
182
|
+
* because `unscanned` is the stronger call to action.
|
|
183
|
+
* `overlapping` — content similarity against one of ours at or above the
|
|
184
|
+
* threshold `audit_skill_overlap` already calibrates.
|
|
185
|
+
* `unclassified` — none of the above fired. Not a clearance.
|
|
186
|
+
*/
|
|
187
|
+
export function classifyCompat(args: {
|
|
188
|
+
unscanned: string | null;
|
|
189
|
+
shadows: readonly string[];
|
|
190
|
+
overlaps: readonly string[];
|
|
191
|
+
}): Compat {
|
|
192
|
+
if (args.unscanned !== null) return 'unscanned';
|
|
193
|
+
if (args.shadows.length > 0) return 'shadowed';
|
|
194
|
+
if (args.overlaps.length > 0) return 'overlapping';
|
|
195
|
+
return 'unclassified';
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** One recorded scan verdict. `unscanned` is `null` when every shape passed. */
|
|
199
|
+
export interface ScanRecord {
|
|
200
|
+
qualified: string;
|
|
201
|
+
digest: string;
|
|
202
|
+
unscanned: string | null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export interface ScanCache {
|
|
206
|
+
schema_version: 1;
|
|
207
|
+
entries: ScanRecord[];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Read the scan cache, or `null` when it is absent or unreadable. */
|
|
211
|
+
export function readScanCache(file: string): ScanCache | null {
|
|
212
|
+
let parsed: unknown;
|
|
213
|
+
try {
|
|
214
|
+
parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
215
|
+
} catch {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return null;
|
|
219
|
+
const entries = (parsed as Record<string, unknown>)['entries'];
|
|
220
|
+
if (!Array.isArray(entries)) return null;
|
|
221
|
+
return { schema_version: 1, entries: entries as ScanRecord[] };
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** sha256 of a file's bytes, or `null` when it cannot be read. */
|
|
225
|
+
export function fileDigest(file: string): string | null {
|
|
226
|
+
try {
|
|
227
|
+
return createHash('sha256').update(fs.readFileSync(file)).digest('hex');
|
|
228
|
+
} catch {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Whether a neighbour body may be indexed, and why not when it may not.
|
|
235
|
+
*
|
|
236
|
+
* THREE REFUSALS, REPORTED SEPARATELY, because they ask the maintainer for three
|
|
237
|
+
* different things: run the census, re-run it, or read the finding. A missing
|
|
238
|
+
* record is a refusal and not a pass — a gate that passes on missing evidence is
|
|
239
|
+
* satisfied by deleting the evidence, which is the opposite of a floor. The
|
|
240
|
+
* digest compare is what "a changed digest rescans first" means from the reading
|
|
241
|
+
* side: a body edited after its scan is unscanned again until the census runs.
|
|
242
|
+
*/
|
|
243
|
+
export function scanVerdict(
|
|
244
|
+
cache: ScanCache | null,
|
|
245
|
+
qualified: string,
|
|
246
|
+
digest: string | null,
|
|
247
|
+
): { ok: true } | { ok: false; kind: string } {
|
|
248
|
+
if (cache === null) return { ok: false, kind: 'no-scan-record' };
|
|
249
|
+
const rec = cache.entries.find((e) => e.qualified === qualified);
|
|
250
|
+
if (rec === undefined) return { ok: false, kind: 'no-scan-record' };
|
|
251
|
+
if (digest === null || rec.digest !== digest) return { ok: false, kind: 'digest-changed' };
|
|
252
|
+
if (rec.unscanned !== null) return { ok: false, kind: rec.unscanned };
|
|
253
|
+
return { ok: true };
|
|
254
|
+
}
|
|
@@ -15,45 +15,74 @@
|
|
|
15
15
|
*
|
|
16
16
|
* What is observed, and what is a shape guess — the line is drawn explicitly.
|
|
17
17
|
*
|
|
18
|
-
* `STRUCTURED_ASK_SHAPES`
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* `STRUCTURED_ASK_SHAPES` carries **one** row, for `claude`, written from an
|
|
19
|
+
* observation under `host-capability-manifest.md` § Observation protocol —
|
|
20
|
+
* 48 `AskUserQuestion` `tool_use` blocks across host versions 2.1.252 to
|
|
21
|
+
* 2.1.284, 2026-09-01 to 2026-10-02. Artifact:
|
|
22
|
+
* `agents/evidence/analysis/structured-ask-host-observation-2026-10.md`. code-comment-allow provenance-comment -- the observation protocol declares a row inadmissible without its artifact citation, so this pointer is part of the contract the row satisfies, not evidence duplicated from a roadmap
|
|
23
|
+
* Every other host has no row, which is "never looked", and inventing one from
|
|
24
|
+
* a vendor's documentation is exactly what that protocol forbids.
|
|
22
25
|
*
|
|
23
|
-
* `STRUCTURED_ASK_TOOL_NAME_RE` is
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* `STRUCTURED_ASK_TOOL_NAME_RE` is a **name-shape pattern, not a host fact**,
|
|
27
|
+
* and stays one even now that a host fact exists beside it: the pattern is what
|
|
28
|
+
* every caller passing no host id still matches on. It exists so that a picker
|
|
29
|
+
* appearing in a transcript is MEASURED rather than missed. A reader must not
|
|
30
|
+
* read a match as evidence that a named host ships that tool; the only thing
|
|
31
|
+
* that establishes that is an observation written into
|
|
29
32
|
* `STRUCTURED_ASK_SHAPES` with the protocol's four-part citation.
|
|
30
33
|
*
|
|
31
|
-
* Consequence, stated rather than discovered later: `native` is
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
+
* Consequence, stated rather than discovered later: `native` is **0** on every
|
|
35
|
+
* corpus this repo can scan today — and the 2026-10 observation does NOT change
|
|
36
|
+
* that, which is worth stating because it looks like it should.
|
|
37
|
+
* `probe_unblocked_ask` partitions hand-back ask turns, and a picker call is
|
|
38
|
+
* answered by a `tool_result` rather than by a free user turn, so it was never
|
|
39
|
+
* in that probe's denominator. The zero means "no prose hand-back used a picker
|
|
40
|
+
* instead"; it never meant "no picker exists".
|
|
41
|
+
*
|
|
42
|
+
* That makes the zero DEFINITIONAL for this probe, not a measurement of
|
|
43
|
+
* scarcity, and the earlier wording claimed the opposite on both halves: it
|
|
44
|
+
* called the zero a measurement, and attributed it to the capability being
|
|
45
|
+
* unobserved. The capability is observed and the zero is unchanged, which is
|
|
46
|
+
* the cleanest available proof that the two were never connected.
|
|
34
47
|
*/
|
|
35
48
|
|
|
36
49
|
/** The per-host shape of a structured-ask tool, once one has been OBSERVED. */
|
|
37
50
|
export interface StructuredAskShape {
|
|
38
51
|
/** The tool name as it appears in a transcript's `tool_use` block. */
|
|
39
52
|
readonly tool: string;
|
|
40
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* The largest question count OBSERVED in one call, never a host ceiling the
|
|
55
|
+
* host was asked for and refused. `1` is also the shape this repo wants.
|
|
56
|
+
*/
|
|
41
57
|
readonly max_questions: number;
|
|
42
|
-
/**
|
|
58
|
+
/** The largest option count OBSERVED on one question — same caveat. */
|
|
43
59
|
readonly max_options_per_question: number;
|
|
44
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Whether the host's picker admits a free-text answer alongside the options.
|
|
62
|
+
* The WEAKEST of the four to establish, because it is read by negation — an
|
|
63
|
+
* answer carrying none of the offered labels. A cancelled ask looks the same
|
|
64
|
+
* from the outside, so a `true` here is "observed at least once", never a
|
|
65
|
+
* count. The citing artifact carries the per-row basis.
|
|
66
|
+
*/
|
|
45
67
|
readonly free_text: boolean;
|
|
46
68
|
}
|
|
47
69
|
|
|
48
70
|
/**
|
|
49
71
|
* Observed per-host structured-ask shapes.
|
|
50
72
|
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
73
|
+
* A row is written only from an observation in a real session under
|
|
74
|
+
* `contexts/execution/host-capability-manifest.md` § Observation protocol —
|
|
75
|
+
* host · host version · transcript reference · date. Never from a host's
|
|
76
|
+
* documentation, and never by analogy to another host.
|
|
77
|
+
*
|
|
78
|
+
* `claude`'s row is the first, and the two numeric fields are **observed
|
|
79
|
+
* maxima over 48 calls, not host ceilings**: no call carried two questions, so
|
|
80
|
+
* the host was never asked to accept two. The guard's threshold does not rest
|
|
81
|
+
* on them — one question per call is this repo's own rule either way.
|
|
55
82
|
*/
|
|
56
|
-
export const STRUCTURED_ASK_SHAPES: Readonly<Record<string, StructuredAskShape>> = {
|
|
83
|
+
export const STRUCTURED_ASK_SHAPES: Readonly<Record<string, StructuredAskShape>> = {
|
|
84
|
+
claude: { tool: 'AskUserQuestion', max_questions: 1, max_options_per_question: 4, free_text: true },
|
|
85
|
+
};
|
|
57
86
|
|
|
58
87
|
/** The observed shape for `hostId`, or `undefined` when none has been observed. */
|
|
59
88
|
export function structuredAskShape(
|
|
@@ -77,6 +106,20 @@ export const STRUCTURED_ASK_TOOL_NAME_RE = /^(ask[_-]?user[_-]?question|user[_-]
|
|
|
77
106
|
* An observed per-host shape wins outright — that is a fact about the host. The
|
|
78
107
|
* name-shape pattern is the fallback, and it is why the probe can report a
|
|
79
108
|
* measured zero instead of nothing at all.
|
|
109
|
+
*
|
|
110
|
+
* KNOWN ASYMMETRY, named rather than left for the next reader to hit. With a
|
|
111
|
+
* row present, this returns `name === shape.tool`: ONE observed name becomes an
|
|
112
|
+
* exclusive allowlist, so every other picker name is answered `false` on that
|
|
113
|
+
* host — a universal negative from a single positive observation, which is the
|
|
114
|
+
* shape of inference the observation protocol refuses elsewhere. It is left as
|
|
115
|
+
* it is because the alternative (union of the row and the pattern) would make
|
|
116
|
+
* an observed row buy nothing, and because no caller is affected today. There
|
|
117
|
+
* are TWO production callers, both host-blind, enumerated rather than recalled:
|
|
118
|
+
* `hooks/one_question_per_ask_hook.ts:103` and `probe_unblocked_ask.ts:184`,
|
|
119
|
+
* each calling `isStructuredAskTool(name)` with no second argument. A caller
|
|
120
|
+
* that does start passing one inherits the asymmetry, and
|
|
121
|
+
* `tests/scripts/ask_surface.test.ts` pins it so the inheritance is visible
|
|
122
|
+
* rather than silent.
|
|
80
123
|
*/
|
|
81
124
|
export function isStructuredAskTool(name: string, hostId?: string | null): boolean {
|
|
82
125
|
const shape = structuredAskShape(hostId);
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
* This module is that emission, so the registry entry moves in the same change
|
|
11
11
|
* rather than being left describing a gap that closed.
|
|
12
12
|
*
|
|
13
|
+
* DATED 2026-10-06. The emission exists and is tested, but nothing calls it:
|
|
14
|
+
* this writer has no production caller, so the registry row was corrected back
|
|
15
|
+
* to `degraded` the same day. The caller belongs to the stub that owns it —
|
|
16
|
+
* whoever lands it sets the row back to `available`.
|
|
17
|
+
*
|
|
13
18
|
* WHAT IT IS NOT. It is not a test runner, and it does not decide whether a
|
|
14
19
|
* failure is a legitimate RED. The failure CLASSES belong to the TDD skill
|
|
15
20
|
* (`src/skills/test-driven-development/SKILL.md`, Test-Red row) and this module
|