@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,202 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* What the `estate_offset_exempt` population actually says — the producing command.
|
|
4
|
+
*
|
|
5
|
+
* THIS IS A READER, NOT A GATE. It exits 0 on every corpus, including one where
|
|
6
|
+
* no reason names anything. The refusal lives in `check_estate_count`, applies
|
|
7
|
+
* to ADDED files only, and is grandfathered precisely because of what this
|
|
8
|
+
* script measures: 43 of the 221 reasons in the tree on 2026-10-01 name no
|
|
9
|
+
* alternative disposition, so a check that re-read them would land red on a
|
|
10
|
+
* fifth of its corpus.
|
|
11
|
+
*
|
|
12
|
+
* WHAT IT BUYS. Two numbers nobody could produce before: how many exemptions
|
|
13
|
+
* name a rejected alternative, and how many repeat another file's reason
|
|
14
|
+
* verbatim. Both are the inputs to whether the refusal vocabulary is the right
|
|
15
|
+
* one, and both move as the estate moves — so the NEXT reading is a delta
|
|
16
|
+
* rather than a re-derivation, which is the same bargain `roadmap_verify_share`
|
|
17
|
+
* makes for the verify grammar.
|
|
18
|
+
*
|
|
19
|
+
* THE VOCABULARY IS NOT THIS SCRIPT'S. It imports the lemma list the gate
|
|
20
|
+
* refuses on, so the report and the refusal cannot drift. A drifted pair fails
|
|
21
|
+
* silently and in the worst direction: the report says the tree conforms while
|
|
22
|
+
* the gate rejects it.
|
|
23
|
+
*
|
|
24
|
+
* CLI:
|
|
25
|
+
* ./scripts-run src/scripts/estate_exemption_shape
|
|
26
|
+
* ./scripts-run src/scripts/estate_exemption_shape --json
|
|
27
|
+
* ./scripts-run src/scripts/estate_exemption_shape --root <dir>
|
|
28
|
+
*
|
|
29
|
+
* Exit codes: 0 always, except 2 for bad argv or a scan root that holds nothing.
|
|
30
|
+
*/
|
|
31
|
+
import * as fs from 'node:fs';
|
|
32
|
+
import * as path from 'node:path';
|
|
33
|
+
import process from 'node:process';
|
|
34
|
+
import { fileURLToPath } from 'node:url';
|
|
35
|
+
|
|
36
|
+
import { exemptionReason } from './_lib/estate_offsets.js';
|
|
37
|
+
import { DISPOSITION_LEMMAS, lemmasNamed, namesDisposition, reasonKey } from './_lib/exemption_shape.js';
|
|
38
|
+
import { DeadScopeError, assertScanned } from './_lib/scan_scope.js';
|
|
39
|
+
|
|
40
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
41
|
+
const _PROG = 'estate_exemption_shape';
|
|
42
|
+
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
43
|
+
|
|
44
|
+
/** The three trees an exemption can sit in. `stubs/` and `skipped/` carry none. */
|
|
45
|
+
const TREES: readonly { readonly label: string; readonly dir: string }[] = [
|
|
46
|
+
{ label: 'active', dir: 'agents/roadmaps' },
|
|
47
|
+
{ label: 'later', dir: 'agents/roadmaps/later' },
|
|
48
|
+
{ label: 'archive', dir: 'agents/roadmaps/archive' },
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
export interface ExemptionRow {
|
|
52
|
+
readonly tree: string;
|
|
53
|
+
readonly file: string;
|
|
54
|
+
readonly reason: string;
|
|
55
|
+
/** The disposition lemmas this reason names; empty means it names none. */
|
|
56
|
+
readonly lemmas: readonly string[];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ShapeReport {
|
|
60
|
+
readonly rows: readonly ExemptionRow[];
|
|
61
|
+
readonly shaped: number;
|
|
62
|
+
readonly shapeless: number;
|
|
63
|
+
/** Per-lemma hit counts, in the gate's own lemma order. */
|
|
64
|
+
readonly byLemma: Readonly<Record<string, number>>;
|
|
65
|
+
/** Groups of two or more files sharing one reason, largest first. */
|
|
66
|
+
readonly duplicates: readonly (readonly string[])[];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Read every exemption under `root`, in a stable order. */
|
|
70
|
+
export function collectExemptions(root: string): ExemptionRow[] {
|
|
71
|
+
const rows: ExemptionRow[] = [];
|
|
72
|
+
for (const tree of TREES) {
|
|
73
|
+
const abs = path.join(root, tree.dir);
|
|
74
|
+
let names: string[];
|
|
75
|
+
try {
|
|
76
|
+
names = fs.readdirSync(abs);
|
|
77
|
+
} catch {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
for (const name of [...names].sort()) {
|
|
81
|
+
if (!name.endsWith('.md')) continue;
|
|
82
|
+
const file = path.join(abs, name);
|
|
83
|
+
let text: string;
|
|
84
|
+
try {
|
|
85
|
+
if (!fs.statSync(file).isFile()) continue;
|
|
86
|
+
text = fs.readFileSync(file, 'utf-8');
|
|
87
|
+
} catch {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const reason = exemptionReason(text);
|
|
91
|
+
if (reason === null) continue;
|
|
92
|
+
rows.push({ tree: tree.label, file: `${tree.dir}/${name}`, reason, lemmas: lemmasNamed(reason) });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return rows;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Summarise the population against the gate's vocabulary. */
|
|
99
|
+
export function report(rows: readonly ExemptionRow[]): ShapeReport {
|
|
100
|
+
const byLemma: Record<string, number> = {};
|
|
101
|
+
for (const l of DISPOSITION_LEMMAS) {
|
|
102
|
+
byLemma[l.name] = rows.filter((r) => r.lemmas.includes(l.name)).length;
|
|
103
|
+
}
|
|
104
|
+
const groups = new Map<string, string[]>();
|
|
105
|
+
for (const r of rows) {
|
|
106
|
+
const key = reasonKey(r.reason);
|
|
107
|
+
const list = groups.get(key) ?? [];
|
|
108
|
+
list.push(r.file);
|
|
109
|
+
groups.set(key, list);
|
|
110
|
+
}
|
|
111
|
+
const duplicates = [...groups.values()].filter((g) => g.length > 1).sort((a, b) => b.length - a.length);
|
|
112
|
+
return {
|
|
113
|
+
rows,
|
|
114
|
+
shaped: rows.filter((r) => namesDisposition(r.reason)).length,
|
|
115
|
+
shapeless: rows.filter((r) => !namesDisposition(r.reason)).length,
|
|
116
|
+
byLemma,
|
|
117
|
+
duplicates,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function render(rep: ShapeReport): string {
|
|
122
|
+
const out: string[] = [];
|
|
123
|
+
const total = rep.rows.length;
|
|
124
|
+
out.push(`${_PROG}: ${String(total)} exemption(s)`);
|
|
125
|
+
for (const tree of TREES) {
|
|
126
|
+
out.push(` ${tree.label.padEnd(10)} ${String(rep.rows.filter((r) => r.tree === tree.label).length).padStart(4)}`);
|
|
127
|
+
}
|
|
128
|
+
out.push(` names a rejected alternative ${String(rep.shaped).padStart(4)}`);
|
|
129
|
+
out.push(` names none ${String(rep.shapeless).padStart(4)}`);
|
|
130
|
+
out.push(' per lemma:');
|
|
131
|
+
for (const l of DISPOSITION_LEMMAS) {
|
|
132
|
+
out.push(` ${l.name.padEnd(12)} ${String(rep.byLemma[l.name] ?? 0).padStart(4)}`);
|
|
133
|
+
}
|
|
134
|
+
const dupFiles = rep.duplicates.reduce((n, g) => n + g.length, 0);
|
|
135
|
+
out.push(` verbatim duplicate groups ${String(rep.duplicates.length).padStart(4)} covering ${String(dupFiles)} file(s)`);
|
|
136
|
+
for (const g of rep.duplicates) {
|
|
137
|
+
out.push(` (${String(g.length)}x) ${g.join(', ')}`);
|
|
138
|
+
}
|
|
139
|
+
if (rep.shapeless > 0) {
|
|
140
|
+
out.push(' naming no rejected alternative:');
|
|
141
|
+
for (const r of rep.rows.filter((x) => !namesDisposition(x.reason))) {
|
|
142
|
+
out.push(` ${r.file}: ${r.reason.slice(0, 120)}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return out.join('\n') + '\n';
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
149
|
+
const json = argv.includes('--json');
|
|
150
|
+
const rootIdx = argv.indexOf('--root');
|
|
151
|
+
let root = REPO_ROOT;
|
|
152
|
+
if (rootIdx !== -1) {
|
|
153
|
+
const next = argv[rootIdx + 1];
|
|
154
|
+
if (next === undefined || next.startsWith('-')) {
|
|
155
|
+
process.stderr.write(`usage: ${_PROG} [--root <dir>] [--json]\n`);
|
|
156
|
+
return 2;
|
|
157
|
+
}
|
|
158
|
+
root = path.resolve(next);
|
|
159
|
+
}
|
|
160
|
+
const unknown = argv.filter((a) => a.startsWith('-') && a !== '--json' && a !== '--root');
|
|
161
|
+
if (unknown.length > 0) {
|
|
162
|
+
process.stderr.write(`${_PROG}: unknown argument(s) ${unknown.join(', ')}\n`);
|
|
163
|
+
return 2;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const rows = collectExemptions(root);
|
|
167
|
+
try {
|
|
168
|
+
// A root holding no roadmap at all is a dead scope, never an estate with
|
|
169
|
+
// nothing to report: this reader would otherwise print a confident zero
|
|
170
|
+
// over a path that does not exist.
|
|
171
|
+
assertScanned({
|
|
172
|
+
gate: _PROG,
|
|
173
|
+
scanned: TREES.reduce((n, t) => {
|
|
174
|
+
try {
|
|
175
|
+
return n + fs.readdirSync(path.join(root, t.dir)).filter((f) => f.endsWith('.md')).length;
|
|
176
|
+
} catch {
|
|
177
|
+
return n;
|
|
178
|
+
}
|
|
179
|
+
}, 0),
|
|
180
|
+
units: 'roadmap file(s)',
|
|
181
|
+
roots: TREES.map((t) => t.dir),
|
|
182
|
+
});
|
|
183
|
+
} catch (err) {
|
|
184
|
+
if (err instanceof DeadScopeError) {
|
|
185
|
+
process.stderr.write(`❌ ${_PROG}: ${err.message}\n`);
|
|
186
|
+
return 2;
|
|
187
|
+
}
|
|
188
|
+
throw err;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const rep = report(rows);
|
|
192
|
+
if (json) {
|
|
193
|
+
process.stdout.write(JSON.stringify(rep, null, 2) + '\n');
|
|
194
|
+
return 0;
|
|
195
|
+
}
|
|
196
|
+
process.stdout.write(render(rep));
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (path.resolve(process.argv[1] ?? '') === _HERE) {
|
|
201
|
+
process.exit(main());
|
|
202
|
+
}
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* honest "no telemetry record" line, never a fabricated estimate.
|
|
28
28
|
* Sources: `_lib/judgment_ladder.ts::explainLadder` + the same
|
|
29
29
|
* audit-log-v1 files as §4.
|
|
30
|
-
* 5. Hook /
|
|
30
|
+
* 5. Hook / freshness state snapshot. Source:
|
|
31
31
|
* `agents/state/context-hygiene.json` (the code path the hook
|
|
32
32
|
* actually writes — see `context_hygiene_hook.ts::STATE_FILE`) or
|
|
33
33
|
* the doc-referenced `agents/runtime/state/context-hygiene.json`.
|
|
@@ -477,7 +477,7 @@ function renderSummarySection(
|
|
|
477
477
|
out.push('- Session health: no state recorded.');
|
|
478
478
|
} else {
|
|
479
479
|
const s = hygiene.state;
|
|
480
|
-
out.push(`- Session health: ${String(s['tool_calls'] ?? '(unset)')} tool call(s) recorded
|
|
480
|
+
out.push(`- Session health: ${String(s['tool_calls'] ?? '(unset)')} tool call(s) recorded.`);
|
|
481
481
|
}
|
|
482
482
|
return out;
|
|
483
483
|
}
|
|
@@ -686,7 +686,7 @@ function renderDecisionSection(
|
|
|
686
686
|
|
|
687
687
|
function renderHygieneSection(hygiene: HygieneReadResult): string[] {
|
|
688
688
|
const out: string[] = [];
|
|
689
|
-
out.push('## Hook
|
|
689
|
+
out.push('## Hook state (context-hygiene)');
|
|
690
690
|
out.push(`_Source: tried ${hygiene.checkedPaths.map((p) => `\`${p}\``).join(', then ')}_`);
|
|
691
691
|
out.push('');
|
|
692
692
|
if (hygiene.state === null) {
|
|
@@ -697,9 +697,6 @@ function renderHygieneSection(hygiene: HygieneReadResult): string[] {
|
|
|
697
697
|
out.push(`Found at \`${hygiene.path}\`.`);
|
|
698
698
|
out.push('');
|
|
699
699
|
out.push(`- tool_calls: ${String(s['tool_calls'] ?? '(unset)')}`);
|
|
700
|
-
out.push(`- consecutive_same_tool: ${String(s['consecutive_same_tool'] ?? '(unset)')}`);
|
|
701
|
-
out.push(`- last_tool: ${String(s['last_tool'] ?? '(unset)')}`);
|
|
702
|
-
out.push(`- loop_detected: ${String(s['loop_detected'] ?? '(unset)')}`);
|
|
703
700
|
out.push(`- freshness_threshold: ${String(s['freshness_threshold'] ?? '(unset)')}`);
|
|
704
701
|
out.push(`- checked_at: ${String(s['checked_at'] ?? '(unset)')}`);
|
|
705
702
|
return out;
|
|
@@ -718,14 +715,12 @@ function renderParkedSection(): string[] {
|
|
|
718
715
|
' thin-projector budget decision** — no on-disk record of "artefact',
|
|
719
716
|
' considered but dropped for budget" exists today. Revisit-if such a',
|
|
720
717
|
' record ships.',
|
|
721
|
-
'3. **Which memory entry id influenced a specific answer
|
|
722
|
-
' did NOT opt into `decision_engine.surface_traces` — the',
|
|
718
|
+
'3. **Which memory entry id influenced a specific answer** — the',
|
|
723
719
|
' `🧠 Memory: n/m · ids=[...]` line is printed to stdout only, never',
|
|
724
|
-
' persisted. The
|
|
725
|
-
' `
|
|
726
|
-
'
|
|
727
|
-
'
|
|
728
|
-
' for that narrower, per-run case; not duplicated here.',
|
|
720
|
+
' persisted. The per-phase decision-trace file that once carried',
|
|
721
|
+
' `memory.ids` is no longer written: its opt-in key,',
|
|
722
|
+
' `decision_engine.surface_traces`, was retired (2026-10-09) with its',
|
|
723
|
+
' default (off) as the fixed behavior.',
|
|
729
724
|
'4. **Why a given subagent primitive was/wasn\'t available on this host**',
|
|
730
725
|
' — the host-capability manifest is resolved in-session by the agent',
|
|
731
726
|
' from its own knowledge (+ an optional settings override) and is never',
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Writes the grammar block of the commit-subject reference from
|
|
4
|
+
* `_lib/git_convention_grammar.ts`, so the fallback a command reads when the
|
|
5
|
+
* `agent-config` binary cannot run is the grammar the binary runs.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* tsx src/scripts/generate_git_convention_grammar.ts # rewrite in place
|
|
9
|
+
* tsx src/scripts/generate_git_convention_grammar.ts --check # exit 1 when stale
|
|
10
|
+
* tsx src/scripts/generate_git_convention_grammar.ts --out PATH # write the refreshed page elsewhere
|
|
11
|
+
*
|
|
12
|
+
* Exit codes: 0 written / in sync · 1 stale, or the markers are missing · 2 usage.
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'node:fs';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
import process from 'node:process';
|
|
17
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
18
|
+
|
|
19
|
+
import { FAMILY_ERE, FORMAT_GRAMMAR, GIT_OWN_SUBJECT, TICKETLESS_FORM, TICKET_DENYLIST, TICKET_GRAMMAR, TICKET_TOKEN, VERSION_LIKE_KEYS } from './_lib/git_convention_grammar.js';
|
|
20
|
+
import {
|
|
21
|
+
AUTHOR_CAP_PER_HALF,
|
|
22
|
+
BULK_IMPORT_FILES,
|
|
23
|
+
MEASURE_LIMIT,
|
|
24
|
+
MEASURE_SINCE,
|
|
25
|
+
MIN_BRANCHES,
|
|
26
|
+
MIN_CAPPED_AUTHORS,
|
|
27
|
+
MIN_N,
|
|
28
|
+
RECENT_WINDOW,
|
|
29
|
+
SHARE_BAR,
|
|
30
|
+
SMALL_TEAM_SHARE_BAR,
|
|
31
|
+
pct,
|
|
32
|
+
} from './_lib/git_convention_measure.js';
|
|
33
|
+
|
|
34
|
+
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
35
|
+
|
|
36
|
+
export const REFERENCE = 'src/skills/git-workflow/references/commit-subject.md';
|
|
37
|
+
export const GENERATOR = 'src/scripts/generate_git_convention_grammar.ts';
|
|
38
|
+
export const GRAMMAR_MODULE = 'src/scripts/_lib/git_convention_grammar.ts';
|
|
39
|
+
export const MEASURE_MODULE = 'src/scripts/_lib/git_convention_measure.ts';
|
|
40
|
+
|
|
41
|
+
const BEGIN = '<!-- BEGIN GENERATED: git-convention-grammar -->';
|
|
42
|
+
const END = '<!-- END GENERATED: git-convention-grammar -->';
|
|
43
|
+
|
|
44
|
+
export function renderBlock(): string {
|
|
45
|
+
const rows: [string, string][] = [
|
|
46
|
+
['ticket', TICKET_GRAMMAR],
|
|
47
|
+
['ticket in text', TICKET_TOKEN],
|
|
48
|
+
['standard names', TICKET_DENYLIST.join(' ')],
|
|
49
|
+
['version-like names', `${VERSION_LIKE_KEYS.join(' ')} (one-digit number, no card)`],
|
|
50
|
+
...Object.entries(FORMAT_GRAMMAR).map(([f, re]) => [`format ${f}`, re] as [string, string]),
|
|
51
|
+
...FAMILY_ERE.map(([f, ere]) => [`family ${f}`, ere] as [string, string]),
|
|
52
|
+
...Object.entries(TICKETLESS_FORM).map(([f, ere]) => [`family ${f}, no ticket`, `${ere ?? ''} (no ticket elsewhere in the subject)`] as [string, string]),
|
|
53
|
+
['any format or family', `${GIT_OWN_SUBJECT} (git's own subjects)`],
|
|
54
|
+
['measure sample', `newest ${MEASURE_LIMIT} non-merge commits since ${MEASURE_SINCE}, or regardless of age when that window yields fewer than ${MIN_N}; bots, automation subjects, commits over ${BULK_IMPORT_FILES} files dropped`],
|
|
55
|
+
['measure bar', `n >= ${MIN_N}; >= ${pct(SHARE_BAR)} capped at ${AUTHOR_CAP_PER_HALF} per author per half (${MIN_CAPPED_AUTHORS}+ authors), else >= ${pct(SMALL_TEAM_SHARE_BAR)} uncapped; both halves agree`],
|
|
56
|
+
['measure migration', `the newer half, or the newest ${RECENT_WINDOW} commits, clearing the bar on another family than the dominant one: "migrating to <family>", and that family is proposed`],
|
|
57
|
+
['measure branches', `>= ${MIN_BRANCHES} remote branch names, top shape >= ${pct(SHARE_BAR)}`],
|
|
58
|
+
];
|
|
59
|
+
const width = Math.max(...rows.map(([k]) => k.length)) + 2;
|
|
60
|
+
return [
|
|
61
|
+
BEGIN,
|
|
62
|
+
`<!-- Written by \`./scripts-run ${GENERATOR.replace(/\.ts$/, '')}\` from \`${GRAMMAR_MODULE}\` and \`${MEASURE_MODULE}\`; edit the modules, never this block. -->`,
|
|
63
|
+
'',
|
|
64
|
+
'```',
|
|
65
|
+
...rows.map(([k, v]) => `${k.padEnd(width)}${v}`),
|
|
66
|
+
'```',
|
|
67
|
+
'',
|
|
68
|
+
'Formats are JavaScript / PCRE syntax; families are POSIX extended, matched in',
|
|
69
|
+
'order, first hit wins. Under `format ticket-conventional` and `family',
|
|
70
|
+
'ticket-conventional` a ticket anywhere inside the scope fails, and a standard',
|
|
71
|
+
'name in the ticket position fails. A ticket is found in a branch or scope only as',
|
|
72
|
+
'a whole token (`ticket in text`). Without a card, a version-like name — one of',
|
|
73
|
+
'the keys above with a one-digit number, such as `HTTP-2` or `PHP-8` — is not a',
|
|
74
|
+
'ticket; `HTTP2-1` still has the ticket shape. A convention card\'s `ticket_keys`',
|
|
75
|
+
'settles both, and matches a key written in lower case; without a card a',
|
|
76
|
+
'lower-case key is never detected.',
|
|
77
|
+
END,
|
|
78
|
+
].join('\n');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function refresh(text: string): { ok: true; text: string } | { ok: false; reason: string } {
|
|
82
|
+
const start = text.indexOf(BEGIN);
|
|
83
|
+
const end = text.indexOf(END);
|
|
84
|
+
if (start === -1 || end === -1 || end < start) return { ok: false, reason: `${REFERENCE} lacks the ${BEGIN} / ${END} markers` };
|
|
85
|
+
return { ok: true, text: text.slice(0, start) + renderBlock() + text.slice(end + END.length) };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function main(argv: readonly string[] = process.argv.slice(2), root = REPO_ROOT): number {
|
|
89
|
+
let check = false;
|
|
90
|
+
let out: string | null = null;
|
|
91
|
+
for (let i = 0; i < argv.length; i++) {
|
|
92
|
+
if (argv[i] === '--check') check = true;
|
|
93
|
+
else if (argv[i] === '--out' && argv[i + 1] !== undefined) out = argv[++i] as string;
|
|
94
|
+
else {
|
|
95
|
+
process.stderr.write(`unknown argument: ${String(argv[i])}\nusage: generate_git_convention_grammar [--check | --out PATH]\n`);
|
|
96
|
+
return 2;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const file = path.join(root, REFERENCE);
|
|
100
|
+
const current = fs.readFileSync(file, 'utf-8');
|
|
101
|
+
const next = refresh(current);
|
|
102
|
+
if (!next.ok) {
|
|
103
|
+
process.stderr.write(`${next.reason}\n`);
|
|
104
|
+
return 1;
|
|
105
|
+
}
|
|
106
|
+
if (check) {
|
|
107
|
+
if (next.text === current) return 0;
|
|
108
|
+
process.stderr.write(`${REFERENCE} is stale — run ./scripts-run ${GENERATOR.replace(/\.ts$/, '')}\n`);
|
|
109
|
+
return 1;
|
|
110
|
+
}
|
|
111
|
+
fs.writeFileSync(out ?? file, next.text);
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function _isCliEntry(): boolean {
|
|
116
|
+
if (process.argv[1] === undefined) return false;
|
|
117
|
+
if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) return true;
|
|
118
|
+
try {
|
|
119
|
+
return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(path.resolve(process.argv[1]));
|
|
120
|
+
} catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (_isCliEntry()) {
|
|
126
|
+
process.exitCode = main();
|
|
127
|
+
}
|
|
@@ -52,6 +52,7 @@ import * as fs from 'node:fs';
|
|
|
52
52
|
import * as path from 'node:path';
|
|
53
53
|
import { fileURLToPath } from 'node:url';
|
|
54
54
|
|
|
55
|
+
import { extractSection, SectionError } from './_lib/md_section.js';
|
|
55
56
|
import {
|
|
56
57
|
ARTIFACT_REL,
|
|
57
58
|
HOST_SURFACES,
|
|
@@ -63,7 +64,7 @@ import {
|
|
|
63
64
|
const _HERE = fileURLToPath(import.meta.url);
|
|
64
65
|
export const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
65
66
|
|
|
66
|
-
/** The contract the README points at for projection modes
|
|
67
|
+
/** The contract the README points at for projection modes. */
|
|
67
68
|
export const CONTRACT_REL = path.join('docs', 'contracts', 'rule-router.md');
|
|
68
69
|
|
|
69
70
|
export const BEGIN = '<!-- BEGIN generated: host-standing-cost -->';
|
|
@@ -85,9 +86,25 @@ export interface HostRow {
|
|
|
85
86
|
* without anything saying so.
|
|
86
87
|
*/
|
|
87
88
|
export function parseCensus(text: string): HostRow[] {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
// Anchored on the LINE, never a substring — a prose mention of the same
|
|
90
|
+
// heading earlier in the artefact used to be indistinguishable from the
|
|
91
|
+
// real one under a plain `indexOf` (the measured 2026-08-20 incident
|
|
92
|
+
// `_lib/md_section.ts` documents). `extractSection` also refuses a
|
|
93
|
+
// heading that occurs more than once, which this census format never
|
|
94
|
+
// intends — exactly the silent-wrong-match failure this script's own
|
|
95
|
+
// "deliberately strict" design already asks for.
|
|
96
|
+
let section: string;
|
|
97
|
+
try {
|
|
98
|
+
section = extractSection(text, '## Per host');
|
|
99
|
+
} catch (err) {
|
|
100
|
+
// "not found" means the format moved — the pre-existing, intentional
|
|
101
|
+
// `[]` contract below. "ambiguous" (the heading occurs more than
|
|
102
|
+
// once) is NOT the same case and must stay loud: that is exactly the
|
|
103
|
+
// silently-wrong-match failure this wiring exists to stop.
|
|
104
|
+
if (err instanceof SectionError && err.message.startsWith('heading not found')) return [];
|
|
105
|
+
throw err;
|
|
106
|
+
}
|
|
107
|
+
const lines = section.split('\n');
|
|
91
108
|
const rows: HostRow[] = [];
|
|
92
109
|
for (const line of lines) {
|
|
93
110
|
if (!line.startsWith('|')) {
|
|
@@ -332,42 +332,65 @@ export function consume_recycle_envelope(
|
|
|
332
332
|
* and reading the wrong record for the wrong reason is how a continuation
|
|
333
333
|
* acquires a stranger's state — the failure this step exists to prevent.
|
|
334
334
|
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
*
|
|
338
|
-
*
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* - `
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
*
|
|
335
|
+
* TWO SEPARATE GATES, not one, since a 2/2 council verdict (2026-10-06): the
|
|
336
|
+
* prose handoff and the recycle-envelope RECORD are different artefacts with
|
|
337
|
+
* different safety properties, and coupling them under one `compact` verdict
|
|
338
|
+
* is what let a stale claim about the record go unnoticed inside a test that
|
|
339
|
+
* only ever exercised the handoff.
|
|
340
|
+
*
|
|
341
|
+
* - `startup` (and an ABSENT source) — a fresh session. Both gates inject:
|
|
342
|
+
* this is the ordinary case and the one every existing fixture exercises.
|
|
343
|
+
* - `clear` — the operator wrote the record and cleared. Both gates inject.
|
|
344
|
+
* This is the recycle path the record was built for, and suppressing it
|
|
345
|
+
* would defeat the mechanism. Note that hot-context DISCARDS on the same
|
|
346
|
+
* source, and the two are right for opposite reasons: hot-context is a
|
|
347
|
+
* cache of a session that was deliberately thrown away, while the record
|
|
348
|
+
* is the thing the operator wrote in order to survive throwing it away.
|
|
349
|
+
* - `compact` — the SAME session continuing past a compaction.
|
|
350
|
+
* {@link sourceGate} still injects the prose handoff (narrative
|
|
351
|
+
* continuity carries no peer-isolation risk). {@link recycleEnvelopeGate}
|
|
352
|
+
* does NOT inject the recycle-envelope record: the resolver's own Rule 1
|
|
353
|
+
* never returns the reader's own record (a prior sentence here claimed
|
|
354
|
+
* the opposite — that claim was never true against the resolver chosen
|
|
355
|
+
* 2026-09-09, and the council found no safe reading of the alternative
|
|
356
|
+
* either — a non-own session id proves only difference, not lineage, so
|
|
357
|
+
* consuming "the one other record" on `compact` can hand a session a
|
|
358
|
+
* concurrent peer's in-progress state). Until a real predecessor-identity
|
|
359
|
+
* signal exists, `compact` leaves every recycle-envelope record
|
|
360
|
+
* untouched, exactly like `resume`/`fork`.
|
|
347
361
|
* - `resume` / `fork` — the host has already restored the conversation.
|
|
348
|
-
*
|
|
349
|
-
* just replayed; on `fork` it is worse than
|
|
350
|
-
* would consume a record belonging to a
|
|
351
|
-
*
|
|
352
|
-
*
|
|
353
|
-
*
|
|
362
|
+
* Both gates inject NOTHING. On `resume` an injection would duplicate
|
|
363
|
+
* context the host just replayed; on `fork` it is worse than
|
|
364
|
+
* duplication, because the fork would consume a record belonging to a
|
|
365
|
+
* session that is still alive.
|
|
366
|
+
* - anything else — both gates inject nothing. An unrecognised source is a
|
|
367
|
+
* host this code has not been taught, and guessing is the failure mode,
|
|
368
|
+
* not the conservative choice.
|
|
354
369
|
*
|
|
355
|
-
* SUPPRESSION MUST NOT CONSUME.
|
|
356
|
-
* {@link
|
|
357
|
-
* moves the file aside on every outcome
|
|
358
|
-
*
|
|
359
|
-
* the operator's recycle would
|
|
370
|
+
* SUPPRESSION MUST NOT CONSUME. Each gate runs BEFORE its own consumer —
|
|
371
|
+
* {@link recycleEnvelopeGate} before {@link consume_recycle_envelope}, never
|
|
372
|
+
* inside it — because that function moves the file aside on every outcome
|
|
373
|
+
* except `absent`. Calling it and then discarding the result would destroy
|
|
374
|
+
* the record without anyone reading it — the operator's recycle would
|
|
375
|
+
* silently evaporate on a `resume`, and now also on a `compact`.
|
|
360
376
|
*/
|
|
361
377
|
export const INJECTING_SOURCES: ReadonlySet<string> = new Set(['', 'startup', 'clear', 'compact']);
|
|
362
378
|
|
|
379
|
+
/**
|
|
380
|
+
* The recycle-envelope RECORD's own injecting set — narrower than
|
|
381
|
+
* {@link INJECTING_SOURCES}. `compact` is deliberately absent: see the
|
|
382
|
+
* module docblock's `compact` bullet.
|
|
383
|
+
*/
|
|
384
|
+
export const RECYCLE_INJECTING_SOURCES: ReadonlySet<string> = new Set(['', 'startup', 'clear']);
|
|
385
|
+
|
|
363
386
|
export interface SourceGate {
|
|
364
387
|
inject: boolean;
|
|
365
388
|
reason: string;
|
|
366
389
|
}
|
|
367
390
|
|
|
368
|
-
|
|
391
|
+
function _gate(source: string, injectingSources: ReadonlySet<string>): SourceGate {
|
|
369
392
|
const s = source.trim();
|
|
370
|
-
if (
|
|
393
|
+
if (injectingSources.has(s)) {
|
|
371
394
|
return { inject: true, reason: `source=${s === '' ? 'absent' : s}` };
|
|
372
395
|
}
|
|
373
396
|
if (s === 'resume' || s === 'fork') {
|
|
@@ -379,12 +402,31 @@ export function sourceGate(source: string): SourceGate {
|
|
|
379
402
|
: 'duplicate context the host just replayed'),
|
|
380
403
|
};
|
|
381
404
|
}
|
|
405
|
+
if (s === 'compact' && !injectingSources.has('compact')) {
|
|
406
|
+
return {
|
|
407
|
+
inject: false,
|
|
408
|
+
reason:
|
|
409
|
+
'source=compact — a non-own session id proves only difference, not lineage; ' +
|
|
410
|
+
'consuming the one other record on compact could hand a session a concurrent ' +
|
|
411
|
+
"peer's in-progress state (agents/evidence/council/compact-resume-2026-10.md)",
|
|
412
|
+
};
|
|
413
|
+
}
|
|
382
414
|
return {
|
|
383
415
|
inject: false,
|
|
384
416
|
reason: `source=${s} is not a source this reader knows — injecting nothing rather than guessing`,
|
|
385
417
|
};
|
|
386
418
|
}
|
|
387
419
|
|
|
420
|
+
/** Gate for the prose handoff ({@link consume_handoff_context}). */
|
|
421
|
+
export function sourceGate(source: string): SourceGate {
|
|
422
|
+
return _gate(source, INJECTING_SOURCES);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/** Gate for the recycle-envelope record ({@link consume_recycle_envelope}). */
|
|
426
|
+
export function recycleEnvelopeGate(source: string): SourceGate {
|
|
427
|
+
return _gate(source, RECYCLE_INJECTING_SOURCES);
|
|
428
|
+
}
|
|
429
|
+
|
|
388
430
|
// ---------------------------------------------------------------------
|
|
389
431
|
// CLI — dispatcher concern entry point
|
|
390
432
|
// ---------------------------------------------------------------------
|
|
@@ -415,21 +457,28 @@ export function main(): number {
|
|
|
415
457
|
envelope.payload && typeof envelope.payload === 'object' && !Array.isArray(envelope.payload)
|
|
416
458
|
? (envelope.payload as Record<string, unknown>)
|
|
417
459
|
: {};
|
|
418
|
-
// 3.3.
|
|
419
|
-
//
|
|
420
|
-
//
|
|
460
|
+
// 3.3 / compact-resume-2026-10 council. Each gate is evaluated
|
|
461
|
+
// FIRST and short-circuits ITS OWN consumer, because both
|
|
462
|
+
// consumers move their file aside on every non-absent outcome.
|
|
463
|
+
// Consuming and then dropping the result would delete the
|
|
421
464
|
// record a suppressed source was supposed to leave alone.
|
|
422
|
-
const
|
|
423
|
-
|
|
424
|
-
|
|
465
|
+
const source = String(payload['source'] ?? envelope['source'] ?? '');
|
|
466
|
+
const handoffGate = sourceGate(source);
|
|
467
|
+
const recycleGate = recycleEnvelopeGate(source);
|
|
468
|
+
if (!handoffGate.inject && !recycleGate.inject) {
|
|
469
|
+
process.stderr.write(`handoff-context-hook: no injection (${handoffGate.reason})\n`);
|
|
425
470
|
return 0;
|
|
426
471
|
}
|
|
427
|
-
const handoff =
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
472
|
+
const handoff: ConsumeDecision = handoffGate.inject
|
|
473
|
+
? consume_handoff_context(root)
|
|
474
|
+
: { action: 'absent', reason: handoffGate.reason };
|
|
475
|
+
const recycle: ConsumeDecision = recycleGate.inject
|
|
476
|
+
? consume_recycle_envelope(
|
|
477
|
+
root,
|
|
478
|
+
new Date(),
|
|
479
|
+
String(envelope['session_id'] ?? '').trim() || env_session_id(),
|
|
480
|
+
)
|
|
481
|
+
: { action: 'absent', reason: recycleGate.reason };
|
|
433
482
|
const blocks: string[] = [];
|
|
434
483
|
const reasons: string[] = [];
|
|
435
484
|
// Recycle envelope first — it is the task-state restore the
|