@event4u/agent-config 16.3.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 +251 -0
- package/README.md +2 -2
- package/agents/templates/.ai-council.yml.example +26 -8
- package/dist/agent-src/commands/analyze/inbox.md +10 -7
- 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 +1 -1
- package/dist/agent-src/commands/fix/ci.md +17 -3
- 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 +3 -3
- 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/next.md +10 -1
- package/dist/agent-src/commands/roadmap/process-full.md +52 -38
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +64 -14
- 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/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 +1 -1
- 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 +67 -52
- 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 +4 -10
- 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 +0 -1
- 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 +0 -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 +0 -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 +0 -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 +5 -5
- 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 +2 -3
- package/dist/agent-src/rules/delegation-policy.md +2 -3
- package/dist/agent-src/rules/design-fidelity.md +0 -1
- 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 +0 -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 +0 -1
- package/dist/agent-src/rules/domain-safety-pii.md +0 -1
- package/dist/agent-src/rules/domain-safety-retention.md +0 -1
- package/dist/agent-src/rules/downstream-changes.md +0 -1
- package/dist/agent-src/rules/engineering-safety-floor.md +0 -1
- 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 +1 -2
- package/dist/agent-src/rules/finance-safety-floor.md +0 -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 +1 -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 +0 -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 +0 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +0 -1
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +0 -1
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
- package/dist/agent-src/rules/media-governance-routing.md +1 -2
- 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 +2 -3
- 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 +2 -3
- package/dist/agent-src/rules/question-not-instruction.md +0 -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 +3 -6
- 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 +0 -1
- package/dist/agent-src/rules/scale-discipline.md +0 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +0 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +0 -1
- 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 +0 -1
- package/dist/agent-src/rules/settings-ask-protocol.md +5 -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 +0 -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 +0 -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 +0 -1
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +0 -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 +0 -1
- package/dist/agent-src/scripts/gate_budget.ts +47 -23
- package/dist/agent-src/scripts/gate_execute.ts +12 -4
- 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/bug-analyzer/SKILL.md +1 -1
- 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/estimate-ticket/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/jira-integration/SKILL.md +3 -3
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -2
- package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +3 -1
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- 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/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/skill.md +1 -1
- package/dist/cli/registry.js +1 -0
- package/dist/cli-delegate/check_update_banner.js +195 -119
- package/dist/cli-delegate/{chunk-TRI6DQZ6.js → chunk-5GPULQBE.js} +60 -42
- package/dist/cli-delegate/{chunk-JQVYKIZA.js → chunk-6SRJTYJS.js} +33 -177
- package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
- 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-NQ7WT43P.js → chunk-AED2VQGM.js} +65 -11
- package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
- package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
- package/dist/cli-delegate/{chunk-NXEILF2K.js → chunk-F3QDG2GT.js} +481 -72
- package/dist/cli-delegate/{chunk-CQWX336L.js → chunk-G5VVIZRC.js} +3 -3
- package/dist/cli-delegate/{chunk-JY2I2DXV.js → chunk-H76PHZBI.js} +137 -60
- package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
- package/dist/cli-delegate/{chunk-LIYTLH6O.js → chunk-KXXWJTDO.js} +5 -10
- package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
- package/dist/cli-delegate/{chunk-S4YWNRKO.js → chunk-MDPPKQCQ.js} +34 -1
- package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-MSUL5NYP.js} +5 -5
- package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
- package/dist/cli-delegate/{chunk-GKE7ZVFA.js → chunk-PWX7CKMD.js} +1 -1
- package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
- package/dist/cli-delegate/{chunk-RQNNW7IF.js → chunk-T7XSJSUQ.js} +433 -632
- package/dist/cli-delegate/{chunk-EEHDXSYD.js → chunk-WQWXGIWB.js} +12 -273
- package/dist/cli-delegate/{chunk-QLDHIPWR.js → chunk-XQTPXKFA.js} +1 -1
- 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 +105 -35
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +15 -12
- package/dist/cli-delegate/cmd_doctor_neighbours.js +11 -4
- package/dist/cli-delegate/cmd_explain.js +43 -19
- package/dist/cli-delegate/cmd_export.js +10 -10
- package/dist/cli-delegate/cmd_git_convention.js +1851 -0
- package/dist/cli-delegate/cmd_handoff.js +40 -21
- package/dist/cli-delegate/cmd_mcp_available.js +3 -2
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +4 -3
- package/dist/cli-delegate/cmd_prune.js +10 -10
- package/dist/cli-delegate/cmd_route_audit.js +7 -7
- package/dist/cli-delegate/cmd_route_explain.js +5 -5
- package/dist/cli-delegate/cmd_session_recycle.js +9 -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 +10 -10
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +10 -10
- package/dist/cli-delegate/cmd_uninstall.js +10 -10
- package/dist/cli-delegate/cmd_update.js +7 -7
- package/dist/cli-delegate/cmd_upgrade.js +7 -7
- package/dist/cli-delegate/cmd_validate.js +10 -10
- package/dist/cli-delegate/cmd_versions.js +5 -5
- package/dist/cli-delegate/gate_budget.js +1 -1
- package/dist/cli-delegate/gate_execute.js +2 -2
- package/dist/cli-delegate/roadmap_gates.js +2 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +129 -90
- 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 +24 -9
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +5 -4
- package/dist/hooks/dispatch.js +2151 -1820
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/install/install.mjs +462 -431
- package/dist/install/installThinLayer.js +40 -12
- package/dist/install/installedRuleLinks.js +105 -19
- 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 +2702 -1995
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +15 -120
- 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 +344 -18
- package/dist/scripts/_lib/package_root.js +68 -0
- package/dist/scripts/_lib/rule_law_section.js +1 -1
- package/dist/scripts/_lib/settings_removed_keys.js +168 -0
- package/dist/scripts/_lib/thin_rules.js +80 -3
- 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 +23 -81
- package/dist/shared/skillRanking.js +30 -4
- 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 +35 -65
- 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/gate_budget.ts +47 -23
- package/src/agent-src/scripts/gate_execute.ts +12 -4
- 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/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/config/agent-settings.template.yml +79 -312
- 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 +3 -3
- package/src/config/discovery/packs.yml +17 -1
- package/src/config/evaluator-budgets.json +19 -6
- package/src/config/gate-coverage.yml +65 -23
- package/src/config/gate-violation-baselines.json +53 -13
- package/src/config/gitignore-block.txt +19 -0
- package/src/config/hook-bundle-budget.json +1 -1
- package/src/config/release-gate-locality.yml +2 -1
- package/src/config/routing-coverage-seed.json +48 -6
- package/src/config/rule-law-ceilings.json +12 -6
- package/src/config/rule-obligations.json +833 -0
- package/src/install/installThinLayer.ts +76 -10
- package/src/install/installedRuleLinks.ts +105 -17
- 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 +10 -10
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +133 -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 +37 -2
- package/src/scripts/_lib/agent_settings.ts +15 -124
- package/src/scripts/_lib/blocked_by_marker.ts +1 -1
- package/src/scripts/_lib/compile_time_toggles.ts +12 -21
- package/src/scripts/_lib/dispatch_import_closure.ts +163 -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/global_deploy_inventory.ts +74 -0
- package/src/scripts/_lib/graph_feeder_record.ts +236 -13
- package/src/scripts/_lib/installed_layer.ts +448 -23
- package/src/scripts/_lib/knowledge_global.ts +14 -1
- package/src/scripts/_lib/module_reach.ts +456 -0
- package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +8 -10
- 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/rule_law_section.ts +1 -1
- 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/test_red_state.ts +5 -0
- package/src/scripts/_lib/thin_rules.ts +83 -3
- package/src/scripts/_lib/touched_file_quality.ts +142 -6
- package/src/scripts/_lib/worker_budget.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +16 -1
- package/src/scripts/ai_council/config.ts +7 -7
- 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_team/config.ts +11 -16
- package/src/scripts/audit_user_type_axis.ts +20 -8
- 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/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_evaluator_budgets.ts +4 -0
- package/src/scripts/check_finding_dispositions.ts +88 -25
- 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 +107 -0
- package/src/scripts/check_kernel_edit_ratified.ts +86 -6
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_release_manifest_content.ts +189 -0
- package/src/scripts/check_standing_rule_delivery.ts +96 -0
- package/src/scripts/check_suppression_hygiene.ts +2 -5
- 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/command_suggester/settings.ts +8 -108
- package/src/scripts/command_suggester/types.ts +4 -5
- 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/explain_run.ts +8 -13
- package/src/scripts/generate_git_convention_grammar.ts +127 -0
- package/src/scripts/generate_host_cost_table.ts +20 -3
- package/src/scripts/handoff_context_hook.ts +86 -37
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +25 -6
- package/src/scripts/hooks/block_config_weakening.ts +48 -5
- package/src/scripts/hooks/block_plumbing_writes.ts +8 -4
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
- package/src/scripts/hooks/evidence_independence.ts +12 -4
- package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
- package/src/scripts/hooks/push_settle_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +44 -3
- package/src/scripts/hooks/state_io.ts +8 -4
- package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
- package/src/scripts/hooks/turn_end_gate_hook.ts +1 -0
- package/src/scripts/install-hooks.sh +42 -14
- package/src/scripts/install.ts +7 -31
- 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_pack_boundaries.ts +406 -28
- 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 +151 -21
- 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 +12 -1
- package/src/scripts/measure_skill_ranker_baseline.ts +5 -0
- package/src/scripts/model_rule_injection.ts +3 -3
- 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/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_installed_rule_links.ts +118 -1
- package/src/scripts/report_module_reach.ts +212 -0
- package/src/scripts/report_obligation_mechanism.ts +16 -18
- package/src/scripts/report_parked_blockers.ts +222 -0
- package/src/scripts/report_required_checks_drift.ts +196 -0
- package/src/scripts/report_skill_ranker_confusion.ts +103 -2
- package/src/scripts/report_standing_payload_by_host.ts +1 -1
- package/src/scripts/routing_doctor.ts +2 -2
- package/src/scripts/schemas/agent-settings.schema.json +17 -31
- package/src/scripts/schemas/command.schema.json +1 -1
- package/src/scripts/schemas/skill.schema.json +1 -1
- package/src/scripts/self_review_gate.ts +39 -2
- package/src/scripts/skill_tools/score_skill_relevance.ts +28 -19
- package/src/scripts/sync_pr_branch.ts +403 -132
- package/src/scripts/trigger_eval_grandfather.json +0 -16
- package/src/server/schemas/settings.ts +33 -177
- package/src/shared/skillRanking.ts +53 -4
- package/dist/cli-delegate/chunk-NYX3L2PZ.js +0 -99
- 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
|
@@ -50,6 +50,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
50
50
|
import * as path from 'node:path';
|
|
51
51
|
|
|
52
52
|
import { parse as _rtParse } from '../sync_yaml_rt.js';
|
|
53
|
+
import { GIT_CONVENTION_KEYS, fileSource, readGitConventionKey } from '../_lib/git_convention.js';
|
|
53
54
|
|
|
54
55
|
const DEFAULT_PATH = '.agent-settings.yml';
|
|
55
56
|
|
|
@@ -203,7 +204,8 @@ const _PRESCAN_RULES: readonly PrescanRule[] = [
|
|
|
203
204
|
];
|
|
204
205
|
|
|
205
206
|
interface Finding {
|
|
206
|
-
line
|
|
207
|
+
/** null when no single line can be named, printed as `line:-`. */
|
|
208
|
+
line: number | null;
|
|
207
209
|
kind: string;
|
|
208
210
|
verdict: string;
|
|
209
211
|
hint: string;
|
|
@@ -254,9 +256,53 @@ function _scan_text(text: string): Finding[] {
|
|
|
254
256
|
return findings;
|
|
255
257
|
}
|
|
256
258
|
|
|
259
|
+
/**
|
|
260
|
+
* The schema enum and the branch-pattern alphabet, through the same reader
|
|
261
|
+
* `git:convention show` and `sync_pr_branch` use, so a value those refuse
|
|
262
|
+
* fails here first.
|
|
263
|
+
*/
|
|
264
|
+
function _git_convention_findings(target: string, text: string): Finding[] {
|
|
265
|
+
const findings: Finding[] = [];
|
|
266
|
+
const lines = _splitlines(text);
|
|
267
|
+
for (const key of GIT_CONVENTION_KEYS) {
|
|
268
|
+
const reading = readGitConventionKey(key, fileSource({ developer: [target] }), {});
|
|
269
|
+
if (reading.state !== 'invalid' && reading.state !== 'malformed') continue;
|
|
270
|
+
// `malformed` is a fact about the whole file, so it is one finding, not one per key.
|
|
271
|
+
if (reading.state === 'malformed') {
|
|
272
|
+
if (!findings.some((f) => f.verdict === 'malformed')) {
|
|
273
|
+
findings.push({ line: null, kind: 'git.*', verdict: 'malformed', hint: reading.detail ?? reading.state });
|
|
274
|
+
}
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
findings.push({
|
|
278
|
+
line: _gitKeyLine(lines, key),
|
|
279
|
+
kind: `git.${key}`,
|
|
280
|
+
verdict: reading.state,
|
|
281
|
+
hint: reading.detail ?? reading.state,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
return findings;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* The 1-based line of `key` inside a block-style `git:` section, or null: a
|
|
289
|
+
* same-named key elsewhere is not it, and an inline `git:` value has no line
|
|
290
|
+
* of its own to name.
|
|
291
|
+
*/
|
|
292
|
+
function _gitKeyLine(lines: readonly string[], key: string): number | null {
|
|
293
|
+
const start = lines.findIndex((l) => /^git\s*:\s*(#.*)?$/.test(l));
|
|
294
|
+
if (start === -1) return null;
|
|
295
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
296
|
+
const l = lines[i] as string;
|
|
297
|
+
if (/^\S/.test(l) && !l.startsWith('#')) return null;
|
|
298
|
+
if (new RegExp(`^\\s+${key}\\s*:`).test(l)) return i + 1;
|
|
299
|
+
}
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
|
|
257
303
|
function _format(finding: Finding): string {
|
|
258
304
|
return (
|
|
259
|
-
` ❌ line:${_ljust(String(finding.line), 4)} ` +
|
|
305
|
+
` ❌ line:${_ljust(finding.line === null ? '-' : String(finding.line), 4)} ` +
|
|
260
306
|
`${_ljust(finding.kind, 22)} ${_ljust(finding.verdict, 14)} ${finding.hint}`
|
|
261
307
|
);
|
|
262
308
|
}
|
|
@@ -370,7 +416,13 @@ export function main(argv: string[] | null = null, options: MainOptions = {}): n
|
|
|
370
416
|
}
|
|
371
417
|
}
|
|
372
418
|
|
|
373
|
-
|
|
419
|
+
// A parser finding already reports a file that does not parse; a `malformed`
|
|
420
|
+
// git reading would only repeat it. A pre-scan finding is not a parse
|
|
421
|
+
// failure, so it hides nothing.
|
|
422
|
+
const unparsed = findings.some((f) => f.kind === 'parser');
|
|
423
|
+
const git = _git_convention_findings(target, text).filter((f) => !(unparsed && f.verdict === 'malformed'));
|
|
424
|
+
|
|
425
|
+
if (findings.length === 0 && git.length === 0) {
|
|
374
426
|
if (!opts.quiet) {
|
|
375
427
|
_print(
|
|
376
428
|
out,
|
|
@@ -380,12 +432,18 @@ export function main(argv: string[] | null = null, options: MainOptions = {}): n
|
|
|
380
432
|
}
|
|
381
433
|
return 0;
|
|
382
434
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
_print(err, _format(finding));
|
|
435
|
+
if (findings.length > 0) {
|
|
436
|
+
_print(err, `❌ ${target}: ${findings.length} finding(s) outside the supported subset.`);
|
|
437
|
+
for (const finding of findings) _print(err, _format(finding));
|
|
438
|
+
_print(err, '');
|
|
439
|
+
_print(err, ' Contract: docs/contracts/settings-sync-yaml-subset.md');
|
|
440
|
+
}
|
|
441
|
+
if (git.length > 0) {
|
|
442
|
+
_print(err, `❌ ${target}: ${git.length} git.* value(s) the convention refuses.`);
|
|
443
|
+
for (const finding of git) _print(err, _format(finding));
|
|
444
|
+
_print(err, '');
|
|
445
|
+
_print(err, ' Contract: docs/decisions/ADR-283-git-convention-carrier.md (the git section of agent-settings.schema.json)');
|
|
386
446
|
}
|
|
387
|
-
_print(err, '');
|
|
388
|
-
_print(err, ' Contract: docs/contracts/settings-sync-yaml-subset.md');
|
|
389
447
|
return 1;
|
|
390
448
|
}
|
|
391
449
|
|
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
iter_setting_overrides,
|
|
49
49
|
load_agent_settings,
|
|
50
50
|
MERGEABLE_KEYS,
|
|
51
|
+
settings_layer_states,
|
|
51
52
|
user_global_settings_paths,
|
|
52
53
|
USER_GLOBAL_FILENAME,
|
|
53
54
|
} from '../_lib/agent_settings.js';
|
|
@@ -179,7 +180,7 @@ export function missionResolutionFor(
|
|
|
179
180
|
* file the user actually edited — telling somebody their value was dropped
|
|
180
181
|
* without telling them which file it was dropped from is half an answer.
|
|
181
182
|
*/
|
|
182
|
-
export function userGlobalDrop(key: string): { dropped: boolean; file: string } {
|
|
183
|
+
export function userGlobalDrop(key: string, templateDefault?: unknown): { dropped: boolean; file: string } {
|
|
183
184
|
// Probe EVERY user-global layer the loader reads, not just the flat file.
|
|
184
185
|
// `user_global_settings_paths()` returns the flat `agent-settings.yml` AND
|
|
185
186
|
// the canonical `settings/.agent-settings.yml` the setup wizard writes, and
|
|
@@ -200,7 +201,13 @@ export function userGlobalDrop(key: string): { dropped: boolean; file: string }
|
|
|
200
201
|
} catch {
|
|
201
202
|
continue;
|
|
202
203
|
}
|
|
203
|
-
|
|
204
|
+
const value = getSettingsLeaf(raw, key);
|
|
205
|
+
if (value === undefined) continue;
|
|
206
|
+
// `upgrade` inserts template defaults into the user-global file, so a
|
|
207
|
+
// dropped default is not something the user set and loses nothing. A
|
|
208
|
+
// lower layer can still hold a value the user did set.
|
|
209
|
+
if (templateDefault !== undefined && JSON.stringify(value) === JSON.stringify(templateDefault)) continue;
|
|
210
|
+
return { dropped: true, file: candidate };
|
|
204
211
|
}
|
|
205
212
|
return { dropped: false, file };
|
|
206
213
|
}
|
|
@@ -234,8 +241,16 @@ export function runSettingsGet(opts: SettingsGetOptions): SettingsGetResult {
|
|
|
234
241
|
const cls = _classFor(opts.packageRoot, opts.key);
|
|
235
242
|
const fallback = templateDefault(opts.packageRoot, opts.key);
|
|
236
243
|
const carveOut = carveOutFor(opts.key);
|
|
237
|
-
const drop = userGlobalDrop(opts.key);
|
|
244
|
+
const drop = userGlobalDrop(opts.key, fallback);
|
|
238
245
|
const mission = missionResolutionFor(opts.key, merged);
|
|
246
|
+
// The loader reads a layer that does not parse as absent, so "not set" can
|
|
247
|
+
// be false; the exit code stays 0 because the read itself still answered.
|
|
248
|
+
const malformed = settings_layer_states({ cwd: opts.cwd }).filter((l) => l.state === 'malformed');
|
|
249
|
+
if (malformed.length > 0) {
|
|
250
|
+
err.push(
|
|
251
|
+
`⚠️ settings:get: ${malformed.map((l) => l.path).join(', ')} does not parse; every value it sets is read as absent.`,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
239
254
|
|
|
240
255
|
if (opts.json) {
|
|
241
256
|
out.push(
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
resolveExecutionPosture,
|
|
20
20
|
} from '../../shared/missionExecution.js';
|
|
21
21
|
import {
|
|
22
|
+
UNREAD_FORGE,
|
|
22
23
|
forgeProtectionRows,
|
|
23
24
|
protectionActions,
|
|
24
25
|
type ForgeReading,
|
|
@@ -81,7 +82,11 @@ export function executionJson(overrides: () => OverrideStream): Dict {
|
|
|
81
82
|
* `actions` carries the human ACTION lines — the step's own words are that a
|
|
82
83
|
* missing row is a blocker entry and NOT a halt, so this reports and returns.
|
|
83
84
|
*/
|
|
84
|
-
export function forgeProtectionJson(
|
|
85
|
+
export function forgeProtectionJson(
|
|
86
|
+
reading: ForgeReading,
|
|
87
|
+
repo: string | null = null,
|
|
88
|
+
not_checked: NotCheckedReason = null,
|
|
89
|
+
): Dict {
|
|
85
90
|
const rows = forgeProtectionRows(reading);
|
|
86
91
|
const readFromForge = rows.some((r) => r.state !== 'unread');
|
|
87
92
|
// **The slug is reported only when something was actually read, and that
|
|
@@ -107,6 +112,11 @@ export function forgeProtectionJson(reading: ForgeReading, repo: string | null =
|
|
|
107
112
|
})),
|
|
108
113
|
actions: protectionActions(rows).map(name),
|
|
109
114
|
read_from_forge: readFromForge,
|
|
115
|
+
// Present on every run, `null` when the read happened. A key that
|
|
116
|
+
// appeared only on the skipped path would make its absence carry the
|
|
117
|
+
// meaning, and absence is exactly what a schema-validating consumer
|
|
118
|
+
// reads as "this build does not report it".
|
|
119
|
+
not_checked,
|
|
110
120
|
};
|
|
111
121
|
}
|
|
112
122
|
|
|
@@ -147,6 +157,64 @@ export interface ForgeDeps {
|
|
|
147
157
|
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
148
158
|
/** The subprocess runner for both `git` and `gh`. */
|
|
149
159
|
readonly run?: Runner;
|
|
160
|
+
/**
|
|
161
|
+
* Skip the read before anything spawns. The block keeps its shape: five
|
|
162
|
+
* `unread` rows, exactly what a failed read produces.
|
|
163
|
+
*/
|
|
164
|
+
readonly offline?: boolean;
|
|
165
|
+
/**
|
|
166
|
+
* WHY the read was skipped, or `null` when it happened.
|
|
167
|
+
*
|
|
168
|
+
* Five `unread` rows and no failures is what "everything is fine" looks
|
|
169
|
+
* like to a consumer summing row states, so `read_from_forge: false` alone
|
|
170
|
+
* did not carry the distinction. This names it, which is the condition the
|
|
171
|
+
* council attached to making offline the default.
|
|
172
|
+
*/
|
|
173
|
+
readonly not_checked?: NotCheckedReason;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Why a `doctor` run did not read the forge. `null` means it did.
|
|
178
|
+
*
|
|
179
|
+
* Three reasons rather than a boolean, because the repairs differ: pass
|
|
180
|
+
* `--online`, drop `--no-forge`, or run without `--check`.
|
|
181
|
+
*/
|
|
182
|
+
export type NotCheckedReason = 'online_not_requested' | 'offline_flag' | 'single_check' | null;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Whether a `doctor` run reads the forge — and why not, when it does not.
|
|
186
|
+
*
|
|
187
|
+
* **OFFLINE IS THE DEFAULT since 2026-10-09.** Blocker
|
|
188
|
+
* `doctor-network-default` of `road-to-findings-that-get-a-disposition`,
|
|
189
|
+
* option (a): AI council 2026-10-07 (anthropic + openai, 2/2), adopted
|
|
190
|
+
* 2026-10-08 under the owner's delegation of council-decidable questions. The
|
|
191
|
+
* recorded reasoning is that a health command reaching the network on every
|
|
192
|
+
* run — including a single-check run — is the surprising default, and that
|
|
193
|
+
* `--online` costs one word to anyone who wants the read.
|
|
194
|
+
*
|
|
195
|
+
* Phase 3.1 shipped the opt-OUT and this function's earlier header said the
|
|
196
|
+
* default "is an owner decision, so this function does not decide it". That is
|
|
197
|
+
* now decided, and the header says so rather than leaving the next reader to
|
|
198
|
+
* infer it from the expression.
|
|
199
|
+
*
|
|
200
|
+
* Precedence is narrowest-first, so the reason names the repair: a `--check`
|
|
201
|
+
* run reads no forge row at all, an explicit `--no-forge` beats `--online`
|
|
202
|
+
* because it is the more specific instruction, and the bare default is last.
|
|
203
|
+
*/
|
|
204
|
+
export function forgeDepsFor(opts: {
|
|
205
|
+
readonly online?: boolean;
|
|
206
|
+
readonly no_forge?: boolean;
|
|
207
|
+
readonly check: string | null;
|
|
208
|
+
}): ForgeDeps {
|
|
209
|
+
const not_checked: NotCheckedReason =
|
|
210
|
+
opts.check !== null
|
|
211
|
+
? 'single_check'
|
|
212
|
+
: opts.no_forge === true
|
|
213
|
+
? 'offline_flag'
|
|
214
|
+
: opts.online === true
|
|
215
|
+
? null
|
|
216
|
+
: 'online_not_requested';
|
|
217
|
+
return { offline: not_checked !== null, not_checked };
|
|
150
218
|
}
|
|
151
219
|
|
|
152
220
|
export function forgeProtectionJsonFor(root: string, deps: ForgeDeps = {}): Dict {
|
|
@@ -155,6 +223,9 @@ export function forgeProtectionJsonFor(root: string, deps: ForgeDeps = {}): Dict
|
|
|
155
223
|
// binding were asserted one layer down against fakes while a regression in
|
|
156
224
|
// the real wiring stayed invisible. `deps` is that seam; production passes
|
|
157
225
|
// nothing and gets `process.env` plus the real spawn.
|
|
226
|
+
if (deps.offline === true) {
|
|
227
|
+
return forgeProtectionJson(UNREAD_FORGE, null, deps.not_checked ?? null);
|
|
228
|
+
}
|
|
158
229
|
const env = deps.env ?? process.env;
|
|
159
230
|
const run = deps.run;
|
|
160
231
|
const remaining = budgetOf(FORGE_TOTAL_BUDGET_MS);
|
|
@@ -283,6 +283,36 @@ Tier 2 — maintenance / internal (hooks, MCP, memory, telemetry):
|
|
|
283
283
|
settings:get Read one setting: its value, the file it came from, its
|
|
284
284
|
class, and whether "absent" differs from the default.
|
|
285
285
|
Usage: settings:get <key> [--json]
|
|
286
|
+
git:convention The git convention (git.commit_format, git.branch_pattern,
|
|
287
|
+
git.update_strategy): value in force, source and state
|
|
288
|
+
(valid|absent|malformed|invalid|discarded|unresolvable),
|
|
289
|
+
read from a committed .git-convention.yml over the
|
|
290
|
+
settings files; this checkout's differing value is shown
|
|
291
|
+
as a candidate, and any repository commit-message
|
|
292
|
+
validator that also runs at commit. Exit 1 when a key in
|
|
293
|
+
force is malformed, invalid, discarded or unresolvable;
|
|
294
|
+
a candidate in one of these states is a warning, exit 0.
|
|
295
|
+
--key limits show to the named keys (repeatable).
|
|
296
|
+
update_strategy is read at --base, else the default
|
|
297
|
+
branch: a pull request passes --base origin/<its base>.
|
|
298
|
+
subject checks subjects on stdin against the convention in
|
|
299
|
+
force; ticket reads the ticket out of a branch name; branch
|
|
300
|
+
renders a name from git.branch_pattern; measure proposes
|
|
301
|
+
a convention from the history (subject family, branch
|
|
302
|
+
pattern, observed update style) and writes nothing;
|
|
303
|
+
init --yes creates .git-convention.yml once on the
|
|
304
|
+
user's yes (never over one, never committed);
|
|
305
|
+
show and subject print "no convention established" when
|
|
306
|
+
no declaration, approved card or commitlint config exists; sync brings the
|
|
307
|
+
branch up to --base (else the default branch) per
|
|
308
|
+
git.update_strategy (exit 1 base unresolved, 3 behind
|
|
309
|
+
under rebase, 4 strategy unreadable).
|
|
310
|
+
Usage: git:convention show [--json] [--base REF] [--key K]
|
|
311
|
+
git:convention subject [--format F|--family F]
|
|
312
|
+
git:convention ticket [BRANCH] [--keys K]
|
|
313
|
+
git:convention branch --slug S [--type T] [--ticket K]
|
|
314
|
+
git:convention measure [--limit N] [--family F]
|
|
315
|
+
git:convention sync [--base REF] [--dry-run]
|
|
286
316
|
settings:set Set one setting in the global file. Refuses every class-C
|
|
287
317
|
(guarded) key from docs/contracts/settings-classes.md, and
|
|
288
318
|
refuses everything when that contract is unreadable.
|
|
@@ -362,9 +392,9 @@ Tier 2 — maintenance / internal (hooks, MCP, memory, telemetry):
|
|
|
362
392
|
roadmap-progress:hook PostToolUse hook entry point (read JSON from stdin)
|
|
363
393
|
Regenerates roadmaps-progress.md when a tool wrote under agents/roadmaps/
|
|
364
394
|
onboarding-gate:hook Hook entry point (drains stdin)
|
|
365
|
-
Writes
|
|
395
|
+
Writes agents/state/onboarding-gate.json from .agent-settings.yml
|
|
366
396
|
context-hygiene:hook PostToolUse hook entry point (read JSON from stdin)
|
|
367
|
-
Maintains
|
|
397
|
+
Maintains agents/state/context-hygiene.json (turn count, loop, freshness)
|
|
368
398
|
dispatch:hook Universal hook dispatcher (Phase 7, hook-architecture-v1.md)
|
|
369
399
|
Usage: dispatch:hook --platform <name> --event <event> [--native-event <native>]
|
|
370
400
|
Reads scripts/hook_manifest.yaml and runs the resolved concern chain.
|
|
@@ -796,6 +826,10 @@ cmd_settings_get() {
|
|
|
796
826
|
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_settings_get.ts" "$@"
|
|
797
827
|
}
|
|
798
828
|
|
|
829
|
+
cmd_git_convention() {
|
|
830
|
+
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_git_convention.ts" "$@"
|
|
831
|
+
}
|
|
832
|
+
|
|
799
833
|
cmd_mcp_available() {
|
|
800
834
|
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_mcp_available.ts" "$@"
|
|
801
835
|
}
|
|
@@ -1561,6 +1595,7 @@ main() {
|
|
|
1561
1595
|
session:recycle) cmd_session_recycle "$@" ;;
|
|
1562
1596
|
packs:active) cmd_packs_active "$@" ;;
|
|
1563
1597
|
settings:get) cmd_settings_get "$@" ;;
|
|
1598
|
+
git:convention) cmd_git_convention "$@" ;;
|
|
1564
1599
|
mcp:available) cmd_mcp_available "$@" ;;
|
|
1565
1600
|
brand:status) cmd_brand_status "$@" ;;
|
|
1566
1601
|
roadmap:context) cmd_roadmap_context "$@" ;;
|
|
@@ -49,11 +49,13 @@ import { createRequire } from 'node:module';
|
|
|
49
49
|
import * as fs from 'node:fs';
|
|
50
50
|
import * as os from 'node:os';
|
|
51
51
|
import * as path from 'node:path';
|
|
52
|
-
import {
|
|
52
|
+
import { resolvePackageRoot } from './package_root.js';
|
|
53
53
|
|
|
54
54
|
import * as user_global_paths from './user_global_paths.js';
|
|
55
55
|
import { carveOutKeys } from '../../shared/settingsCarveOut.js';
|
|
56
56
|
import { applyRenamedKeys } from './settings_renamed_keys.js';
|
|
57
|
+
import { warnRemovedKeys } from './settings_removed_keys.js';
|
|
58
|
+
export { REMOVED_KEYS } from './settings_removed_keys.js';
|
|
57
59
|
import type * as YamlModule from 'yaml';
|
|
58
60
|
|
|
59
61
|
// ESM has no `require`; `createRequire(import.meta.url)` restores it so the
|
|
@@ -264,13 +266,13 @@ function _resolve_user_global_file(): string {
|
|
|
264
266
|
* the user-global file. Adding a key requires an ADR.
|
|
265
267
|
*/
|
|
266
268
|
export const MERGEABLE_KEYS: readonly string[] = [
|
|
267
|
-
// `name
|
|
268
|
-
// `
|
|
269
|
-
//
|
|
270
|
-
//
|
|
271
|
-
//
|
|
272
|
-
//
|
|
273
|
-
//
|
|
269
|
+
// `name` and `ide` are the PRE-MIGRATION spellings. `install.ts` migrates
|
|
270
|
+
// `ide` → `personal.ide`, and this list was never moved with it — so the
|
|
271
|
+
// whitelist named a key the template does not have while the key it does
|
|
272
|
+
// have was filtered out silently (road-to-capability-answerability 4.3,
|
|
273
|
+
// ADR-219). `personal.bot_icon` / `personal.pr_comment_bot_icon` left with
|
|
274
|
+
// the key itself (2026-10-09): a whitelisted key nothing reads would carry a
|
|
275
|
+
// user-global value into a tree that ignores it.
|
|
274
276
|
//
|
|
275
277
|
// Both spellings are listed rather than replaced: a legacy file that still
|
|
276
278
|
// uses the old name keeps working, and nothing that resolved before
|
|
@@ -280,20 +282,12 @@ export const MERGEABLE_KEYS: readonly string[] = [
|
|
|
280
282
|
'ide',
|
|
281
283
|
'personal.ide',
|
|
282
284
|
'rule_loading_tier',
|
|
283
|
-
'memory.cadence',
|
|
284
|
-
'personal.bot_icon',
|
|
285
|
-
'personal.pr_comment_bot_icon',
|
|
286
285
|
'personal.autonomy',
|
|
287
286
|
// Knowledge-card global cross-project sharing is a USER-GLOBAL setting
|
|
288
287
|
// (ADR-100 / road-to-structure-grounding-v2). Whitelisted so the
|
|
289
288
|
// ~/.event4u/agent-config/agent-settings.yml values are honoured.
|
|
290
289
|
'knowledge.global_sharing.enabled',
|
|
291
290
|
'knowledge.global_sharing.allowed_tiers',
|
|
292
|
-
'knowledge.global_sharing.redaction.enabled',
|
|
293
|
-
'knowledge.global_sharing.redaction.halt_on_trigger',
|
|
294
|
-
'knowledge.global_sharing.auto_promote_threshold',
|
|
295
|
-
'knowledge.global_sharing.freshness.hypothesis_after_days',
|
|
296
|
-
'knowledge.global_sharing.freshness.stale_after_days',
|
|
297
291
|
// `design.fidelity_mode` is a per-DEVELOPER working preference, not a
|
|
298
292
|
// per-project one: whether an agent may deviate from a handed-over design
|
|
299
293
|
// is a property of how that person works, and a designer who sets it once
|
|
@@ -322,11 +316,11 @@ export const MERGEABLE_KEYS: readonly string[] = [
|
|
|
322
316
|
const TEMPLATE_RELATIVE = path.join('src', 'config', 'agent-settings.template.yml');
|
|
323
317
|
|
|
324
318
|
/**
|
|
325
|
-
* Package root
|
|
326
|
-
*
|
|
327
|
-
*
|
|
319
|
+
* Package root, anchored on the package marker rather than on hop counts: this
|
|
320
|
+
* module is also inlined into `dist/cli-delegate/`, two levels below the root,
|
|
321
|
+
* where three hops land outside the package and every default is lost.
|
|
328
322
|
*/
|
|
329
|
-
const _PACKAGE_ROOT =
|
|
323
|
+
const _PACKAGE_ROOT = resolvePackageRoot(import.meta.url);
|
|
330
324
|
|
|
331
325
|
/** Default template path — overridable per call for tests. */
|
|
332
326
|
export function default_template_path(): string {
|
|
@@ -975,114 +969,11 @@ export function load_agent_settings(
|
|
|
975
969
|
_deep_merge(merged, layer);
|
|
976
970
|
}
|
|
977
971
|
}
|
|
978
|
-
|
|
972
|
+
warnRemovedKeys(merged);
|
|
979
973
|
return merged;
|
|
980
974
|
}
|
|
981
975
|
|
|
982
976
|
|
|
983
|
-
/**
|
|
984
|
-
* Settings keys this package has DELETED. A leftover value from an older
|
|
985
|
-
* install is ignored — never applied by any reader — and surfaced with ONE
|
|
986
|
-
* deprecation line per key per process run (stderr; the exit code never
|
|
987
|
-
* changes).
|
|
988
|
-
*
|
|
989
|
-
* The map carries a per-key REASON rather than one shared sentence, because
|
|
990
|
-
* the list now spans more than one deletion doctrine and a single blanket
|
|
991
|
-
* phrase would mis-attribute every future entry. A reader who hits the line
|
|
992
|
-
* should learn why the key went, not just that it did.
|
|
993
|
-
*
|
|
994
|
-
* `subagents.*` — the always-on-orchestration doctrine
|
|
995
|
-
* (road-to-always-on-orchestration Phase 1): the layer has no per-layer
|
|
996
|
-
* on/off setting any more. `ai_team.enabled` joined in Step 1.3 — the
|
|
997
|
-
* `/team` family's availability is a codex-CLI/auth FACT
|
|
998
|
-
* (`src/scripts/ai_team/availability.ts`), not a flag; the `ai_team` config
|
|
999
|
-
* loader (`src/scripts/ai_team/config.ts`) separately accepts a leftover
|
|
1000
|
-
* `enabled` key without failing closed, so this warning is the only surfaced
|
|
1001
|
-
* signal of that deletion.
|
|
1002
|
-
*
|
|
1003
|
-
* `hooks.turn_end_gate.*` — the turn-end gate is always armed (2026-08-12).
|
|
1004
|
-
* A default-off safety gate cannot soak, so the switch protecting the soak
|
|
1005
|
-
* made the soak impossible; whether the gate fires is now decided by each
|
|
1006
|
-
* detector's own trigger conditions. See `turn_end_gate_hook.ts` § "Always
|
|
1007
|
-
* armed".
|
|
1008
|
-
*
|
|
1009
|
-
* The five `derivable` leaves below (2026-08-12, road-to-zero-settings Phase
|
|
1010
|
-
* 2.1) are a different case from every entry above them, and the difference is
|
|
1011
|
-
* the whole safety argument: no code path ever *consulted* them. Each appeared
|
|
1012
|
-
* in the template, the schema and the reference page, and several in the setup
|
|
1013
|
-
* wizard, while the decision they looked like they governed was taken
|
|
1014
|
-
* elsewhere. A key nothing reads cannot change a default by leaving — so this
|
|
1015
|
-
* is the one deletion batch that needs no replacement mechanism, only the
|
|
1016
|
-
* per-key statement of what already decides.
|
|
1017
|
-
*
|
|
1018
|
-
* A sixth unread key, `screenshots.data_bearing_gate`, was found in the same
|
|
1019
|
-
* pass and deliberately NOT deleted — it is `consent`, and the open question is
|
|
1020
|
-
* whether the repair is to build its missing reader or to delete a promise a
|
|
1021
|
-
* Hard Floor can never honour. See `settings-classes.md` § The six unread keys.
|
|
1022
|
-
*
|
|
1023
|
-
* `worktrees.mode` (2026-08-13, ADR-229) is a third doctrine again: not
|
|
1024
|
-
* always-on, not unread. It WAS read, and the reader honoured all three values —
|
|
1025
|
-
* the deletion says the decision was never the agent's to make. `ask` bought a
|
|
1026
|
-
* round trip per spawn, `on` let the agent start parallel work unprompted, and
|
|
1027
|
-
* `off` described the wanted behaviour, so `off` became the hardcoded rule and
|
|
1028
|
-
* the switch went. What decides instead is the user's own sentence in the chat.
|
|
1029
|
-
*
|
|
1030
|
-
* Every reason string must name what decides INSTEAD, never just "removed".
|
|
1031
|
-
* Exported so `lint_settings_classes` can check the deletion side of the
|
|
1032
|
-
* surface: a reason that names no replacement, or an entry whose key is live in
|
|
1033
|
-
* the template again, is a contradiction the loader itself cannot notice.
|
|
1034
|
-
*/
|
|
1035
|
-
export const REMOVED_KEYS: ReadonlyMap<string, string> = new Map([
|
|
1036
|
-
['subagents.enabled', 'always-on orchestration'],
|
|
1037
|
-
['subagents.auto', 'always-on orchestration'],
|
|
1038
|
-
['subagents.host_capabilities', 'always-on orchestration'],
|
|
1039
|
-
['subagents.budget_routing', 'always-on orchestration'],
|
|
1040
|
-
['ai_team.enabled', 'always-on orchestration'],
|
|
1041
|
-
['hooks.turn_end_gate.enabled', 'the turn-end gate is always armed'],
|
|
1042
|
-
['hooks.turn_end_gate.promissory', 'the turn-end gate is always armed'],
|
|
1043
|
-
['hooks.turn_end_gate.language', 'the turn-end gate is always armed'],
|
|
1044
|
-
['hooks.turn_end_gate.verification', 'the turn-end gate is always armed'],
|
|
1045
|
-
['telegraph.speak_scope', 'the rule body states its own scope; compile_router gates on telegraph.speak alone'],
|
|
1046
|
-
['chat_history.max_size_kb', 'the rotate command takes --max-kb from argv; session-count pruning bounds the file'],
|
|
1047
|
-
['chat_history.on_overflow', 'the overflow mode comes from the rotate command --mode argv'],
|
|
1048
|
-
['quality.wait_for_remote_ci', 'whether to poll follows from the push plus a detectable remote pipeline'],
|
|
1049
|
-
['legal_review_prep.consented_at', 'the provenance sidecar settings:set writes and consentVerdict reads'],
|
|
1050
|
-
['worktrees.mode', 'the user asking for a worktree in the chat; creation is instruction-only and hardcoded'],
|
|
1051
|
-
]);
|
|
1052
|
-
|
|
1053
|
-
/** Keys already warned about in THIS process — the "once per run" dedupe. */
|
|
1054
|
-
const _warnedRemovedKeys = new Set<string>();
|
|
1055
|
-
|
|
1056
|
-
/** Read one dotted path out of a merged settings tree; `undefined` when absent. */
|
|
1057
|
-
function _readDottedSettingsPath(root: SettingsDict, dotted: string): SettingsValue {
|
|
1058
|
-
let node: SettingsValue = root;
|
|
1059
|
-
for (const part of dotted.split('.')) {
|
|
1060
|
-
if (typeof node !== 'object' || node === null || Array.isArray(node)) {
|
|
1061
|
-
return undefined;
|
|
1062
|
-
}
|
|
1063
|
-
node = (node as SettingsDict)[part];
|
|
1064
|
-
}
|
|
1065
|
-
return node;
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
/**
|
|
1069
|
-
* Warn once per process, on stderr, for every {@link REMOVED_KEYS} entry still
|
|
1070
|
-
* present in a resolved settings tree. Never throws, never changes what the
|
|
1071
|
-
* caller does with `merged` — a pure notification side effect.
|
|
1072
|
-
*/
|
|
1073
|
-
function _warn_removed_always_on_keys(merged: SettingsDict): void {
|
|
1074
|
-
for (const [key, reason] of REMOVED_KEYS) {
|
|
1075
|
-
if (_warnedRemovedKeys.has(key)) {
|
|
1076
|
-
continue;
|
|
1077
|
-
}
|
|
1078
|
-
if (_readDottedSettingsPath(merged, key) === undefined) {
|
|
1079
|
-
continue;
|
|
1080
|
-
}
|
|
1081
|
-
_warnedRemovedKeys.add(key);
|
|
1082
|
-
process.stderr.write(`${key} was removed (${reason}); ignored.\n`);
|
|
1083
|
-
}
|
|
1084
|
-
}
|
|
1085
|
-
|
|
1086
977
|
/**
|
|
1087
978
|
* Return the merged `modules:` configuration with defaults applied.
|
|
1088
979
|
*
|
|
@@ -50,7 +50,7 @@ export interface BlockedByMarker {
|
|
|
50
50
|
* unreadable, which is a migration, not a fix.
|
|
51
51
|
*/
|
|
52
52
|
export const BLOCKED_BY_MARKER_RE =
|
|
53
|
-
/<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+)[ \t]*(?:\|[ \t]*asked:[ \t]*(yes|no)[ \t]*(?:[—-][ \t]*([^>]*?))?[ \t]*)?-->/i;
|
|
53
|
+
/<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+(?:#[a-z0-9-]+)?)[ \t]*(?:\|[ \t]*asked:[ \t]*(yes|no)[ \t]*(?:[—-][ \t]*([^>]*?))?[ \t]*)?-->/i;
|
|
54
54
|
|
|
55
55
|
/** Parse one marker, or `null` when the text carries none. */
|
|
56
56
|
export function parseBlockedByMarker(text: string): BlockedByMarker | null {
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
* as "project instructions", never having consulted the router.
|
|
15
15
|
*
|
|
16
16
|
* Two surfaces, one switch. Sharing the definition is what lets the projector honour
|
|
17
|
-
* it, so
|
|
18
|
-
*
|
|
17
|
+
* it, so dormancy means what the ADR assumed instead of the ADR being weakened to
|
|
18
|
+
* match a partial implementation.
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
/**
|
|
@@ -51,25 +51,16 @@ export type ToggleSettings = Record<string, unknown>;
|
|
|
51
51
|
/** rule-id → predicate. A rule is emitted (router AND projection) only when its
|
|
52
52
|
* predicate returns true. A rule absent from this map is always emitted. */
|
|
53
53
|
export const COMPILE_TIME_TOGGLES: Record<string, (s: ToggleSettings) => boolean> = {
|
|
54
|
-
// `speak`
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
|
|
64
|
-
// removes the rule's ~982-token body from the router and the projection. A knob
|
|
65
|
-
// that merely narrowed the grammar at runtime would leave the token cost in place
|
|
66
|
-
// — the trap the measurement exposed.
|
|
67
|
-
'telegraph-speak': (s: ToggleSettings): boolean => {
|
|
68
|
-
const tg = (s['telegraph'] as ToggleSettings | undefined) ?? {};
|
|
69
|
-
const enabled = tg['enabled'] === undefined ? true : tg['enabled'];
|
|
70
|
-
const speak = tg['speak'] === undefined ? false : tg['speak'];
|
|
71
|
-
return Boolean(enabled) && Boolean(speak);
|
|
72
|
-
},
|
|
54
|
+
// DORMANT, unconditionally. `speak` defaulted FALSE per docs/adrs/telegraph/0002
|
|
55
|
+
// (measured basis: median vs_terse −9.27% API / −5.47% exact cl100k_base —
|
|
56
|
+
// telegraph emits MORE than a plain "be terse"), and on 2026-10-09 the
|
|
57
|
+
// `telegraph.speak` key was retired with that default as the fixed value
|
|
58
|
+
// (road-to-settings-classes-derivable-surface-stagnation Phase 2.1). Whether
|
|
59
|
+
// the rule ships is the kill-criterion bench verdict, a package-level decision
|
|
60
|
+
// rather than a per-install one, so re-enabling it is a change to this
|
|
61
|
+
// predicate, made when an output-side bench clears the bar — never a setting.
|
|
62
|
+
// A leftover `telegraph.speak: true` is warned about by the loader and ignored.
|
|
63
|
+
'telegraph-speak': (): boolean => false,
|
|
73
64
|
};
|
|
74
65
|
|
|
75
66
|
/** True when the rule may be emitted. Unknown ids are always emitted — the map is an
|