@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
|
@@ -22,8 +22,15 @@
|
|
|
22
22
|
* auto-promoted) — it NEVER mutates the curated YAML truths. Deterministic:
|
|
23
23
|
* byte-stable for a fixed `now` + a fixed intake set.
|
|
24
24
|
*
|
|
25
|
+
* `--format status` is the third, human-facing view (road-to-learning-you-can-
|
|
26
|
+
* see Phase 2): the verdict counts, the top `preferred` lessons with their
|
|
27
|
+
* corroboration and age, and the sentence saying what a promotion requires. It
|
|
28
|
+
* is a FORMAT and not a verb (decision D2 cites ADR-041) — `memory:learn`
|
|
29
|
+
* passes argv straight through, so a format needs no registry row — and it is
|
|
30
|
+
* read-only to the point of refusing `--write` rather than ignoring it.
|
|
31
|
+
*
|
|
25
32
|
* Usage: learning_sidecar.ts [--intake-dir DIR] [--out-dir DIR] [--now ISO]
|
|
26
|
-
* [--write] [--format text|json]
|
|
33
|
+
* [--write] [--format text|json|status]
|
|
27
34
|
* Exit codes: 0 ok, 2 usage error, 3 internal error.
|
|
28
35
|
*/
|
|
29
36
|
import { createHash } from 'node:crypto';
|
|
@@ -48,7 +55,11 @@ export const SCHEMA_VERSION = 1;
|
|
|
48
55
|
export type Polarity = 'preferred' | 'dead_end';
|
|
49
56
|
export type Verdict = 'preferred' | 'contested' | 'dead_end';
|
|
50
57
|
|
|
51
|
-
|
|
58
|
+
/** The output formats. `status` is the one-screen human view (read-only). */
|
|
59
|
+
export const FORMATS = ['text', 'json', 'status'] as const;
|
|
60
|
+
export type Format = (typeof FORMATS)[number];
|
|
61
|
+
|
|
62
|
+
export interface Signal {
|
|
52
63
|
id: string;
|
|
53
64
|
ts: string;
|
|
54
65
|
tsMs: number;
|
|
@@ -226,9 +237,21 @@ export function aggregate(signals: readonly Signal[], nowMs: number): Lesson[] {
|
|
|
226
237
|
}
|
|
227
238
|
|
|
228
239
|
export function buildSidecar(intakeDir: string, nowIso: string): Sidecar {
|
|
240
|
+
return buildSidecarFromSignals(readSignals(intakeDir), nowIso);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* The half of `buildSidecar` that does not read the disk.
|
|
245
|
+
*
|
|
246
|
+
* Split out for a caller that needs BOTH the input count and the output
|
|
247
|
+
* lessons from one pass — the session-end dogfood ledger records `signals_in`
|
|
248
|
+
* beside `lessons_out`, and reading the intake twice to get them would make the
|
|
249
|
+
* two numbers describe two different reads under the 2 s budget they exist to
|
|
250
|
+
* measure.
|
|
251
|
+
*/
|
|
252
|
+
export function buildSidecarFromSignals(signals: readonly Signal[], nowIso: string): Sidecar {
|
|
229
253
|
const nowMs = _parseTsMs(nowIso) ?? 0;
|
|
230
|
-
|
|
231
|
-
return { schema_version: SCHEMA_VERSION, generated_at: nowIso, lessons };
|
|
254
|
+
return { schema_version: SCHEMA_VERSION, generated_at: nowIso, lessons: aggregate(signals, nowMs) };
|
|
232
255
|
}
|
|
233
256
|
|
|
234
257
|
/** Render the human dead-ends + contested ledger. */
|
|
@@ -261,22 +284,98 @@ export function renderLessonsMd(sidecar: Sidecar): string {
|
|
|
261
284
|
return L.join('\n');
|
|
262
285
|
}
|
|
263
286
|
|
|
287
|
+
/** How many `preferred` lessons the status screen lists before it stops. */
|
|
288
|
+
export const STATUS_TOP_N = 5;
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* The human step. Printed as the LAST line of the status screen, because this
|
|
292
|
+
* tree writes no rule and no skill on its own: a lesson becomes a durable
|
|
293
|
+
* artefact only when a person carries it through `/memory:propose` or the
|
|
294
|
+
* `learning-to-rule-or-skill` skill. A list of preferred lessons is one flag
|
|
295
|
+
* away from `--apply`, and naming the hand-off on every screen is the cheapest
|
|
296
|
+
* standing answer to "why is there no button".
|
|
297
|
+
*/
|
|
298
|
+
export const PROMOTION_HANDOFF =
|
|
299
|
+
'Promote by hand: /memory:propose · src/skills/learning-to-rule-or-skill/SKILL.md';
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* One screen answering "what has this learned?" — verdict counts, the top
|
|
303
|
+
* `preferred` lessons with their corroboration and age, and what a promotion
|
|
304
|
+
* requires. READ ONLY by construction: it takes a built sidecar and returns a
|
|
305
|
+
* string, so there is no path from this function to the disk.
|
|
306
|
+
*/
|
|
307
|
+
export function renderStatus(sidecar: Sidecar): string {
|
|
308
|
+
const byVerdict: Record<Verdict, number> = { preferred: 0, contested: 0, dead_end: 0 };
|
|
309
|
+
for (const l of sidecar.lessons) byVerdict[l.verdict] += 1;
|
|
310
|
+
|
|
311
|
+
const nowMs = _parseTsMs(sidecar.generated_at) ?? 0;
|
|
312
|
+
const L: string[] = [];
|
|
313
|
+
L.push(`${PROG}: ${String(sidecar.lessons.length)} lesson(s) as of ${sidecar.generated_at}`);
|
|
314
|
+
L.push(
|
|
315
|
+
`preferred: ${String(byVerdict.preferred)} · ` +
|
|
316
|
+
`contested: ${String(byVerdict.contested)} · ` +
|
|
317
|
+
`dead-end: ${String(byVerdict.dead_end)}`,
|
|
318
|
+
);
|
|
319
|
+
L.push('');
|
|
320
|
+
|
|
321
|
+
const preferred = sidecar.lessons
|
|
322
|
+
.filter((l) => l.verdict === 'preferred')
|
|
323
|
+
.sort((a, b) => b.score - a.score || (a.path < b.path ? -1 : 1))
|
|
324
|
+
.slice(0, STATUS_TOP_N);
|
|
325
|
+
L.push(`Top ${String(STATUS_TOP_N)} preferred:`);
|
|
326
|
+
if (preferred.length === 0) {
|
|
327
|
+
L.push(' (none — a lesson needs corroboration before it appears here)');
|
|
328
|
+
} else {
|
|
329
|
+
preferred.forEach((l, i) => {
|
|
330
|
+
// Age is floored, so a lesson seen hours ago reads `0d old` rather
|
|
331
|
+
// than rounding up into a day it has not lived.
|
|
332
|
+
const ageDays = Math.max(0, Math.floor((nowMs - (_parseTsMs(l.last_ts) ?? nowMs)) / 86400000));
|
|
333
|
+
L.push(
|
|
334
|
+
` ${String(i + 1)}. ${l.entry_type} @ ${l.path} — ` +
|
|
335
|
+
`${String(l.corroborations)} origins, ${String(ageDays)}d old`,
|
|
336
|
+
);
|
|
337
|
+
L.push(` ${l.body}`);
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
L.push('');
|
|
341
|
+
L.push(
|
|
342
|
+
`A lesson is promoted at ${String(MIN_CORROBORATIONS)} distinct origins, ` +
|
|
343
|
+
`weighted by a ${String(HALF_LIFE_DAYS)}-day half-life; nothing here promotes itself.`,
|
|
344
|
+
);
|
|
345
|
+
L.push(PROMOTION_HANDOFF);
|
|
346
|
+
return `${L.join('\n')}\n`;
|
|
347
|
+
}
|
|
348
|
+
|
|
264
349
|
export function main(argv: string[]): number {
|
|
265
350
|
let intakeDir = path.join('agents', 'memory', 'intake');
|
|
266
351
|
let outDir = path.join('agents', 'memory');
|
|
267
352
|
let nowIso = '';
|
|
268
353
|
let write = false;
|
|
269
|
-
let format:
|
|
354
|
+
let format: Format = 'text';
|
|
270
355
|
for (let i = 0; i < argv.length; i++) {
|
|
271
356
|
const a = argv[i] as string;
|
|
272
357
|
if (a === '--intake-dir') intakeDir = argv[++i] ?? intakeDir;
|
|
273
358
|
else if (a === '--out-dir') outDir = argv[++i] ?? outDir;
|
|
274
359
|
else if (a === '--now') nowIso = argv[++i] ?? '';
|
|
275
360
|
else if (a === '--write') write = true;
|
|
276
|
-
else if (a === '--format')
|
|
277
|
-
|
|
361
|
+
else if (a === '--format') {
|
|
362
|
+
const raw = argv[++i] ?? '';
|
|
363
|
+
// Validated rather than cast. With two formats an unknown value
|
|
364
|
+
// fell through to `text` and looked like it had worked; with three,
|
|
365
|
+
// a typo in `status` would silently print the one-line text form
|
|
366
|
+
// and a reader would take that for the screen they asked for.
|
|
367
|
+
if (!(FORMATS as readonly string[]).includes(raw)) {
|
|
368
|
+
process.stderr.write(
|
|
369
|
+
`${PROG}: error: argument --format: invalid choice: '${raw}' ` +
|
|
370
|
+
`(choose from ${FORMATS.map((f) => `'${f}'`).join(', ')})\n`,
|
|
371
|
+
);
|
|
372
|
+
return 2;
|
|
373
|
+
}
|
|
374
|
+
format = raw as Format;
|
|
375
|
+
} else if (a === '-h' || a === '--help') {
|
|
278
376
|
process.stdout.write(
|
|
279
|
-
`usage: ${PROG} [--intake-dir DIR] [--out-dir DIR] [--now ISO] [--write]
|
|
377
|
+
`usage: ${PROG} [--intake-dir DIR] [--out-dir DIR] [--now ISO] [--write] ` +
|
|
378
|
+
`[--format ${FORMATS.join('|')}]\n`,
|
|
280
379
|
);
|
|
281
380
|
return 0;
|
|
282
381
|
} else {
|
|
@@ -284,6 +383,14 @@ export function main(argv: string[]): number {
|
|
|
284
383
|
return 2;
|
|
285
384
|
}
|
|
286
385
|
}
|
|
386
|
+
if (format === 'status' && write) {
|
|
387
|
+
// Refused, not ignored. The acceptance criterion is that the screen
|
|
388
|
+
// leaves `git status` identical; ignoring the flag would honour that
|
|
389
|
+
// too, but it would do so silently, and a caller who asked for a write
|
|
390
|
+
// deserves to be told it did not happen.
|
|
391
|
+
process.stderr.write(`${PROG}: error: --format status is read-only; drop --write\n`);
|
|
392
|
+
return 2;
|
|
393
|
+
}
|
|
287
394
|
if (!nowIso) {
|
|
288
395
|
// Deterministic by contract: refuse to guess `now` from the clock when
|
|
289
396
|
// writing, so output is reproducible. Callers pass --now explicitly.
|
|
@@ -310,6 +417,10 @@ export function main(argv: string[]): number {
|
|
|
310
417
|
process.stdout.write(JSON.stringify(sidecar, null, 2) + '\n');
|
|
311
418
|
return 0;
|
|
312
419
|
}
|
|
420
|
+
if (format === 'status') {
|
|
421
|
+
process.stdout.write(renderStatus(sidecar));
|
|
422
|
+
return 0;
|
|
423
|
+
}
|
|
313
424
|
const byVerdict = { preferred: 0, contested: 0, dead_end: 0 };
|
|
314
425
|
for (const l of sidecar.lessons) byVerdict[l.verdict] += 1;
|
|
315
426
|
process.stdout.write(
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Every `path:line` a roadmap blocker cites must still point at a line.
|
|
4
|
+
*
|
|
5
|
+
* A blocker's `What to do` and `Resolved when` lean on citations like
|
|
6
|
+
* `src/scripts/foo.ts:120-134`. Line numbers move with every edit above them,
|
|
7
|
+
* and nothing re-reads a citation once it is written — `check_references`
|
|
8
|
+
* resolves names, not line numbers. A cited range that now runs past the end
|
|
9
|
+
* of its file sends the reader of the blocker to nothing.
|
|
10
|
+
*
|
|
11
|
+
* Scope: the `## Blockers` section of every active roadmap and every stub.
|
|
12
|
+
* Checked: the file exists and the last cited line is within its length.
|
|
13
|
+
* Not checked: what the line says — a content check would red on every
|
|
14
|
+
* harmless edit above it.
|
|
15
|
+
*
|
|
16
|
+
* A citation is a repository-relative path with a file extension, `:`, a line
|
|
17
|
+
* number and an optional `-<line>` end. A bare `:354-359` with no path is
|
|
18
|
+
* relative to prose above it and is not read.
|
|
19
|
+
*
|
|
20
|
+
* Existing misses are ratcheted (`gate-violation-baselines.json`, gate
|
|
21
|
+
* `lint_blocker_citations`): line numbers drift, so a miss already in the tree
|
|
22
|
+
* is drift rather than a new defect, and the count may only fall.
|
|
23
|
+
*
|
|
24
|
+
* Exit codes: 0 within the ratchet · 1 above it · 2 usage error.
|
|
25
|
+
*/
|
|
26
|
+
import * as fs from 'node:fs';
|
|
27
|
+
import * as path from 'node:path';
|
|
28
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
29
|
+
|
|
30
|
+
import { checkRatchet } from './_lib/gate_baseline.js';
|
|
31
|
+
import { reportScanned } from './_lib/scan_scope.js';
|
|
32
|
+
|
|
33
|
+
type MissKind = 'missing-file' | 'beyond-end';
|
|
34
|
+
|
|
35
|
+
interface Citation {
|
|
36
|
+
roadmap: string;
|
|
37
|
+
line: number;
|
|
38
|
+
target: string;
|
|
39
|
+
first: number;
|
|
40
|
+
last: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface Miss extends Citation {
|
|
44
|
+
kind: MissKind;
|
|
45
|
+
length: number | null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const BLOCKERS_SECTION_RE = /^##[ \t]+Blockers[ \t]*$/im;
|
|
49
|
+
const NEXT_H2_RE = /^##[ \t]+\S/m;
|
|
50
|
+
const CITATION_RE = /(?<![\w./:-])((?:[\w.-]+\/)*[\w-][\w.-]*\.[A-Za-z0-9]+):(\d+)(?:-(\d+))?(?!\d)/g;
|
|
51
|
+
|
|
52
|
+
/** Citations inside the `## Blockers` section, with their line in the roadmap. */
|
|
53
|
+
function citationsIn(text: string, roadmap: string): Citation[] {
|
|
54
|
+
const m = BLOCKERS_SECTION_RE.exec(text);
|
|
55
|
+
if (!m) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
const start = m.index + m[0].length;
|
|
59
|
+
const rest = text.slice(start);
|
|
60
|
+
const h2 = NEXT_H2_RE.exec(rest);
|
|
61
|
+
const section = h2 ? rest.slice(0, h2.index) : rest;
|
|
62
|
+
const lineOffset = text.slice(0, start).split('\n').length - 1;
|
|
63
|
+
const out: Citation[] = [];
|
|
64
|
+
section.split('\n').forEach((raw, i) => {
|
|
65
|
+
for (const c of raw.matchAll(CITATION_RE)) {
|
|
66
|
+
const first = Number(c[2]);
|
|
67
|
+
const last = c[3] === undefined ? first : Number(c[3]);
|
|
68
|
+
out.push({ roadmap, line: lineOffset + i + 1, target: c[1] as string, first, last });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Line count of the cited file, repo-relative first, then relative to the citing roadmap. */
|
|
75
|
+
function _lengthOf(root: string, c: Citation): number | null {
|
|
76
|
+
for (const abs of [path.join(root, c.target), path.join(root, path.dirname(c.roadmap), c.target)]) {
|
|
77
|
+
if (fs.existsSync(abs) && fs.statSync(abs).isFile()) {
|
|
78
|
+
return fs.readFileSync(abs, 'utf8').replace(/\n$/, '').split('\n').length;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function checkCitation(root: string, c: Citation, lengths: Map<string, number | null>): Miss | null {
|
|
85
|
+
const key = `${path.dirname(c.roadmap)}\0${c.target}`;
|
|
86
|
+
let length = lengths.get(key);
|
|
87
|
+
if (length === undefined) {
|
|
88
|
+
length = _lengthOf(root, c);
|
|
89
|
+
lengths.set(key, length);
|
|
90
|
+
}
|
|
91
|
+
if (length === null) {
|
|
92
|
+
return { ...c, kind: 'missing-file', length };
|
|
93
|
+
}
|
|
94
|
+
return Math.max(c.first, c.last) > length ? { ...c, kind: 'beyond-end', length } : null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function roadmapFiles(root: string): string[] {
|
|
98
|
+
const out: string[] = [];
|
|
99
|
+
for (const sub of ['', 'stubs']) {
|
|
100
|
+
const dir = path.join(root, 'agents', 'roadmaps', sub);
|
|
101
|
+
let names: string[];
|
|
102
|
+
try {
|
|
103
|
+
names = fs.readdirSync(dir);
|
|
104
|
+
} catch {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
for (const n of names.sort()) {
|
|
108
|
+
const abs = path.join(dir, n);
|
|
109
|
+
if (n.endsWith('.md') && fs.statSync(abs).isFile()) {
|
|
110
|
+
out.push(path.relative(root, abs).split(path.sep).join('/'));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function scanTree(root: string): { misses: Miss[]; scanned: number; citations: number } {
|
|
118
|
+
const lengths = new Map<string, number | null>();
|
|
119
|
+
const files = roadmapFiles(root);
|
|
120
|
+
const misses: Miss[] = [];
|
|
121
|
+
let citations = 0;
|
|
122
|
+
for (const rel of files) {
|
|
123
|
+
for (const c of citationsIn(fs.readFileSync(path.join(root, rel), 'utf8'), rel)) {
|
|
124
|
+
citations += 1;
|
|
125
|
+
const miss = checkCitation(root, c, lengths);
|
|
126
|
+
if (miss) {
|
|
127
|
+
misses.push(miss);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return { misses, scanned: files.length, citations };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const _DEFAULT_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
135
|
+
|
|
136
|
+
function main(argv: string[] = process.argv.slice(2)): number {
|
|
137
|
+
let root = _DEFAULT_ROOT;
|
|
138
|
+
let baselineRoot = _DEFAULT_ROOT;
|
|
139
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
140
|
+
const arg = argv[i];
|
|
141
|
+
if (arg === '--root') {
|
|
142
|
+
const v = argv[i + 1];
|
|
143
|
+
if (v === undefined) {
|
|
144
|
+
process.stderr.write('lint_blocker_citations: --root requires a value\n');
|
|
145
|
+
return 2;
|
|
146
|
+
}
|
|
147
|
+
root = path.resolve(v);
|
|
148
|
+
baselineRoot = root;
|
|
149
|
+
i += 1;
|
|
150
|
+
} else {
|
|
151
|
+
process.stderr.write(`lint_blocker_citations: unknown argument: ${String(arg)}\n`);
|
|
152
|
+
return 2;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const { misses, scanned, citations } = scanTree(root);
|
|
156
|
+
reportScanned({
|
|
157
|
+
gate: 'lint_blocker_citations',
|
|
158
|
+
scanned,
|
|
159
|
+
units: 'roadmap file(s)',
|
|
160
|
+
roots: ['agents/roadmaps', 'agents/roadmaps/stubs'],
|
|
161
|
+
allowEmpty: 'EMPTY_VALID: a checkout with no active roadmap cites nothing',
|
|
162
|
+
});
|
|
163
|
+
const verdict = checkRatchet({ gate: 'lint_blocker_citations', actual: misses.length, repoRoot: baselineRoot });
|
|
164
|
+
const lines = misses.map(
|
|
165
|
+
(m) =>
|
|
166
|
+
` ${m.roadmap}:${String(m.line)} · ${m.target}:${String(m.first)}${m.last !== m.first ? `-${String(m.last)}` : ''} · ` +
|
|
167
|
+
(m.kind === 'missing-file' ? 'file does not exist' : `file has ${String(m.length)} line(s)`),
|
|
168
|
+
);
|
|
169
|
+
if (!verdict.ok) {
|
|
170
|
+
process.stderr.write(`❌ ${verdict.message}\n`);
|
|
171
|
+
process.stderr.write(`${lines.join('\n')}\n`);
|
|
172
|
+
return 1;
|
|
173
|
+
}
|
|
174
|
+
process.stdout.write(
|
|
175
|
+
`✅ lint_blocker_citations: ${String(citations)} citation(s) in ${String(scanned)} roadmap file(s). ${verdict.message}\n`,
|
|
176
|
+
);
|
|
177
|
+
if (lines.length > 0) {
|
|
178
|
+
process.stdout.write(`${lines.join('\n')}\n`);
|
|
179
|
+
}
|
|
180
|
+
return 0;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (process.argv[1] !== undefined) {
|
|
184
|
+
try {
|
|
185
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
186
|
+
const argv1 = fs.realpathSync(path.resolve(process.argv[1]));
|
|
187
|
+
if (here === argv1) {
|
|
188
|
+
process.exit(main());
|
|
189
|
+
}
|
|
190
|
+
} catch {
|
|
191
|
+
if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
|
|
192
|
+
process.exit(main());
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export { citationsIn, checkCitation, scanTree, main };
|
|
198
|
+
export type { Citation, Miss };
|
|
@@ -50,6 +50,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
50
50
|
|
|
51
51
|
import { GateLedger } from './_lib/gate_ledger.js';
|
|
52
52
|
import { resolveBaseRef } from './_lib/ratchet_base_ref.js';
|
|
53
|
+
import { parseExecutionMode } from './_lib/repeated_run.js';
|
|
53
54
|
import { reportScanned } from './_lib/scan_scope.js';
|
|
54
55
|
import { parseHonestNull, parseMarkerLine, parseSkipDeclaration } from './check_completion_review.js';
|
|
55
56
|
|
|
@@ -257,6 +258,14 @@ export function checkFiles(root: string, files: readonly string[], ledger?: Gate
|
|
|
257
258
|
});
|
|
258
259
|
continue;
|
|
259
260
|
}
|
|
261
|
+
// The contract's second axis (repeated-run / flaky), orthogonal to the
|
|
262
|
+
// type marker above — any artifact may declare it.
|
|
263
|
+
const mode = parseExecutionMode(contents);
|
|
264
|
+
if (mode.kind === 'invalid') {
|
|
265
|
+
ledger?.fail(rel, `invalid evidence-mode: ${mode.reason}`);
|
|
266
|
+
findings.push({ file: rel, reason: `evidence-mode: ${mode.reason}` });
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
260
269
|
ledger?.complete(rel);
|
|
261
270
|
}
|
|
262
271
|
return findings;
|
|
@@ -52,8 +52,6 @@ function _load_manifest(p: string): Manifest {
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
interface SettingsBlock {
|
|
55
|
-
max_per_event?: number;
|
|
56
|
-
hard_fail?: boolean;
|
|
57
55
|
tier1_concerns?: string[];
|
|
58
56
|
}
|
|
59
57
|
|
|
@@ -66,9 +64,11 @@ function _isFile(p: string): boolean {
|
|
|
66
64
|
}
|
|
67
65
|
|
|
68
66
|
/**
|
|
69
|
-
* Minimal YAML walk for `hooks.concern_budget
|
|
70
|
-
* `_read_settings_block` line walker
|
|
71
|
-
*
|
|
67
|
+
* Minimal YAML walk for `hooks.concern_budget.tier1_concerns`. Mirrors the
|
|
68
|
+
* Python `_read_settings_block` line walker — no YAML dependency, tolerant of
|
|
69
|
+
* missing keys / blocks. `max_per_event` and `hard_fail` are not read: those
|
|
70
|
+
* keys were retired, the cap is {@link DEFAULT_MAX_PER_EVENT} and hard-fail is
|
|
71
|
+
* the `--strict` argv alone.
|
|
72
72
|
*/
|
|
73
73
|
function _read_settings_block(settings_path: string): SettingsBlock {
|
|
74
74
|
const out: SettingsBlock = {};
|
|
@@ -107,18 +107,7 @@ function _read_settings_block(settings_path: string): SettingsBlock {
|
|
|
107
107
|
in_tier1 = false;
|
|
108
108
|
}
|
|
109
109
|
if (in_budget) {
|
|
110
|
-
let m
|
|
111
|
-
if (m) {
|
|
112
|
-
out.max_per_event = Number.parseInt(m[1] as string, 10);
|
|
113
|
-
in_tier1 = false;
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
m = /^\s{4}hard_fail\s*:\s*(true|false)/.exec(line);
|
|
117
|
-
if (m) {
|
|
118
|
-
out.hard_fail = m[1] === 'true';
|
|
119
|
-
in_tier1 = false;
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
110
|
+
let m: RegExpExecArray | null;
|
|
122
111
|
if (/^\s{4}tier1_concerns\s*:\s*\[\s*\]/.test(line)) {
|
|
123
112
|
out.tier1_concerns = [];
|
|
124
113
|
in_tier1 = false;
|
|
@@ -173,8 +162,8 @@ function _check_concern_counts(
|
|
|
173
162
|
if (count > max_per_event) {
|
|
174
163
|
warnings.push(
|
|
175
164
|
`platforms.${plat}.${event}: ${count} concerns ` +
|
|
176
|
-
`(threshold ${max_per_event}). Trim
|
|
177
|
-
'
|
|
165
|
+
`(threshold ${max_per_event}). Trim the cell; the cap is ` +
|
|
166
|
+
'a fixed constant in lint_hook_concern_budget.ts.',
|
|
178
167
|
);
|
|
179
168
|
}
|
|
180
169
|
}
|
|
@@ -230,9 +219,9 @@ export function lint(
|
|
|
230
219
|
}
|
|
231
220
|
|
|
232
221
|
const settings = _read_settings_block(settings_path);
|
|
233
|
-
const max_per_event =
|
|
222
|
+
const max_per_event = DEFAULT_MAX_PER_EVENT;
|
|
234
223
|
const tier1 = settings.tier1_concerns ?? DEFAULT_TIER1;
|
|
235
|
-
const hard_fail =
|
|
224
|
+
const hard_fail = DEFAULT_HARD_FAIL || strict;
|
|
236
225
|
|
|
237
226
|
const warnings: string[] = [];
|
|
238
227
|
const errors: string[] = [];
|
|
@@ -52,6 +52,33 @@ const DEFAULT_MANIFEST = path.join(
|
|
|
52
52
|
const HOOKS_DIR = path.join(REPO_ROOT, "src", "scripts", "hooks");
|
|
53
53
|
const DEFAULT_HOST_LOWERING = path.join(HOOKS_DIR, "host_lowering.yaml");
|
|
54
54
|
|
|
55
|
+
/**
|
|
56
|
+
* What a concern does to a turn — the closed set `effect:` draws from.
|
|
57
|
+
*
|
|
58
|
+
* Read by the neighbour census, which needs to say what sharing an event with
|
|
59
|
+
* a foreign entry actually risks. A foreign entry's effect is `unknown` unless
|
|
60
|
+
* its output shape has been observed: no host exposes another package's hook
|
|
61
|
+
* execution, so the honest default is that the neighbour's effect cannot be
|
|
62
|
+
* read off its registration.
|
|
63
|
+
*
|
|
64
|
+
* - `permission` can refuse the thing it fires on
|
|
65
|
+
* - `context` puts text in front of the model
|
|
66
|
+
* - `verification` checks a claim or a shape and reports what it found
|
|
67
|
+
* - `telemetry` records state, a ledger, a counter
|
|
68
|
+
* - `memory` reads or writes the memory layer
|
|
69
|
+
* - `notification` tells the human something and changes nothing else
|
|
70
|
+
* - `formatting` reshapes a command or a generated file
|
|
71
|
+
*/
|
|
72
|
+
export const CONCERN_EFFECTS: ReadonlySet<string> = new Set([
|
|
73
|
+
"permission",
|
|
74
|
+
"context",
|
|
75
|
+
"verification",
|
|
76
|
+
"telemetry",
|
|
77
|
+
"memory",
|
|
78
|
+
"notification",
|
|
79
|
+
"formatting",
|
|
80
|
+
]);
|
|
81
|
+
|
|
55
82
|
// Canonical event vocabulary — keep in lock-step with
|
|
56
83
|
// docs/contracts/hook-architecture-v1.md and dispatch_hook.EVENT_VOCABULARY.
|
|
57
84
|
const EVENT_VOCABULARY: ReadonlySet<string> = new Set([
|
|
@@ -159,6 +186,32 @@ function _check_concerns(manifest: YamlObject, errors: string[]): Set<string> {
|
|
|
159
186
|
if (!_isFile(path.join(REPO_ROOT, script))) {
|
|
160
187
|
errors.push(`concerns.${name}: script not found at '${script}'`);
|
|
161
188
|
}
|
|
189
|
+
// `effect:` — what this concern DOES to a turn, from a closed set. It is
|
|
190
|
+
// what lets the neighbour census say "a foreign entry shares this event
|
|
191
|
+
// with something of ours that can refuse" rather than only "two entries".
|
|
192
|
+
// Required and enum-checked, which is a stricter rule than the optional
|
|
193
|
+
// keys below for one reason: a concern with no effect, or with a
|
|
194
|
+
// misspelled one, would silently drop out of every double-gate comparison
|
|
195
|
+
// — the warning would stay quiet and read as "no conflict", which is the
|
|
196
|
+
// wrong answer rather than a missing one. There is no unknown-key guard
|
|
197
|
+
// on this mapping, so nothing else would catch `effects:`.
|
|
198
|
+
const effect = spec["effect"];
|
|
199
|
+
if (typeof effect !== "string" || !CONCERN_EFFECTS.has(effect)) {
|
|
200
|
+
errors.push(
|
|
201
|
+
`concerns.${name}: 'effect' must be one of ` +
|
|
202
|
+
`${[...CONCERN_EFFECTS].sort().join(" | ")} (got ${JSON.stringify(effect)})`,
|
|
203
|
+
);
|
|
204
|
+
} else if ((spec["severity"] === "blocking") !== (effect === "permission")) {
|
|
205
|
+
// The two fields answer the same question from different sides, so a
|
|
206
|
+
// disagreement is a mistake in one of them, never a shade of meaning:
|
|
207
|
+
// `blocking` is the dispatcher's word for "this can refuse" and
|
|
208
|
+
// `permission` is the census's.
|
|
209
|
+
errors.push(
|
|
210
|
+
`concerns.${name}: 'effect: ${effect}' contradicts ` +
|
|
211
|
+
`'severity: ${String(spec["severity"])}' — a concern that can refuse ` +
|
|
212
|
+
`is 'permission', and only those are 'blocking'`,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
162
215
|
// `tools:` — the optional per-concern tool filter the dispatcher applies
|
|
163
216
|
// in-process (`_concern_matches_tool`). Validated because the failure mode
|
|
164
217
|
// is silent: the dispatcher fails toward RUNNING the concern on anything
|