@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
|
@@ -8,8 +8,16 @@
|
|
|
8
8
|
*
|
|
9
9
|
* 1. Every `### blocker: <id>` entry declares all five required fields
|
|
10
10
|
* (Status, Owner, Blocks, What to do, Resolved when).
|
|
11
|
-
* 2. Every inline `<!-- blocked-by: <id> -->` annotation
|
|
12
|
-
* `### blocker: <id>`
|
|
11
|
+
* 2. Every inline `<!-- blocked-by: <id> -->` annotation — on the checkbox
|
|
12
|
+
* line or a continuation line — resolves to an OPEN `### blocker: <id>`
|
|
13
|
+
* declared in the SAME file; `<!-- blocked-by: <roadmap-stem>#<id> -->`
|
|
14
|
+
* resolves to an open blocker in the named active roadmap or stub. A
|
|
15
|
+
* resolved target (stale), a missing file or id, a target found only in
|
|
16
|
+
* `later/`/`archive/`/`skipped/`, an ambiguous stem, a self-qualified
|
|
17
|
+
* reference, an unparseable marker, and a `### ` heading under
|
|
18
|
+
* `## Blockers` without the `blocker:` prefix are all hard findings —
|
|
19
|
+
* each used to pass with nothing validated (AI council 2026-10-07,
|
|
20
|
+
* authority-routing roadmap 4.1-4.3).
|
|
13
21
|
* 3. An entry that declares `- **Class:**` declares a class the taxonomy
|
|
14
22
|
* knows (0-3), and a class-0 or class-1 entry says HOW it runs
|
|
15
23
|
* (`- **Run:**`). A gate that claims to be executable without naming the
|
|
@@ -71,12 +79,33 @@
|
|
|
71
79
|
* and not WHAT it can parse; the second half is the sibling defect recorded in
|
|
72
80
|
* `stubs/road-to-blocker-parse-visibility.md`, and it is untouched here.
|
|
73
81
|
*
|
|
74
|
-
* `
|
|
75
|
-
* those record decisions already taken (parked,
|
|
76
|
-
* left unresolved there is history rather than
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
82
|
+
* `archive/` and `skipped/` stay OUT, and so does `later/` with ONE exception.
|
|
83
|
+
* The reason is not symmetry: those record decisions already taken (parked,
|
|
84
|
+
* closed, dropped), so a blocker left unresolved there is history rather than
|
|
85
|
+
* debt. A stub records a decision still to take.
|
|
86
|
+
*
|
|
87
|
+
* THE EXCEPTION — `later/*-carried.md`, added 2026-10-10 by D6 of
|
|
88
|
+
* `road-to-parked-blockers-that-get-asked`, blocker `later-blockers-in-scope`,
|
|
89
|
+
* option (b'). AI council round 2, 2026-10-08, anthropic + openai, 2/2.
|
|
90
|
+
* A `-carried` file holds steps a closing roadmap could not finish: that is
|
|
91
|
+
* open work which was MOVED, not a decision taken, so the argument excluding
|
|
92
|
+
* the rest of `later/` does not reach it. Round 1 had SPLIT — one seat for the
|
|
93
|
+
* widening on the condition the carried files already pass, one for keeping
|
|
94
|
+
* the exclusion with report-only observability — and the condition was then
|
|
95
|
+
* measured true: 7 of 7 carried files, 0 hard findings. So this lands on
|
|
96
|
+
* nothing, the same "no backlog to grandfather" argument the `stubs/` widening
|
|
97
|
+
* made.
|
|
98
|
+
*
|
|
99
|
+
* Deliberately NOT widened with it: `/roadmap:resolve-blockers` keeps its
|
|
100
|
+
* scope. Option (b) would have moved both together; (b') moves the gate and
|
|
101
|
+
* leaves the command, because a gate that reports is a different commitment
|
|
102
|
+
* from a command that asks an owner to decide.
|
|
103
|
+
*
|
|
104
|
+
* The polarity is pinned in BOTH directions by
|
|
105
|
+
* `tests/scripts/lint_roadmap_blockers.test.ts` § the scanned scope — a
|
|
106
|
+
* carried file is judged, an ordinary `later/` roadmap beside it is not, and
|
|
107
|
+
* the suffix does not leak into `archive/` or `skipped/` — so widening further
|
|
108
|
+
* cannot happen by accident.
|
|
80
109
|
*
|
|
81
110
|
* One consequence worth naming rather than discovering: `_archiveOverlap`
|
|
82
111
|
* defaults its ACTIVE corpus to this glob, so a stub declaring a blocker open
|
|
@@ -106,20 +135,60 @@ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
|
106
135
|
* expression: nothing globs with this string, and a `{,stubs/}` empty
|
|
107
136
|
* alternative is bash-only syntax that would mislead anyone who tried.
|
|
108
137
|
*/
|
|
109
|
-
const ROADMAP_GLOB =
|
|
110
|
-
|
|
138
|
+
const ROADMAP_GLOB =
|
|
139
|
+
'agents/roadmaps/*.md + agents/roadmaps/stubs/*.md + agents/roadmaps/later/*-carried.md';
|
|
140
|
+
/** The one subdirectory wholly inside the glob; the scope section says why only this one. */
|
|
111
141
|
const SCANNED_SUBDIRS: readonly string[] = ['stubs'];
|
|
142
|
+
/**
|
|
143
|
+
* `later/` is in scope for ONE filename shape and no other.
|
|
144
|
+
*
|
|
145
|
+
* A `-carried` file holds steps a closing roadmap could not finish, so it is
|
|
146
|
+
* open work that was moved — not a decision already taken, which is what the
|
|
147
|
+
* rest of `later/` records. It is the same distinction the scope section above
|
|
148
|
+
* draws for `stubs/`, applied to a file rather than a directory.
|
|
149
|
+
*/
|
|
150
|
+
const CARRIED_DIR = 'later';
|
|
151
|
+
const CARRIED_SUFFIX = '-carried.md';
|
|
152
|
+
/** Roadmap directories a qualified reference may NAME but never resolve into. */
|
|
153
|
+
const OUT_OF_SCOPE_SUBDIRS: readonly string[] = ['later', 'archive', 'skipped'];
|
|
112
154
|
|
|
113
155
|
const FENCED_CODE_RE = /^[ \t]*```[^\n]*\n[\s\S]*?^[ \t]*```[ \t]*$/gm;
|
|
114
156
|
const BLOCKERS_SECTION_RE = /^##[ \t]+Blockers[ \t]*$/im;
|
|
115
157
|
const NEXT_H2_RE = /^##[ \t]+\S/m;
|
|
116
158
|
const BLOCKER_HEADING_RE = /^###[ \t]+blocker:[ \t]*(.+?)[ \t]*$/gim;
|
|
117
|
-
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
//
|
|
159
|
+
const UNPREFIXED_HEADING_RE = /^###[ \t]+(?!blocker:)\S.*$/gim;
|
|
160
|
+
// Every line carrying a real HTML-comment marker counts — the checkbox line
|
|
161
|
+
// AND a wrapped continuation line of the same step. Anchoring to the checkbox
|
|
162
|
+
// line alone read nothing on a continuation line and still printed the file
|
|
163
|
+
// clean (authority-routing council record, defect 1). Inline-code
|
|
164
|
+
// documentation of the syntax is blanked before matching, so a quoted example
|
|
165
|
+
// stays prose rather than a live reference.
|
|
121
166
|
const BLOCKED_BY_LINE_RE =
|
|
122
|
-
|
|
167
|
+
/<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+(?:#[a-z0-9-]+)?)[ \t]*(?:\|[ \t]*asked:[ \t]*(yes|no)[ \t]*(?:[\u2014-][ \t]*([^>]*?))?[ \t]*)?-->/i;
|
|
168
|
+
/** A marker opening the full grammar above failed to parse — reported, never skipped. */
|
|
169
|
+
const MARKER_OPEN_RE = /<!--[ \t]*blocked-by:/i;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Where a qualified `<roadmap-stem>#<id>` reference may resolve.
|
|
173
|
+
*
|
|
174
|
+
* The AI council, 2026-10-07, 2/2 present, both on the qualified form: only an
|
|
175
|
+
* in-scope roadmap (active or stub) is a legal target. A target found only in
|
|
176
|
+
* `later/`, `archive/` or `skipped/` is out of scope — directory placement is a
|
|
177
|
+
* different state machine from blocker status, so it is named in the error and
|
|
178
|
+
* never read as "resolved" or "still held".
|
|
179
|
+
*/
|
|
180
|
+
interface TargetFile {
|
|
181
|
+
rel: string;
|
|
182
|
+
declared: ReadonlySet<string>;
|
|
183
|
+
open: ReadonlySet<string>;
|
|
184
|
+
userDecision: ReadonlySet<string>;
|
|
185
|
+
}
|
|
186
|
+
interface TargetIndex {
|
|
187
|
+
/** Roadmap stem → every in-scope file with that stem (more than one is ambiguous). */
|
|
188
|
+
inScope: ReadonlyMap<string, readonly TargetFile[]>;
|
|
189
|
+
/** Roadmap stem → the out-of-scope directory it was found in. */
|
|
190
|
+
outOfScope: ReadonlyMap<string, string>;
|
|
191
|
+
}
|
|
123
192
|
|
|
124
193
|
/**
|
|
125
194
|
* The owners whose blockers are the USER-DECISION class.
|
|
@@ -249,8 +318,8 @@ function _stripFencedCode(text: string): string {
|
|
|
249
318
|
return text.replace(FENCED_CODE_RE, (m) => '\n'.repeat((m.match(/\n/g) ?? []).length));
|
|
250
319
|
}
|
|
251
320
|
|
|
252
|
-
function _scan(rawText: string): Violation[] {
|
|
253
|
-
return _scanBoth(rawText).hard;
|
|
321
|
+
function _scan(rawText: string, ctx?: ScanContext): Violation[] {
|
|
322
|
+
return _scanBoth(rawText, ctx).hard;
|
|
254
323
|
}
|
|
255
324
|
|
|
256
325
|
interface ScanResult {
|
|
@@ -260,12 +329,20 @@ interface ScanResult {
|
|
|
260
329
|
decidability: Violation[];
|
|
261
330
|
}
|
|
262
331
|
|
|
263
|
-
|
|
332
|
+
/** What a scan needs to resolve a qualified reference: who it is, and where it may point. */
|
|
333
|
+
interface ScanContext {
|
|
334
|
+
/** The scanned file's own roadmap stem, so a self-qualified reference is caught. */
|
|
335
|
+
selfStem?: string;
|
|
336
|
+
index?: TargetIndex;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function _scanBoth(rawText: string, ctx: ScanContext = {}): ScanResult {
|
|
264
340
|
const violations: Violation[] = [];
|
|
265
341
|
const decidability: Violation[] = [];
|
|
266
342
|
const text = _stripFencedCode(rawText);
|
|
267
343
|
const declaredIds = new Set<string>();
|
|
268
344
|
const userDecisionIds = new Set<string>();
|
|
345
|
+
const openIds = new Set<string>();
|
|
269
346
|
|
|
270
347
|
const sectionMatch = BLOCKERS_SECTION_RE.exec(text);
|
|
271
348
|
if (sectionMatch) {
|
|
@@ -288,9 +365,27 @@ function _scanBoth(rawText: string): ScanResult {
|
|
|
288
365
|
BLOCKER_HEADING_RE.lastIndex++;
|
|
289
366
|
}
|
|
290
367
|
}
|
|
368
|
+
// A `### <id>` heading without the `blocker:` prefix parses to no
|
|
369
|
+
// blocker at all, so the file used to pass with nothing validated.
|
|
370
|
+
for (const bare of section.matchAll(UNPREFIXED_HEADING_RE)) {
|
|
371
|
+
violations.push({
|
|
372
|
+
line: _lineAt(text, sectionStart + (bare.index ?? 0)),
|
|
373
|
+
message:
|
|
374
|
+
`'${(bare[0] as string).trim()}' sits under ## Blockers without the ` +
|
|
375
|
+
"'blocker:' prefix, so it declares no blocker — write '### blocker: <id>'",
|
|
376
|
+
});
|
|
377
|
+
}
|
|
291
378
|
for (let i = 0; i < heads.length; i++) {
|
|
292
379
|
const cur = heads[i] as { start: number; end: number; id: string };
|
|
293
380
|
declaredIds.add(cur.id);
|
|
381
|
+
if (cur.id.includes('#')) {
|
|
382
|
+
violations.push({
|
|
383
|
+
line: _lineAt(text, sectionStart + cur.start),
|
|
384
|
+
message:
|
|
385
|
+
`blocker id '${cur.id}' contains '#', the separator of a qualified ` +
|
|
386
|
+
"'<roadmap-stem>#<id>' reference — rename it",
|
|
387
|
+
});
|
|
388
|
+
}
|
|
294
389
|
const bodyEnd = i + 1 < heads.length ? (heads[i + 1] as { start: number }).start : section.length;
|
|
295
390
|
const body = section.slice(cur.end, bodyEnd);
|
|
296
391
|
if (USER_DECISION_OWNER_RE.test(body)) {
|
|
@@ -307,6 +402,7 @@ function _scanBoth(rawText: string): ScanResult {
|
|
|
307
402
|
// made would be churn, and the ratchet would never reach zero.
|
|
308
403
|
const isResolved = /^-[ \t]*\*\*Status:\*\*[ \t]*resolved/im.test(body);
|
|
309
404
|
if (!isResolved) {
|
|
405
|
+
openIds.add(cur.id);
|
|
310
406
|
// The class/run contract is HARD rather than ratcheted, and it
|
|
311
407
|
// can be: `Class:` is a new opt-in field, so on the day it
|
|
312
408
|
// ships no entry in the tree declares one and the rule fires on
|
|
@@ -382,18 +478,23 @@ function _scanBoth(rawText: string): ScanResult {
|
|
|
382
478
|
const cleaned = (lines[i] as string).replace(/`[^`\n]*`/g, (m) => ' '.repeat(m.length));
|
|
383
479
|
const m = BLOCKED_BY_LINE_RE.exec(cleaned);
|
|
384
480
|
if (!m) {
|
|
481
|
+
if (MARKER_OPEN_RE.test(cleaned)) {
|
|
482
|
+
violations.push({
|
|
483
|
+
line: i + 1,
|
|
484
|
+
message:
|
|
485
|
+
'blocked-by marker does not parse — write ' +
|
|
486
|
+
"'<!-- blocked-by: <id> -->' or '<!-- blocked-by: <roadmap-stem>#<id> -->'",
|
|
487
|
+
});
|
|
488
|
+
}
|
|
385
489
|
continue;
|
|
386
490
|
}
|
|
387
|
-
const
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
message:
|
|
392
|
-
`blocked-by references unknown blocker id '${id}' ` +
|
|
393
|
-
`(no matching '### blocker: ${id}' in this file)`,
|
|
394
|
-
});
|
|
491
|
+
const ref = m[1] as string;
|
|
492
|
+
const r = _resolveRef(ref, { declaredIds, openIds, userDecisionIds }, ctx);
|
|
493
|
+
if (r.error !== null) {
|
|
494
|
+
violations.push({ line: i + 1, message: r.error });
|
|
395
495
|
}
|
|
396
|
-
|
|
496
|
+
const id = ref;
|
|
497
|
+
if (r.userDecision) {
|
|
397
498
|
const asked = m[2] === undefined ? null : (m[2] as string).toLowerCase();
|
|
398
499
|
const reason = ((m[3] as string | undefined) ?? '').trim();
|
|
399
500
|
if (asked === null) {
|
|
@@ -420,6 +521,149 @@ function _scanBoth(rawText: string): ScanResult {
|
|
|
420
521
|
return { hard: violations, decidability };
|
|
421
522
|
}
|
|
422
523
|
|
|
524
|
+
interface LocalBlockers {
|
|
525
|
+
declaredIds: ReadonlySet<string>;
|
|
526
|
+
openIds: ReadonlySet<string>;
|
|
527
|
+
userDecisionIds: ReadonlySet<string>;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Resolve one marker reference to its legal state, or the error naming why not.
|
|
532
|
+
*
|
|
533
|
+
* Bare `<id>` resolves in the same file only, unchanged. Qualified
|
|
534
|
+
* `<roadmap-stem>#<id>` resolves against the in-scope target named — never
|
|
535
|
+
* estate-wide, so an unrelated roadmap adding a same-named blocker cannot change
|
|
536
|
+
* what an existing marker means. A target that is declared but resolved makes
|
|
537
|
+
* the marker STALE: `run-continuation` treats every marker as blocked, so a
|
|
538
|
+
* marker on a resolved blocker would hold a step nothing holds any more.
|
|
539
|
+
* "Superseded" is not a state — the format has no replacement pointer, so a
|
|
540
|
+
* moved blocker is a reference to update, reported here as missing.
|
|
541
|
+
*/
|
|
542
|
+
function _resolveRef(
|
|
543
|
+
ref: string,
|
|
544
|
+
local: LocalBlockers,
|
|
545
|
+
ctx: ScanContext,
|
|
546
|
+
): { error: string | null; userDecision: boolean } {
|
|
547
|
+
const hash = ref.indexOf('#');
|
|
548
|
+
if (hash === -1) {
|
|
549
|
+
if (!local.declaredIds.has(ref)) {
|
|
550
|
+
return {
|
|
551
|
+
error:
|
|
552
|
+
`blocked-by references unknown blocker id '${ref}' ` +
|
|
553
|
+
`(no matching '### blocker: ${ref}' in this file; a blocker declared in ` +
|
|
554
|
+
"another roadmap is referenced as '<roadmap-stem>#<id>')",
|
|
555
|
+
userDecision: false,
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
if (!local.openIds.has(ref)) {
|
|
559
|
+
return { error: _staleMessage(ref, 'this file'), userDecision: false };
|
|
560
|
+
}
|
|
561
|
+
return { error: null, userDecision: local.userDecisionIds.has(ref) };
|
|
562
|
+
}
|
|
563
|
+
const stem = ref.slice(0, hash);
|
|
564
|
+
const id = ref.slice(hash + 1);
|
|
565
|
+
if (ctx.selfStem !== undefined && stem === ctx.selfStem) {
|
|
566
|
+
return {
|
|
567
|
+
error: `blocked-by '${ref}' qualifies a blocker in this same file — write the bare id '${id}'`,
|
|
568
|
+
userDecision: false,
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
const hits = ctx.index?.inScope.get(stem) ?? [];
|
|
572
|
+
if (hits.length > 1) {
|
|
573
|
+
return {
|
|
574
|
+
error:
|
|
575
|
+
`blocked-by '${ref}' is ambiguous — roadmap stem '${stem}' names ` +
|
|
576
|
+
`${hits.map((h) => h.rel).join(' and ')}`,
|
|
577
|
+
userDecision: false,
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
const target = hits[0];
|
|
581
|
+
if (target === undefined) {
|
|
582
|
+
const parked = ctx.index?.outOfScope.get(stem);
|
|
583
|
+
return {
|
|
584
|
+
error:
|
|
585
|
+
parked === undefined
|
|
586
|
+
? `blocked-by '${ref}' names no roadmap '${stem}.md' in agents/roadmaps/ or stubs/`
|
|
587
|
+
: `blocked-by '${ref}' names a roadmap only found in ${parked}/, which is not a ` +
|
|
588
|
+
'resolvable target — only an active roadmap or a stub can hold a step',
|
|
589
|
+
userDecision: false,
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
if (!target.declared.has(id)) {
|
|
593
|
+
return {
|
|
594
|
+
error: `blocked-by '${ref}' names no '### blocker: ${id}' in ${target.rel}`,
|
|
595
|
+
userDecision: false,
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
if (!target.open.has(id)) {
|
|
599
|
+
return { error: _staleMessage(ref, target.rel), userDecision: false };
|
|
600
|
+
}
|
|
601
|
+
return { error: null, userDecision: target.userDecision.has(id) };
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
function _staleMessage(ref: string, where: string): string {
|
|
605
|
+
return (
|
|
606
|
+
`blocked-by '${ref}' points at a blocker resolved in ${where} — if the step can ` +
|
|
607
|
+
'proceed, remove the marker; if it is still held, reopen the blocker and say why'
|
|
608
|
+
);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/** Declared, open and user-decision blocker ids of one roadmap text. */
|
|
612
|
+
function _blockerSets(text: string): { declared: Set<string>; open: Set<string>; userDecision: Set<string> } {
|
|
613
|
+
const declared = new Set<string>();
|
|
614
|
+
const userDecision = new Set<string>();
|
|
615
|
+
const stripped = _stripFencedCode(text);
|
|
616
|
+
const sectionMatch = BLOCKERS_SECTION_RE.exec(stripped);
|
|
617
|
+
if (sectionMatch) {
|
|
618
|
+
const sectionStart = sectionMatch.index + sectionMatch[0].length;
|
|
619
|
+
const rest = stripped.slice(sectionStart);
|
|
620
|
+
const h2 = NEXT_H2_RE.exec(rest);
|
|
621
|
+
const section = stripped.slice(sectionStart, h2 ? sectionStart + h2.index : stripped.length);
|
|
622
|
+
const heads = [...section.matchAll(BLOCKER_HEADING_RE)];
|
|
623
|
+
heads.forEach((hm, i) => {
|
|
624
|
+
const id = (hm[1] as string).trim();
|
|
625
|
+
declared.add(id);
|
|
626
|
+
const next = heads[i + 1];
|
|
627
|
+
const body = section.slice((hm.index ?? 0) + hm[0].length, next ? next.index : section.length);
|
|
628
|
+
if (USER_DECISION_OWNER_RE.test(body)) {
|
|
629
|
+
userDecision.add(id);
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
return { declared, open: _openBlockerIds(text), userDecision };
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
/** The qualified-reference target map over a roadmap tree. See {@link TargetIndex}. */
|
|
637
|
+
function _targetIndex(roadmapRoot: string = path.join(REPO_ROOT, 'agents', 'roadmaps')): TargetIndex {
|
|
638
|
+
const inScope = new Map<string, TargetFile[]>();
|
|
639
|
+
for (const f of _globRoadmaps(roadmapRoot)) {
|
|
640
|
+
const stem = path.basename(f, '.md');
|
|
641
|
+
const sets = _blockerSets(fs.readFileSync(f, 'utf-8'));
|
|
642
|
+
const entry: TargetFile = {
|
|
643
|
+
rel: _relPosix(f, REPO_ROOT),
|
|
644
|
+
declared: sets.declared,
|
|
645
|
+
open: sets.open,
|
|
646
|
+
userDecision: sets.userDecision,
|
|
647
|
+
};
|
|
648
|
+
const list = inScope.get(stem);
|
|
649
|
+
if (list === undefined) {
|
|
650
|
+
inScope.set(stem, [entry]);
|
|
651
|
+
} else {
|
|
652
|
+
list.push(entry);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
const outOfScope = new Map<string, string>();
|
|
656
|
+
for (const dir of OUT_OF_SCOPE_SUBDIRS) {
|
|
657
|
+
for (const f of _globFlat(path.join(roadmapRoot, dir))) {
|
|
658
|
+
const stem = path.basename(f, '.md');
|
|
659
|
+
if (!inScope.has(stem) && !outOfScope.has(stem)) {
|
|
660
|
+
outOfScope.set(stem, dir);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
return { inScope, outOfScope };
|
|
665
|
+
}
|
|
666
|
+
|
|
423
667
|
/** Sorted `*.md` directly inside `dir` — never recursive. */
|
|
424
668
|
function _globFlat(dir: string): string[] {
|
|
425
669
|
let entries: fs.Dirent[];
|
|
@@ -451,6 +695,13 @@ function _globRoadmaps(roadmapRoot: string = path.join(REPO_ROOT, 'agents', 'roa
|
|
|
451
695
|
for (const sub of SCANNED_SUBDIRS) {
|
|
452
696
|
out.push(..._globFlat(path.join(roadmapRoot, sub)));
|
|
453
697
|
}
|
|
698
|
+
// The suffix is checked against `later/` alone, never applied tree-wide: a
|
|
699
|
+
// carried name under `archive/` or `skipped/` is still a decision taken.
|
|
700
|
+
out.push(
|
|
701
|
+
..._globFlat(path.join(roadmapRoot, CARRIED_DIR)).filter((f) =>
|
|
702
|
+
path.basename(f).endsWith(CARRIED_SUFFIX),
|
|
703
|
+
),
|
|
704
|
+
);
|
|
454
705
|
return out;
|
|
455
706
|
}
|
|
456
707
|
|
|
@@ -631,12 +882,13 @@ function main(): number {
|
|
|
631
882
|
}
|
|
632
883
|
return 0;
|
|
633
884
|
}
|
|
885
|
+
const index = _targetIndex();
|
|
634
886
|
let failed = 0;
|
|
635
887
|
const undecidable: Array<{ rel: string; v: Violation }> = [];
|
|
636
888
|
for (const roadmap of roadmaps) {
|
|
637
889
|
const rel = _relPosix(roadmap, REPO_ROOT);
|
|
638
890
|
const text = fs.readFileSync(roadmap, 'utf-8');
|
|
639
|
-
const { hard, decidability } = _scanBoth(text);
|
|
891
|
+
const { hard, decidability } = _scanBoth(text, { selfStem: path.basename(roadmap, '.md'), index });
|
|
640
892
|
for (const v of decidability) {
|
|
641
893
|
undecidable.push({ rel, v });
|
|
642
894
|
}
|
|
@@ -763,10 +1015,11 @@ export {
|
|
|
763
1015
|
_hasExecutableSubstance,
|
|
764
1016
|
_scan,
|
|
765
1017
|
_scanBoth,
|
|
1018
|
+
_targetIndex,
|
|
766
1019
|
_globRoadmaps,
|
|
767
1020
|
_globArchivedRoadmaps,
|
|
768
1021
|
_openBlockerIds,
|
|
769
1022
|
_archiveOverlap,
|
|
770
1023
|
main,
|
|
771
1024
|
};
|
|
772
|
-
export type { Violation, ScanResult, Overlap };
|
|
1025
|
+
export type { Violation, ScanResult, Overlap, ScanContext, TargetIndex };
|
|
@@ -154,8 +154,10 @@ function _check_lightweight(text: string, line_count: number, problems: string[]
|
|
|
154
154
|
if (line_count > LIGHTWEIGHT_LINE_CAP) {
|
|
155
155
|
problems.push(
|
|
156
156
|
`lightweight cap exceeded: ${line_count} lines ` +
|
|
157
|
-
`(max ${LIGHTWEIGHT_LINE_CAP});
|
|
158
|
-
`
|
|
157
|
+
`(max ${LIGHTWEIGHT_LINE_CAP}); move dated evidence paragraphs ` +
|
|
158
|
+
`verbatim to a page under agents/evidence/analysis/, leaving a ` +
|
|
159
|
+
`one-line pointer — an agent may not retag this file structural ` +
|
|
160
|
+
`to clear the cap (roadmap-complexity-standard.md)`,
|
|
159
161
|
);
|
|
160
162
|
}
|
|
161
163
|
const phases = _countMatches(PHASE_PAT, text);
|