@event4u/agent-config 16.3.0 → 16.5.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 +178 -78
- 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/design.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/design-antipatterns.md +1 -1
- 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 +14 -48
- 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/accessibility-auditor/data/aria-patterns.csv +2 -0
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
- 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/canvas-design/SKILL.md +4 -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-intelligence/references/integration-mapping.md +13 -10
- 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/fe-design/references/design-patterns.md +49 -2
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +9 -0
- 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 +4 -2
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +16 -5
- package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
- package/dist/agent-src/skills/logo-generation/SKILL.md +12 -8
- 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/svg-authoring/SKILL.md +318 -0
- 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/skills/wireframe/SKILL.md +5 -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/commands/uiRender.js +201 -4
- package/dist/cli/commands/uiRenderAsset.js +1308 -0
- package/dist/cli/commands/uiRenderAssetCompare.js +752 -0
- package/dist/cli/commands/uiRenderAssetGrid.js +265 -0
- package/dist/cli/commands/uiRenderAssetGrounds.js +323 -0
- package/dist/cli/commands/uiRenderAssetIsolation.js +85 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +145 -0
- package/dist/cli/main.js +47 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli-delegate/check_update_banner.js +195 -119
- package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-4DBG5K7M.js} +5 -5
- 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-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-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-NQ7WT43P.js → chunk-TMWYUOK4.js} +75 -12
- 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 +489 -238
- 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 +171 -107
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +7 -7
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +41 -22
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -11
- package/dist/hooks/dispatch.js +2520 -1924
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/svg_rules.chunk.cjs +1626 -0
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -0
- 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 +3063 -2160
- 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/scan_scope.js +105 -0
- package/dist/scripts/_lib/settings_removed_keys.js +168 -0
- package/dist/scripts/_lib/svg_dom.js +284 -0
- package/dist/scripts/_lib/svg_geometry.js +477 -0
- package/dist/scripts/_lib/svg_motion.js +179 -0
- package/dist/scripts/_lib/svg_rules.js +1337 -0
- package/dist/scripts/_lib/svg_urls.js +67 -0
- package/dist/scripts/_lib/thin_rules.js +80 -3
- package/dist/scripts/lint_svg_asset.js +324 -0
- 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/design-antipatterns.md +1 -1
- package/docs/guidelines/php/git.md +15 -2
- package/package.json +4 -3
- 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 +56 -16
- 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 +55 -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/svg_dom.ts +318 -0
- package/src/scripts/_lib/svg_geometry.ts +480 -0
- package/src/scripts/_lib/svg_motion.ts +208 -0
- package/src/scripts/_lib/svg_rules.ts +1453 -0
- package/src/scripts/_lib/svg_urls.ts +72 -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/verification_command.ts +59 -0
- package/src/scripts/_lib/verify_clause.ts +27 -17
- 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/block_speaking_inbox_dir.ts +16 -1
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
- package/src/scripts/hooks/design_pass_hook.ts +157 -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/svg_obligation.ts +497 -0
- package/src/scripts/hooks/svg_rules_loader.ts +133 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
- package/src/scripts/hooks/turn_end_gate_hook.ts +6 -3
- 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_consolidation_lineage.ts +6 -3
- package/src/scripts/lint_design_quality.ts +60 -12
- package/src/scripts/lint_evidence_artifacts.ts +9 -0
- package/src/scripts/lint_hook_concern_budget.ts +10 -21
- package/src/scripts/lint_motion_authority_drift.ts +27 -0
- 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_svg_asset.ts +365 -0
- 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
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Read `commands.suggestion
|
|
2
|
+
* Read `commands.suggestion.blocklist` from `.agent-settings.yml` into `Settings`.
|
|
3
3
|
*
|
|
4
4
|
* Ported from the retired Python `src/scripts/command_suggester/settings.py`
|
|
5
5
|
* (ADR-200 py2ts). Mirror of the chat-history pattern:
|
|
6
6
|
*
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
9
|
-
* `
|
|
7
|
+
* - The blocklist is the only suggestion key a project still sets. The
|
|
8
|
+
* master switch, floor, cooldown and option cap are engine constants in
|
|
9
|
+
* `Settings`: their keys were retired with those defaults as the fixed
|
|
10
|
+
* behavior, so a leftover value is warned about by the loader and never
|
|
11
|
+
* read here.
|
|
10
12
|
* - Malformed YAML / unreadable file → defaults; the suggester degrades
|
|
11
13
|
* silently rather than crashing the turn.
|
|
12
|
-
* -
|
|
13
|
-
* non-negative, blocklist forced to an array of strings).
|
|
14
|
+
* - The blocklist is forced to an array of non-empty strings.
|
|
14
15
|
*
|
|
15
16
|
* The Python module reads the YAML via the shared `agent_settings`
|
|
16
17
|
* loader; this twin delegates to the ported `agent_settings.ts`.
|
|
@@ -61,54 +62,7 @@ function _read_section(path: string): Record<string, unknown> | null {
|
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
function _settings_from_raw(raw: Record<string, unknown>): Settings {
|
|
64
|
-
return new Settings({
|
|
65
|
-
enabled: _coerce_bool(raw.enabled, _DEFAULT.enabled),
|
|
66
|
-
confidence_floor: _coerce_floor(raw.confidence_floor, _DEFAULT.confidence_floor),
|
|
67
|
-
cooldown_seconds: _coerce_nonneg_int(raw.cooldown_seconds, _DEFAULT.cooldown_seconds),
|
|
68
|
-
max_options: _coerce_nonneg_int(raw.max_options, _DEFAULT.max_options),
|
|
69
|
-
blocklist: _coerce_str_tuple(raw.blocklist),
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function _coerce_bool(value: unknown, defaultValue: boolean): boolean {
|
|
74
|
-
if (typeof value === 'boolean') {
|
|
75
|
-
return value;
|
|
76
|
-
}
|
|
77
|
-
if (value === null || value === undefined) {
|
|
78
|
-
return defaultValue;
|
|
79
|
-
}
|
|
80
|
-
if (typeof value === 'string') {
|
|
81
|
-
const s = value.trim().toLowerCase();
|
|
82
|
-
if (['true', 'yes', 'on', '1'].includes(s)) {
|
|
83
|
-
return true;
|
|
84
|
-
}
|
|
85
|
-
if (['false', 'no', 'off', '0'].includes(s)) {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return defaultValue;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function _coerce_floor(value: unknown, defaultValue: number): number {
|
|
93
|
-
const f = _pyFloat(value);
|
|
94
|
-
if (f === null) {
|
|
95
|
-
return defaultValue;
|
|
96
|
-
}
|
|
97
|
-
if (f < 0.0) {
|
|
98
|
-
return 0.0;
|
|
99
|
-
}
|
|
100
|
-
if (f > 1.0) {
|
|
101
|
-
return 1.0;
|
|
102
|
-
}
|
|
103
|
-
return f;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function _coerce_nonneg_int(value: unknown, defaultValue: number): number {
|
|
107
|
-
const i = _pyInt(value);
|
|
108
|
-
if (i === null) {
|
|
109
|
-
return defaultValue;
|
|
110
|
-
}
|
|
111
|
-
return i >= 0 ? i : defaultValue;
|
|
65
|
+
return new Settings({ blocklist: _coerce_str_tuple(raw.blocklist) });
|
|
112
66
|
}
|
|
113
67
|
|
|
114
68
|
function _coerce_str_tuple(value: unknown): string[] {
|
|
@@ -127,60 +81,6 @@ function _coerce_str_tuple(value: unknown): string[] {
|
|
|
127
81
|
return out;
|
|
128
82
|
}
|
|
129
83
|
|
|
130
|
-
/**
|
|
131
|
-
* Mirror of Python `float(value)`, returning null where Python raises
|
|
132
|
-
* `TypeError` / `ValueError` (the coercion catches those and falls
|
|
133
|
-
* back to the default).
|
|
134
|
-
*/
|
|
135
|
-
function _pyFloat(value: unknown): number | null {
|
|
136
|
-
if (typeof value === 'boolean') {
|
|
137
|
-
return value ? 1.0 : 0.0;
|
|
138
|
-
}
|
|
139
|
-
if (typeof value === 'number') {
|
|
140
|
-
return value;
|
|
141
|
-
}
|
|
142
|
-
if (typeof value === 'string') {
|
|
143
|
-
const s = value.trim();
|
|
144
|
-
if (s === '') {
|
|
145
|
-
return null;
|
|
146
|
-
}
|
|
147
|
-
const n = Number(s);
|
|
148
|
-
return Number.isNaN(n) ? null : n;
|
|
149
|
-
}
|
|
150
|
-
return null;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Mirror of Python `int(value)` for the YAML scalar types, returning
|
|
155
|
-
* null where Python raises.
|
|
156
|
-
*
|
|
157
|
-
* - bool → 1 / 0.
|
|
158
|
-
* - int → itself.
|
|
159
|
-
* - float → truncated toward zero (Python `int(3.9) == 3`).
|
|
160
|
-
* - string → `int(str, 10)` semantics: an optional sign + digits,
|
|
161
|
-
* surrounding whitespace allowed; a float-shaped string raises in
|
|
162
|
-
* Python, so it maps to null.
|
|
163
|
-
*/
|
|
164
|
-
function _pyInt(value: unknown): number | null {
|
|
165
|
-
if (typeof value === 'boolean') {
|
|
166
|
-
return value ? 1 : 0;
|
|
167
|
-
}
|
|
168
|
-
if (typeof value === 'number') {
|
|
169
|
-
if (Number.isNaN(value) || !Number.isFinite(value)) {
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
return Math.trunc(value);
|
|
173
|
-
}
|
|
174
|
-
if (typeof value === 'string') {
|
|
175
|
-
const s = value.trim();
|
|
176
|
-
if (!/^[+-]?\d+$/.test(s)) {
|
|
177
|
-
return null;
|
|
178
|
-
}
|
|
179
|
-
return parseInt(s, 10);
|
|
180
|
-
}
|
|
181
|
-
return null;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
84
|
function _isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
185
85
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
186
86
|
}
|
|
@@ -98,11 +98,10 @@ export class Match {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* Per-command frontmatter values override the
|
|
105
|
-
* cooldown.
|
|
101
|
+
* Engine knobs. Only `blocklist` comes from `.agent-settings.yml`; the
|
|
102
|
+
* other four are fixed defaults (their settings keys were retired), still
|
|
103
|
+
* overridable by a caller that constructs `Settings` directly.
|
|
104
|
+
* Per-command frontmatter values override the floor / cooldown.
|
|
106
105
|
*
|
|
107
106
|
* Mirrors `@dataclass(frozen=True)`. The Python default `blocklist`
|
|
108
107
|
* is an empty tuple; here it is a readonly string array, canonicalized
|
|
@@ -515,6 +515,107 @@ function legProjections(ctx: Ctx): string {
|
|
|
515
515
|
return 'cursor + windsurf + claude projection trees present in global scope';
|
|
516
516
|
}
|
|
517
517
|
|
|
518
|
+
// ── git-convention leg ─────────────────────────────────────────────
|
|
519
|
+
//
|
|
520
|
+
// A consumer project has neither `scripts-run` nor `node_modules`, so the only
|
|
521
|
+
// code an installed command can reach is the `agent-config` binary. `/pr:merge`
|
|
522
|
+
// reads the update strategy through `git:convention show`; this leg runs that
|
|
523
|
+
// verb from the packed install in a repository that commits a
|
|
524
|
+
// `.git-convention.yml` and pushes it to an `origin`, so the strategy resolves
|
|
525
|
+
// at a real target commit.
|
|
526
|
+
|
|
527
|
+
const GIT_CONVENTION_CARRIER = 'git:\n commit_format: ticket-conventional\n update_strategy: rebase\n';
|
|
528
|
+
|
|
529
|
+
/** The verdict on `git:convention show --json`; throws with the reason on any miss. */
|
|
530
|
+
export function checkGitConventionShow(status: number, stdout: string, stderr = ''): string {
|
|
531
|
+
if (status !== 0) throw new Error(`git:convention show exit ${status}: ${(stdout + stderr).slice(-400)}`);
|
|
532
|
+
let parsed: { keys?: Record<string, { value?: unknown; state?: unknown; source?: unknown }> };
|
|
533
|
+
try {
|
|
534
|
+
parsed = JSON.parse(stdout) as typeof parsed;
|
|
535
|
+
} catch {
|
|
536
|
+
throw new Error(`git:convention show --json printed output that is not JSON: ${stdout.slice(0, 200)}`);
|
|
537
|
+
}
|
|
538
|
+
const expected: Record<string, string> = { commit_format: 'ticket-conventional', update_strategy: 'rebase' };
|
|
539
|
+
for (const [key, value] of Object.entries(expected)) {
|
|
540
|
+
const r = parsed.keys?.[key];
|
|
541
|
+
const fromCarrier = typeof r?.source === 'string' && r.source.includes('.git-convention.yml');
|
|
542
|
+
if (r?.value !== value || r.state !== 'valid' || !fromCarrier) {
|
|
543
|
+
throw new Error(`git.${key} did not resolve from the committed carrier: ${JSON.stringify(r ?? null)}`);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return 'commit_format=ticket-conventional, update_strategy=rebase, both from the committed .git-convention.yml';
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* The verdict on `git:convention subject` from the packed install: a valid
|
|
551
|
+
* subject resolves (exit 0), and a ticket inside a compound scope is rejected
|
|
552
|
+
* (exit 1) under the committed `ticket-conventional`.
|
|
553
|
+
*/
|
|
554
|
+
export function checkGitConventionSubject(
|
|
555
|
+
valid: { status: number; stdout: string; stderr?: string },
|
|
556
|
+
compound: { status: number; stdout: string; stderr?: string },
|
|
557
|
+
): string {
|
|
558
|
+
if (valid.status !== 0) {
|
|
559
|
+
throw new Error(`git:convention subject rejected a valid subject, exit ${valid.status}: ${(valid.stdout + (valid.stderr ?? '')).slice(-400)}`);
|
|
560
|
+
}
|
|
561
|
+
if (compound.status !== 1 || !compound.stdout.includes('inside the scope')) {
|
|
562
|
+
throw new Error(`git:convention subject did not reject a ticket inside a compound scope, exit ${compound.status}: ${compound.stdout.slice(-400)}`);
|
|
563
|
+
}
|
|
564
|
+
return 'a valid subject resolves; a ticket inside a compound scope is rejected';
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* The verdict on `git:convention sync` from the packed install: the update
|
|
569
|
+
* `/pr:merge` § 2 runs. A current branch exits 0; a behind one is refused with
|
|
570
|
+
* exit 3 under the committed `rebase`, never merged.
|
|
571
|
+
*/
|
|
572
|
+
export function checkGitConventionSync(
|
|
573
|
+
current: { status: number; stdout: string; stderr?: string },
|
|
574
|
+
behind: { status: number; stdout: string; stderr?: string },
|
|
575
|
+
): string {
|
|
576
|
+
if (current.status !== 0) {
|
|
577
|
+
throw new Error(`git:convention sync did not pass a current branch, exit ${current.status}: ${(current.stdout + (current.stderr ?? '')).slice(-400)}`);
|
|
578
|
+
}
|
|
579
|
+
if (behind.status !== 3 || !behind.stdout.includes('git.update_strategy is `rebase`')) {
|
|
580
|
+
throw new Error(`git:convention sync did not refuse a behind branch under rebase, exit ${behind.status}: ${behind.stdout.slice(-400)}`);
|
|
581
|
+
}
|
|
582
|
+
return 'sync passes a current branch and refuses a behind one with exit 3';
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
function legGitConvention(ctx: Ctx): string {
|
|
586
|
+
const env = binEnv(ctx);
|
|
587
|
+
const remote = path.join(ctx.tmpRoot, 'git-convention-origin.git');
|
|
588
|
+
const repo = path.join(ctx.tmpRoot, 'git-convention-project');
|
|
589
|
+
const git = (cwd: string, ...args: string[]): void => {
|
|
590
|
+
const r = run('git', ['-c', 'user.name=matrix', '-c', 'user.email=matrix@example.com', '-c', 'commit.gpgsign=false', ...args], {
|
|
591
|
+
cwd,
|
|
592
|
+
env,
|
|
593
|
+
});
|
|
594
|
+
if (r.status !== 0) throw new Error(`git ${args[0] ?? ''} failed: ${r.stderr.slice(-300)}`);
|
|
595
|
+
};
|
|
596
|
+
git(ctx.tmpRoot, 'init', '-q', '--bare', '-b', 'main', remote);
|
|
597
|
+
git(ctx.tmpRoot, 'init', '-q', '-b', 'main', repo);
|
|
598
|
+
fs.writeFileSync(path.join(repo, '.git-convention.yml'), GIT_CONVENTION_CARRIER);
|
|
599
|
+
git(repo, 'add', '.git-convention.yml');
|
|
600
|
+
git(repo, 'commit', '-q', '-m', 'declare the git convention');
|
|
601
|
+
git(repo, 'remote', 'add', 'origin', remote);
|
|
602
|
+
git(repo, 'push', '-q', '-u', 'origin', 'main');
|
|
603
|
+
const r = run(ctx.bin, ['git:convention', 'show', '--json', '--base', 'origin/main'], { cwd: repo, env });
|
|
604
|
+
const shown = checkGitConventionShow(r.status, r.stdout, r.stderr);
|
|
605
|
+
const subject = (line: string) => run(ctx.bin, ['git:convention', 'subject'], { cwd: repo, env, input: `${line}\n` });
|
|
606
|
+
const subjects = checkGitConventionSubject(subject('DEV-1 feat(api): add x'), subject('DEV-1 feat(api,DEV-1): add x'));
|
|
607
|
+
const sync = () => run(ctx.bin, ['git:convention', 'sync', '--base', 'origin/main'], { cwd: repo, env });
|
|
608
|
+
git(repo, 'switch', '-q', '-c', 'feature');
|
|
609
|
+
const current = sync();
|
|
610
|
+
git(repo, 'switch', '-q', 'main');
|
|
611
|
+
fs.writeFileSync(path.join(repo, 'advance.txt'), 'advance\n');
|
|
612
|
+
git(repo, 'add', 'advance.txt');
|
|
613
|
+
git(repo, 'commit', '-q', '-m', 'advance main');
|
|
614
|
+
git(repo, 'push', '-q', 'origin', 'main');
|
|
615
|
+
git(repo, 'switch', '-q', 'feature');
|
|
616
|
+
return `${shown}; ${subjects}; ${checkGitConventionSync(current, sync())}`;
|
|
617
|
+
}
|
|
618
|
+
|
|
518
619
|
function legUninstall(ctx: Ctx): string {
|
|
519
620
|
const r = run(ctx.bin, ['uninstall', '--global', '--tools=claude-code,cursor,windsurf', '--force'], {
|
|
520
621
|
cwd: ctx.projectDir,
|
|
@@ -570,6 +671,7 @@ const LEGS: Array<{ name: string; fn: (ctx: Ctx) => string | Promise<string> }>
|
|
|
570
671
|
{ name: 'hooks', fn: legHooks },
|
|
571
672
|
{ name: 'hook-lifecycle', fn: legHookLifecycle },
|
|
572
673
|
{ name: 'projections', fn: legProjections },
|
|
674
|
+
{ name: 'git-convention', fn: legGitConvention },
|
|
573
675
|
{ name: 'uninstall', fn: legUninstall },
|
|
574
676
|
{ name: 'upgrade', fn: legUpgrade },
|
|
575
677
|
];
|
|
@@ -7,21 +7,25 @@
|
|
|
7
7
|
* module exactly (snake_case kept deliberately — fidelity over TS idiom).
|
|
8
8
|
*
|
|
9
9
|
* Maintains a deterministic state file the rule body cites for the
|
|
10
|
-
* freshness threshold
|
|
11
|
-
*
|
|
12
|
-
* before responding".
|
|
10
|
+
* freshness threshold and the 3-failure stop. The agent's job shrinks from
|
|
11
|
+
* "remember counters" to "read this file before responding".
|
|
13
12
|
*
|
|
14
13
|
* Output: `agents/state/context-hygiene.json`
|
|
15
14
|
* {
|
|
16
15
|
* "tool_calls": <int>, // running PostToolUse count
|
|
17
|
-
* "consecutive_same_tool": <int>, // includes the latest call
|
|
18
|
-
* "last_tool": "<name>",
|
|
19
16
|
* "tool_history": [..., last 5 names],
|
|
20
|
-
* "loop_detected": <bool>, // ≥ 3 same tool in a row
|
|
21
17
|
* "freshness_threshold": <int|null>, // 20/40/60 milestone hit
|
|
22
18
|
* "checked_at": "<iso8601>"
|
|
23
19
|
* }
|
|
24
20
|
*
|
|
21
|
+
* No same-tool-repeat ("loop") field: a same-tool-name counter fires on
|
|
22
|
+
* ordinary, non-looping work (an enumerated sweep over distinct targets
|
|
23
|
+
* calls the same tool repeatedly by design — the rule's own text says
|
|
24
|
+
* "'similar parameters' is the load-bearing word"), reaches no model (its
|
|
25
|
+
* only emission was a verbose stderr line), and had two readers, one of
|
|
26
|
+
* which read a path nothing wrote. Removed rather than repaired —
|
|
27
|
+
* road-to-signals-that-mean-what-they-say D1.
|
|
28
|
+
*
|
|
25
29
|
* Exit code is always 0.
|
|
26
30
|
*
|
|
27
31
|
* CLI:
|
|
@@ -33,8 +37,9 @@ import path from "node:path";
|
|
|
33
37
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
34
38
|
|
|
35
39
|
// Re-use the shared atomic-write helper so concerns honour the single
|
|
36
|
-
// `agents/
|
|
37
|
-
//
|
|
40
|
+
// `agents/state/.dispatcher.lock` discipline (hook-architecture-v1.md,
|
|
41
|
+
// Concurrency, Phase 7.4) — the lock sits beside THIS hook's own target, not
|
|
42
|
+
// the fixed `agents/runtime/state/` path the discipline cites generally.
|
|
38
43
|
import { atomic_write_json } from "./hooks/state_io.js";
|
|
39
44
|
import { readHookStdin } from "./hooks/hook_stdin.js";
|
|
40
45
|
|
|
@@ -45,7 +50,6 @@ import { readHookStdin } from "./hooks/hook_stdin.js";
|
|
|
45
50
|
export const STATE_DIR = path.join("agents", "state");
|
|
46
51
|
export const STATE_FILE = path.join(STATE_DIR, "context-hygiene.json");
|
|
47
52
|
|
|
48
|
-
export const LOOP_THRESHOLD = 3; // 3+ consecutive same-tool calls
|
|
49
53
|
export const HISTORY_DEPTH = 5;
|
|
50
54
|
export const FRESHNESS_MILESTONES = [20, 40, 60] as const;
|
|
51
55
|
|
|
@@ -56,10 +60,7 @@ type StateDict = Record<string, unknown>;
|
|
|
56
60
|
function _empty_state(): StateDict {
|
|
57
61
|
return {
|
|
58
62
|
tool_calls: 0,
|
|
59
|
-
consecutive_same_tool: 0,
|
|
60
|
-
last_tool: null,
|
|
61
63
|
tool_history: [],
|
|
62
|
-
loop_detected: false,
|
|
63
64
|
freshness_threshold: null,
|
|
64
65
|
};
|
|
65
66
|
}
|
|
@@ -134,14 +135,6 @@ function _update(state: StateDict, tool: string | null): StateDict {
|
|
|
134
135
|
const curr_count = prev_count + 1;
|
|
135
136
|
state["tool_calls"] = curr_count;
|
|
136
137
|
|
|
137
|
-
const last = state["last_tool"];
|
|
138
|
-
if (last === tool) {
|
|
139
|
-
state["consecutive_same_tool"] = _asInt(state["consecutive_same_tool"]) + 1;
|
|
140
|
-
} else {
|
|
141
|
-
state["consecutive_same_tool"] = 1;
|
|
142
|
-
}
|
|
143
|
-
state["last_tool"] = tool;
|
|
144
|
-
|
|
145
138
|
let hist = state["tool_history"];
|
|
146
139
|
if (!Array.isArray(hist)) {
|
|
147
140
|
hist = [];
|
|
@@ -149,8 +142,6 @@ function _update(state: StateDict, tool: string | null): StateDict {
|
|
|
149
142
|
(hist as unknown[]).push(tool);
|
|
150
143
|
state["tool_history"] = (hist as unknown[]).slice(-HISTORY_DEPTH);
|
|
151
144
|
|
|
152
|
-
state["loop_detected"] = _asInt(state["consecutive_same_tool"]) >= LOOP_THRESHOLD;
|
|
153
|
-
|
|
154
145
|
const ms = _milestone_hit(prev_count, curr_count);
|
|
155
146
|
if (ms !== null) {
|
|
156
147
|
state["freshness_threshold"] = ms;
|
|
@@ -211,7 +202,6 @@ export function run(
|
|
|
211
202
|
if (verbose) {
|
|
212
203
|
process.stderr.write(
|
|
213
204
|
`context-hygiene-hook: tool_calls=${pyRepr(state["tool_calls"])} ` +
|
|
214
|
-
`loop=${pyRepr(state["loop_detected"])} ` +
|
|
215
205
|
`threshold=${pyRepr(state["freshness_threshold"])}\n`,
|
|
216
206
|
);
|
|
217
207
|
}
|
|
@@ -11,12 +11,23 @@
|
|
|
11
11
|
// turn: `task cost:preflight` or `node scripts/cost/preflight.mjs`.
|
|
12
12
|
|
|
13
13
|
import { spawnSync } from 'node:child_process';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { dirname, join } from 'node:path';
|
|
14
16
|
|
|
15
17
|
const QUIET = process.env.PREFLIGHT_QUIET === '1';
|
|
16
18
|
|
|
19
|
+
// budget.mjs is this file's SIBLING, so resolve it from here rather than from
|
|
20
|
+
// the working directory. A cwd-relative 'scripts/cost/budget.mjs' resolved to
|
|
21
|
+
// nothing in this tree (the scripts live under src/scripts/), spawnSync
|
|
22
|
+
// returned empty stdout, and empty stdout is read below as "no budget
|
|
23
|
+
// configured" — so the hard stop silently exited 0 on a spent budget from
|
|
24
|
+
// every working directory. Sibling resolution also survives the consumer
|
|
25
|
+
// install, where the pair lands under a different prefix together.
|
|
26
|
+
const BUDGET_SCRIPT = join(dirname(fileURLToPath(import.meta.url)), 'budget.mjs');
|
|
27
|
+
|
|
17
28
|
function runBudgetCheck() {
|
|
18
29
|
const env = { ...process.env, BUDGET_QUIET: '1' };
|
|
19
|
-
const r = spawnSync('node', [
|
|
30
|
+
const r = spawnSync('node', [BUDGET_SCRIPT, 'check'], { env, encoding: 'utf-8' });
|
|
20
31
|
if (r.error) return { ok: false, fatal: true, msg: String(r.error) };
|
|
21
32
|
const out = (r.stdout || '').trim();
|
|
22
33
|
if (!out) return { ok: true, unbudgeted: true };
|
|
@@ -2127,7 +2127,7 @@ function _ljust(s: string, width: number): string {
|
|
|
2127
2127
|
|
|
2128
2128
|
function _debate_refusal_cap(ai_cfg: Dict): number {
|
|
2129
2129
|
const debate_block = (ai_cfg['debate'] as Dict) || {};
|
|
2130
|
-
return _pyFloat(debate_block['max_cost_usd'] ??
|
|
2130
|
+
return _pyFloat(debate_block['max_cost_usd'] ?? 0.0, 0.0) || 0.0; // 0 = no cap (ADR-279)
|
|
2131
2131
|
}
|
|
2132
2132
|
|
|
2133
2133
|
function _emit_shadow_slo_banner(): void {
|
|
@@ -2560,9 +2560,9 @@ function cmd_run(
|
|
|
2560
2560
|
|
|
2561
2561
|
const cost_cfg = (ai_cfg['cost_budget'] as Dict) || {};
|
|
2562
2562
|
const budget = new CostBudget({
|
|
2563
|
-
max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ??
|
|
2564
|
-
max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ??
|
|
2565
|
-
max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10),
|
|
2563
|
+
max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
|
|
2564
|
+
max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
|
|
2565
|
+
max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10), // a call count, not money — kept
|
|
2566
2566
|
max_total_usd: _pyFloat(cost_cfg['max_total_usd'] ?? 0.0, 0.0) || 0.0,
|
|
2567
2567
|
// Rolling 24h cap. Unwired until now: the field existed on CostBudget and
|
|
2568
2568
|
// gated the spend-ledger append, but no caller ever passed it, so the
|
|
@@ -3076,9 +3076,9 @@ function cmd_debate(
|
|
|
3076
3076
|
|
|
3077
3077
|
const cost_cfg = (ai_cfg['cost_budget'] as Dict) || {};
|
|
3078
3078
|
const budget = new CostBudget({
|
|
3079
|
-
max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ??
|
|
3080
|
-
max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ??
|
|
3081
|
-
max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10),
|
|
3079
|
+
max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
|
|
3080
|
+
max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
|
|
3081
|
+
max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10), // a call count, not money — kept
|
|
3082
3082
|
max_total_usd: _pyFloat(cost_cfg['max_total_usd'] ?? 0.0, 0.0) || 0.0,
|
|
3083
3083
|
// Rolling 24h cap. Unwired until now: the field existed on CostBudget and
|
|
3084
3084
|
// gated the spend-ledger append, but no caller ever passed it, so the
|
|
@@ -738,6 +738,29 @@ export const RETURN_ENVELOPE_POINTER =
|
|
|
738
738
|
'write-to-disk-first rule: contexts/execution/subagent-response-contract.md. ' +
|
|
739
739
|
'The findings table stays a file.';
|
|
740
740
|
|
|
741
|
+
/**
|
|
742
|
+
* Two-line header prepended, verbatim and at byte offset 0, to every
|
|
743
|
+
* `<slug>.review-input/roadmap.md` snapshot this dispatcher writes.
|
|
744
|
+
*
|
|
745
|
+
* Its NAMED job is `check_references`'s file-level skip marker
|
|
746
|
+
* (`check_references.ts` `FILE_SKIP_MARKER`): the snapshot sits under a
|
|
747
|
+
* tree that gate walks, while the LIVE roadmap layer is deliberately
|
|
748
|
+
* excluded from it — so a roadmap that legitimately quotes a nonexistent
|
|
749
|
+
* path (e.g. documenting a hallucinated council citation) would red CI
|
|
750
|
+
* through its own review snapshot.
|
|
751
|
+
*
|
|
752
|
+
* That is its only job. It used to carry a second, unnamed one — pushing the
|
|
753
|
+
* frontmatter fence off byte offset 0 kept `check_agent_artifact_location`
|
|
754
|
+
* from reading the snapshot as a misplaced roadmap. That gate now exempts the
|
|
755
|
+
* snapshot path by name (`isReviewInputRoadmapSnapshot`), so this header may
|
|
756
|
+
* change without that gate noticing. Tested in
|
|
757
|
+
* `check_agent_artifact_location.test.ts` (describe: "review-input snapshot
|
|
758
|
+
* convention").
|
|
759
|
+
*/
|
|
760
|
+
export const REVIEW_INPUT_ROADMAP_HEADER =
|
|
761
|
+
'<!-- check-refs: skip -->\n' +
|
|
762
|
+
'<!-- verbatim roadmap snapshot for the R2 reviewer; the live roadmap layer is excluded from check_references, and a snapshot must not fail a gate its source is exempt from -->\n';
|
|
763
|
+
|
|
741
764
|
function reviewerPrompt(args: {
|
|
742
765
|
slug: string;
|
|
743
766
|
headSha: string;
|
|
@@ -1288,19 +1311,9 @@ function runDispatch(args: Args): number {
|
|
|
1288
1311
|
|
|
1289
1312
|
redactions += writeRedacted(path.join(inputDirAbs, 'diff.patch'), scopeDiffText, denyPatterns);
|
|
1290
1313
|
if (roadmapText !== null) {
|
|
1291
|
-
// The snapshot lands under agents/evidence/, which check_references
|
|
1292
|
-
// walks, while the live roadmap layer is deliberately excluded from
|
|
1293
|
-
// that gate — so a roadmap that legitimately quotes a nonexistent
|
|
1294
|
-
// path (e.g. documenting a hallucinated council citation) would red
|
|
1295
|
-
// CI through its own review snapshot. The header exemption keeps the
|
|
1296
|
-
// snapshot verbatim below the marker; roadmap_hash binds the LIVE
|
|
1297
|
-
// file and is unaffected. Found by the zcs-close CI run, 2026-08-09.
|
|
1298
|
-
const snapshotHeader =
|
|
1299
|
-
'<!-- check-refs: skip -->\n' +
|
|
1300
|
-
'<!-- verbatim roadmap snapshot for the R2 reviewer; the live roadmap layer is excluded from check_references, and a snapshot must not fail a gate its source is exempt from -->\n';
|
|
1301
1314
|
redactions += writeRedacted(
|
|
1302
1315
|
path.join(inputDirAbs, 'roadmap.md'),
|
|
1303
|
-
|
|
1316
|
+
REVIEW_INPUT_ROADMAP_HEADER + roadmapText,
|
|
1304
1317
|
denyPatterns,
|
|
1305
1318
|
);
|
|
1306
1319
|
}
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* honest "no telemetry record" line, never a fabricated estimate.
|
|
28
28
|
* Sources: `_lib/judgment_ladder.ts::explainLadder` + the same
|
|
29
29
|
* audit-log-v1 files as §4.
|
|
30
|
-
* 5. Hook /
|
|
30
|
+
* 5. Hook / freshness state snapshot. Source:
|
|
31
31
|
* `agents/state/context-hygiene.json` (the code path the hook
|
|
32
32
|
* actually writes — see `context_hygiene_hook.ts::STATE_FILE`) or
|
|
33
33
|
* the doc-referenced `agents/runtime/state/context-hygiene.json`.
|
|
@@ -477,7 +477,7 @@ function renderSummarySection(
|
|
|
477
477
|
out.push('- Session health: no state recorded.');
|
|
478
478
|
} else {
|
|
479
479
|
const s = hygiene.state;
|
|
480
|
-
out.push(`- Session health: ${String(s['tool_calls'] ?? '(unset)')} tool call(s) recorded
|
|
480
|
+
out.push(`- Session health: ${String(s['tool_calls'] ?? '(unset)')} tool call(s) recorded.`);
|
|
481
481
|
}
|
|
482
482
|
return out;
|
|
483
483
|
}
|
|
@@ -686,7 +686,7 @@ function renderDecisionSection(
|
|
|
686
686
|
|
|
687
687
|
function renderHygieneSection(hygiene: HygieneReadResult): string[] {
|
|
688
688
|
const out: string[] = [];
|
|
689
|
-
out.push('## Hook
|
|
689
|
+
out.push('## Hook state (context-hygiene)');
|
|
690
690
|
out.push(`_Source: tried ${hygiene.checkedPaths.map((p) => `\`${p}\``).join(', then ')}_`);
|
|
691
691
|
out.push('');
|
|
692
692
|
if (hygiene.state === null) {
|
|
@@ -697,9 +697,6 @@ function renderHygieneSection(hygiene: HygieneReadResult): string[] {
|
|
|
697
697
|
out.push(`Found at \`${hygiene.path}\`.`);
|
|
698
698
|
out.push('');
|
|
699
699
|
out.push(`- tool_calls: ${String(s['tool_calls'] ?? '(unset)')}`);
|
|
700
|
-
out.push(`- consecutive_same_tool: ${String(s['consecutive_same_tool'] ?? '(unset)')}`);
|
|
701
|
-
out.push(`- last_tool: ${String(s['last_tool'] ?? '(unset)')}`);
|
|
702
|
-
out.push(`- loop_detected: ${String(s['loop_detected'] ?? '(unset)')}`);
|
|
703
700
|
out.push(`- freshness_threshold: ${String(s['freshness_threshold'] ?? '(unset)')}`);
|
|
704
701
|
out.push(`- checked_at: ${String(s['checked_at'] ?? '(unset)')}`);
|
|
705
702
|
return out;
|
|
@@ -718,14 +715,12 @@ function renderParkedSection(): string[] {
|
|
|
718
715
|
' thin-projector budget decision** — no on-disk record of "artefact',
|
|
719
716
|
' considered but dropped for budget" exists today. Revisit-if such a',
|
|
720
717
|
' record ships.',
|
|
721
|
-
'3. **Which memory entry id influenced a specific answer
|
|
722
|
-
' did NOT opt into `decision_engine.surface_traces` — the',
|
|
718
|
+
'3. **Which memory entry id influenced a specific answer** — the',
|
|
723
719
|
' `🧠 Memory: n/m · ids=[...]` line is printed to stdout only, never',
|
|
724
|
-
' persisted. The
|
|
725
|
-
' `
|
|
726
|
-
'
|
|
727
|
-
'
|
|
728
|
-
' for that narrower, per-run case; not duplicated here.',
|
|
720
|
+
' persisted. The per-phase decision-trace file that once carried',
|
|
721
|
+
' `memory.ids` is no longer written: its opt-in key,',
|
|
722
|
+
' `decision_engine.surface_traces`, was retired (2026-10-09) with its',
|
|
723
|
+
' default (off) as the fixed behavior.',
|
|
729
724
|
'4. **Why a given subagent primitive was/wasn\'t available on this host**',
|
|
730
725
|
' — the host-capability manifest is resolved in-session by the agent',
|
|
731
726
|
' from its own knowledge (+ an optional settings override) and is never',
|