@event4u/agent-config 16.2.0 → 16.3.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 +89 -237
- package/README.md +14 -12
- package/dist/agent-src/commands/analyze/inbox.md +1 -1
- package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
- package/dist/agent-src/commands/bug/fix.md +17 -2
- package/dist/agent-src/commands/feature/plan.md +1 -1
- package/dist/agent-src/commands/feature/roadmap.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +1 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +4 -4
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
- package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
- package/dist/agent-src/commands/roadmap.md +18 -4
- package/dist/agent-src/commands/tests/create.md +17 -3
- package/dist/agent-src/commands/tests/execute.md +22 -5
- package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
- package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
- package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -0
- package/dist/agent-src/rules/broken-access-control.md +1 -0
- package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
- package/dist/agent-src/rules/context-hygiene.md +1 -1
- package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
- package/dist/agent-src/rules/design-fidelity.md +13 -16
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
- package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
- package/dist/agent-src/rules/domain-safety-pii.md +1 -0
- package/dist/agent-src/rules/domain-safety-retention.md +1 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
- package/dist/agent-src/rules/evaluator-independence.md +3 -2
- package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
- package/dist/agent-src/rules/finance-safety-floor.md +1 -0
- package/dist/agent-src/rules/git-history-discipline.md +1 -0
- package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
- package/dist/agent-src/rules/legal-safety-floor.md +3 -2
- package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
- package/dist/agent-src/rules/media-governance-routing.md +14 -17
- package/dist/agent-src/rules/persona-governance.md +2 -2
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
- package/dist/agent-src/rules/question-not-instruction.md +1 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/runtime-safety.md +1 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
- package/dist/agent-src/rules/session-canary.md +8 -62
- package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
- package/dist/agent-src/rules/source-confidentiality.md +1 -0
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
- package/dist/agent-src/rules/tool-safety.md +1 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
- package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/dist/agent-src/scripts/deferral_carry.ts +339 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
- package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
- package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
- package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/cli/registry.js +1 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
- package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
- package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
- package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
- package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
- package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
- package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
- package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-JQVYKIZA.js} +10 -0
- package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
- package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
- package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
- package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-NQ7WT43P.js} +1186 -244
- package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
- package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
- package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
- package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
- package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
- package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-RQNNW7IF.js} +1314 -560
- package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-S4UMZNES.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
- package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-TRI6DQZ6.js} +2781 -340
- package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
- package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
- package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
- package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +1167 -234
- package/dist/cli-delegate/cmd_doctor.js +13 -6
- package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
- package/dist/cli-delegate/cmd_explain.js +5 -5
- package/dist/cli-delegate/cmd_export.js +11 -8
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_handoff.js +10 -7
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +3 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +3 -3
- package/dist/cli-delegate/cmd_preflight.js +6 -6
- package/dist/cli-delegate/cmd_prune.js +11 -8
- package/dist/cli-delegate/cmd_refresh.js +2 -1
- package/dist/cli-delegate/cmd_route_audit.js +8 -6
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +4 -3
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
- package/dist/cli-delegate/cmd_settings_set.js +4 -4
- package/dist/cli-delegate/cmd_sync.js +11 -8
- package/dist/cli-delegate/cmd_uninstall.js +11 -8
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +11 -8
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/deferral_carry.js +16 -0
- package/dist/cli-delegate/gate_execute.js +2 -2
- package/dist/cli-delegate/roadmap_gates.js +5 -5
- package/dist/cli-delegate/update_roadmap_progress.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +127 -75
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +7 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +6 -4
- package/dist/hooks/dispatch.js +5357 -6656
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/install/claudePathsPlan.js +47 -6
- package/dist/install/claudeRuleRewrite.js +7 -0
- package/dist/install/emit_host_rules_cli.js +39 -36
- package/dist/install/globalRuleScope.js +87 -0
- package/dist/install/host_rule_ownership.js +160 -0
- package/dist/install/install.mjs +2080 -1024
- package/dist/install/installThinLayer.js +261 -0
- package/dist/install/installedRuleLinks.js +176 -0
- package/dist/install/wizard-plan.js +24 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +31965 -27154
- package/dist/scripts/_lib/agent_settings.js +11 -0
- package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
- package/dist/scripts/_lib/installed_layer.js +378 -0
- package/dist/scripts/_lib/lean_projection_mode.js +218 -15
- package/dist/scripts/_lib/rule_consequence_class.js +45 -0
- package/dist/scripts/_lib/rule_injection.js +67 -10
- package/dist/scripts/_lib/rule_law_section.js +122 -0
- package/dist/scripts/_lib/thin_rules.js +458 -0
- package/dist/scripts/_lib/windsurf_render.js +60 -0
- package/dist/scripts/condense.js +14 -26
- package/dist/scripts/project_thin_rules.js +14 -294
- package/dist/server/schemas/settings.js +6 -0
- package/dist/shared/skillRanking.js +74 -13
- package/docs/contracts/settings-classes.md +7 -5
- package/package.json +1 -1
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/src/agent-src/scripts/deferral_carry.ts +339 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/config/agent-settings.template.yml +62 -22
- package/src/config/continuity-surface.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +96 -3
- package/src/config/gate-violation-baselines.json +17 -9
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-token-budget.json +6 -1
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/routing-coverage-seed.json +24 -3
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-consequence-class.json +161 -0
- package/src/config/rule-law-ceilings.json +99 -0
- package/src/install/claudePathsPlan.ts +46 -4
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/emit_host_rules_cli.ts +43 -34
- package/src/install/globalRuleScope.ts +109 -0
- package/src/install/host_rule_ownership.ts +170 -0
- package/src/install/installThinLayer.ts +312 -0
- package/src/install/installedRuleLinks.ts +220 -0
- package/src/install/wizard-plan.ts +24 -0
- package/src/scripts/_cli/cmd_doctor.ts +23 -71
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
- package/src/scripts/_dispatch.bash +16 -2
- package/src/scripts/_lib/agent_settings.ts +11 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/estate_offsets.ts +241 -0
- package/src/scripts/_lib/exemption_shape.ts +143 -0
- package/src/scripts/_lib/fnv.ts +23 -0
- package/src/scripts/_lib/foreign_scan.ts +106 -0
- package/src/scripts/_lib/gitignore_block.ts +314 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
- package/src/scripts/_lib/graph_feeder_record.ts +214 -0
- package/src/scripts/_lib/hook_settings.ts +73 -0
- package/src/scripts/_lib/host_capability.ts +40 -19
- package/src/scripts/_lib/host_hook_merge.ts +165 -0
- package/src/scripts/_lib/installed_layer.ts +538 -0
- package/src/scripts/_lib/json_merge.ts +82 -0
- package/src/scripts/_lib/json_pointers.ts +93 -11
- package/src/scripts/_lib/lean_projection_mode.ts +275 -15
- package/src/scripts/_lib/machine_wake.ts +16 -3
- package/src/scripts/_lib/neighbour_census.ts +760 -0
- package/src/scripts/_lib/neighbour_scan.ts +122 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- package/src/scripts/_lib/review_coverage.ts +134 -0
- package/src/scripts/_lib/rule_consequence_class.ts +71 -0
- package/src/scripts/_lib/rule_injection.ts +130 -10
- package/src/scripts/_lib/rule_law_section.ts +147 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structured_ask.ts +64 -21
- package/src/scripts/_lib/thin_rules.ts +540 -0
- package/src/scripts/_lib/touched_file_quality.ts +434 -0
- package/src/scripts/_lib/turn_end_refusals.ts +77 -2
- package/src/scripts/_lib/windsurf_render.ts +63 -0
- package/src/scripts/ai_council/cli_call_budget.ts +13 -5
- package/src/scripts/ai_council/clients.ts +26 -57
- package/src/scripts/ai_council/config.ts +1 -1
- package/src/scripts/ai_council/vendor_defaults.ts +45 -0
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/before_complete_hook.ts +243 -12
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/check_enforcement_matrix.ts +377 -20
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_finding_dispositions.ts +116 -4
- package/src/scripts/check_hook_bundle_composition.ts +370 -0
- package/src/scripts/check_kernel_edit_ratified.ts +49 -11
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_standing_rule_delivery.ts +33 -13
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/code_graph/detect.ts +127 -7
- package/src/scripts/code_graph/foreign.ts +194 -0
- package/src/scripts/code_graph/query.ts +217 -4
- package/src/scripts/code_graph/types.ts +26 -2
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +103 -0
- package/src/scripts/compile_hook_manifest.ts +33 -1
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/generate_host_cost_table.ts +1 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +150 -9
- package/src/scripts/hooks/block_config_weakening.ts +67 -2
- package/src/scripts/hooks/block_plumbing_writes.ts +29 -1
- package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/dispatch_hook.ts +52 -52
- package/src/scripts/hooks/exit_codes.ts +2 -1
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.ts +19 -1
- package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/rule_inject_hook.ts +757 -63
- package/src/scripts/hooks/table_fingerprint.ts +21 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +64 -8
- package/src/scripts/hooks/turn_end_gate_hook.ts +84 -0
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install.ts +72 -185
- package/src/scripts/installed_layer_report.ts +103 -0
- package/src/scripts/language_mirror_hook.ts +15 -6
- package/src/scripts/learning_sidecar.ts +119 -8
- package/src/scripts/lint_hook_manifest.ts +53 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +63 -5
- package/src/scripts/lint_rule_law_section.ts +517 -0
- package/src/scripts/lint_workflow_security.ts +161 -5
- package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
- package/src/scripts/mcp_server/graph_tools.ts +72 -3
- package/src/scripts/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +216 -8
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/model_rule_injection.ts +52 -5
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +157 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_obligation_mechanism.ts +230 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_ranker_confusion.ts +442 -0
- package/src/scripts/report_standing_payload_by_host.ts +188 -15
- package/src/scripts/report_verification_record_coverage.ts +306 -0
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/review-findings.schema.json +3 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/self_review_gate.ts +62 -7
- package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
- package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
- package/src/scripts/sync_gitignore.ts +29 -235
- package/src/scripts/trigger_eval_grandfather.json +0 -5
- package/src/server/schemas/settings.ts +10 -0
- package/src/shared/skillRanking.ts +117 -11
- package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
---
|
|
2
|
+
model_tier: high
|
|
3
|
+
name: roadmap-triage-parked
|
|
4
|
+
pack: product-basic
|
|
5
|
+
visibility: internal
|
|
6
|
+
cluster: roadmap
|
|
7
|
+
sub: triage-parked
|
|
8
|
+
skills: [roadmap-management, roadmap-writing, decision-review, agent-docs-writing]
|
|
9
|
+
description: Drain later/ and skipped/ — verify each parked roadmap against the current tree, run its resume condition, then promote, absorb, archive, or re-park it with a fresh reason.
|
|
10
|
+
argument-hint: "[<file> | later | skipped | all] [--batch <n>] [--triage-only]"
|
|
11
|
+
suggestion:
|
|
12
|
+
eligible: false
|
|
13
|
+
rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /roadmap:triage-parked name; not independently suggested (surface-consolidation)."
|
|
14
|
+
workspaces:
|
|
15
|
+
- agent-config-maintainer
|
|
16
|
+
packs:
|
|
17
|
+
- meta
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# /roadmap:triage-parked
|
|
21
|
+
|
|
22
|
+
Drain sub of the [`/roadmap`](../roadmap.md) cluster. `later/` and `skipped/`
|
|
23
|
+
are excluded from the dashboard and from every `/roadmap:process-*` run, so
|
|
24
|
+
nothing ever looks at them again unless asked. A parked roadmap is a **frozen
|
|
25
|
+
claim about a tree that has since moved**: its resume condition may have fired
|
|
26
|
+
weeks ago, its open steps may have shipped under another roadmap, its skip
|
|
27
|
+
reason may no longer hold. This command re-reads them against the current tree
|
|
28
|
+
and gives every file a decision, so the two folders shrink instead of rotting.
|
|
29
|
+
|
|
30
|
+
It is the [`/analyze:inbox`](../analyze/inbox.md) discipline applied to the
|
|
31
|
+
roadmap estate's own back room: verify every claim, prefer "already shipped" as
|
|
32
|
+
the most valuable finding, and never let a file leave the run without a named
|
|
33
|
+
disposition.
|
|
34
|
+
|
|
35
|
+
## The Iron Law
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
A PARKED ROADMAP IS A CLAIM, NOT A FACT. VERIFY ITS OPEN STEPS AND EXECUTE ITS
|
|
39
|
+
RESUME CONDITION AGAINST THE CURRENT TREE BEFORE DECIDING ANYTHING.
|
|
40
|
+
"ALREADY SHIPPED" IS THE MOST VALUABLE FINDING — MARK IT [x] WITH A file:line.
|
|
41
|
+
EVERY FILE IN SCOPE LEAVES THE RUN WITH EXACTLY ONE OF FIVE DISPOSITIONS.
|
|
42
|
+
RE-PARKING WITHOUT A REFRESHED, CHECKABLE REASON IS NOT A DISPOSITION.
|
|
43
|
+
NEVER DELETE A ROADMAP. NEVER DROP AN OPEN OR DEFERRED STEP SILENTLY.
|
|
44
|
+
NEVER WRITE [-] — CANCELLING A STEP IS OWNER-RESERVED. "OBSOLETE" IS A
|
|
45
|
+
FINDING THE OWNER RULES ON, NOT A CANCELLATION THE AGENT APPLIES.
|
|
46
|
+
AN OWNER-RESERVED BLOCKER STAYS OWNER-RESERVED — PROMOTION NEVER LIFTS IT.
|
|
47
|
+
REVIVING A skipped/ ROADMAP REOPENS A RECORDED DECISION — COUNCIL FIRST.
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Argument
|
|
51
|
+
|
|
52
|
+
| Given | Scope |
|
|
53
|
+
|---|---|
|
|
54
|
+
| a file path | that roadmap only |
|
|
55
|
+
| `later` | every roadmap in `agents/roadmaps/later/` |
|
|
56
|
+
| `skipped` | every roadmap in `agents/roadmaps/skipped/` |
|
|
57
|
+
| `all` or nothing | both folders |
|
|
58
|
+
|
|
59
|
+
`README.md` is never in scope. `--batch <n>` caps the deep pass (default **15**
|
|
60
|
+
files per run); the cheap inventory in Phase 1 always covers the whole scope.
|
|
61
|
+
`--triage-only` stops after Phase 2 — the table, no edits.
|
|
62
|
+
|
|
63
|
+
> The batch default of 15 is a **stated default, not a measured optimum**.
|
|
64
|
+
> *Revisit-if:* a run reports files past the cap that the inventory had already
|
|
65
|
+
> classified as trivial (too low), or a run's verification column filling with
|
|
66
|
+
> `unverifiable` towards its end (too high — reading degraded).
|
|
67
|
+
|
|
68
|
+
## Where the work happens
|
|
69
|
+
|
|
70
|
+
Runs in the checked-out branch, like `/analyze:inbox`. Its output is roadmap
|
|
71
|
+
edits and `git mv`s — no generated tree, nothing to isolate. A worktree, a
|
|
72
|
+
branch, a commit or a PR only on an explicit ask
|
|
73
|
+
([`scope-control`](../../rules/scope-control.md) § Git operations,
|
|
74
|
+
[`commit-policy`](../../rules/commit-policy.md)).
|
|
75
|
+
|
|
76
|
+
## Instructions
|
|
77
|
+
|
|
78
|
+
### 1. Live screen and inventory — cheap, every file in scope
|
|
79
|
+
|
|
80
|
+
Read live state first, never the dashboard or an earlier screen:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
agent-config roadmap:context
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Then one row per file, from commands, not from reading:
|
|
87
|
+
|
|
88
|
+
| file | folder | `[x]` | `[ ]` | `[~]` | `[-]` | parked since | resume condition | blockers | skip reason |
|
|
89
|
+
|
|
90
|
+
- **Checkbox counts** — `grep -cE '^\s*[-*] \[x\]'` and siblings, per marker.
|
|
91
|
+
A grep also counts boxes inside fenced code blocks; where a count looks off,
|
|
92
|
+
trust the dashboard parser (`collect()` in the progress generator) over it.
|
|
93
|
+
- **Parked since** — the date the file first appeared in its folder:
|
|
94
|
+
`git log --diff-filter=A --format=%ad --date=short -- <path> | tail -1`.
|
|
95
|
+
Age is a finding: a file parked eleven days ago and one parked two hundred
|
|
96
|
+
days ago are not the same decision.
|
|
97
|
+
- **Resume condition** — the `entry_condition:` mapping (`what` / `when` /
|
|
98
|
+
`who`) or a `Blocked until` / `Resume when` line, quoted verbatim. Absent on a
|
|
99
|
+
`later/` file is itself a defect, recorded in the row.
|
|
100
|
+
- **Blockers** — every `### blocker: <slug>` with its `Status:` and
|
|
101
|
+
`Resolved when`.
|
|
102
|
+
- **Skip reason** — for `skipped/`, the top-of-file reason or
|
|
103
|
+
`> Superseded by …` pointer, quoted.
|
|
104
|
+
|
|
105
|
+
A table with fewer rows than the scope has files is the first finding of the run.
|
|
106
|
+
|
|
107
|
+
### 2. Triage — first-impression disposition, all files
|
|
108
|
+
|
|
109
|
+
Add a `candidate` column to the inventory. Most files settle here cheaply:
|
|
110
|
+
|
|
111
|
+
- **Zero open, zero deferred** (`[ ]` = 0, `[~]` = 0) → `archive` candidate. The
|
|
112
|
+
file is finished or fully cancelled and only its folder is wrong.
|
|
113
|
+
- **Superseded pointer resolves** to a roadmap that exists in `archive/` or the
|
|
114
|
+
active tree → `archive` candidate, with the pointer as its reason.
|
|
115
|
+
- **Resume condition names a PR, an ADR, a file, or a merged branch** → it is
|
|
116
|
+
mechanically checkable; Phase 3 runs it first.
|
|
117
|
+
- **Resume condition names only an owner decision or a calendar date** → read
|
|
118
|
+
the decision record (`agents/roadmaps/` `## Decisions` tables, ADRs) and the
|
|
119
|
+
date; a past date with no recorded decision is a `re-park` or an escalation,
|
|
120
|
+
never a silent pass.
|
|
121
|
+
|
|
122
|
+
Show the table before any edit. `--triage-only` ends the run here.
|
|
123
|
+
|
|
124
|
+
### 3. Verify — the load-bearing phase, up to `--batch` files
|
|
125
|
+
|
|
126
|
+
Order the deep pass: mechanically-checkable resume conditions first, then
|
|
127
|
+
`later/` by age (oldest first), then `skipped/`. Delegate when more than ~4 files
|
|
128
|
+
survive — one subagent per file, told to verify against the tree and **write no
|
|
129
|
+
repo files**; their return is a reading, re-checked against the file before any
|
|
130
|
+
edit ([`delegation-policy`](../../rules/delegation-policy.md)).
|
|
131
|
+
|
|
132
|
+
Per file, three checks:
|
|
133
|
+
|
|
134
|
+
**3a. Execute the resume condition and every blocker's `Resolved when` as a
|
|
135
|
+
check** — never trust a `Status:` word, which records the past:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
gh pr view <n> --json state,mergedAt # "PR X merged"
|
|
139
|
+
ls docs/decisions/ADR-NNN-*.md # "the ADR exists"
|
|
140
|
+
git log --oneline origin/main -- <path> # "<file> landed on main"
|
|
141
|
+
grep -n '<key>' <file> # "<key> exists"
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Verdict per condition: `met` · `unmet` · `unverifiable` (with the one line why).
|
|
145
|
+
|
|
146
|
+
**3b. Verify every open `[ ]` and deferred `[~]` step against the current tree**,
|
|
147
|
+
with a `file:line` or command output for what was checked:
|
|
148
|
+
|
|
149
|
+
`already-shipped` · `still-needed` · `obsolete` (the target it acts on no longer
|
|
150
|
+
exists or was superseded) · `unverifiable`
|
|
151
|
+
|
|
152
|
+
Search wide: an open step in a parked roadmap was frequently shipped by a
|
|
153
|
+
*different* roadmap. `grep` the step's named file, flag, key or command across
|
|
154
|
+
`src/`, `docs/`, and `agents/roadmaps/archive/` before calling it `still-needed`.
|
|
155
|
+
|
|
156
|
+
**3c. Re-test the parking reason itself.** For `later/`: is the gate the file
|
|
157
|
+
names still the real gate, or has the blocking work moved (a dependency now
|
|
158
|
+
merged, a decision now recorded, a benchmark now runnable)? For `skipped/`: does
|
|
159
|
+
the skip reason still hold — is the superseding roadmap real, is the rejected
|
|
160
|
+
scope still rejected, or has a later inbox round or decision asked for this
|
|
161
|
+
again ([`recurring-criticism`](../../rules/recurring-criticism.md) owns a repeat)?
|
|
162
|
+
|
|
163
|
+
### 4. Decide — exactly one disposition per file
|
|
164
|
+
|
|
165
|
+
| Disposition | When | What it writes |
|
|
166
|
+
|---|---|---|
|
|
167
|
+
| **promote** | resume condition `met` or no longer a gate, and ≥ 1 step `still-needed` that an agent can execute now — for a `skipped/` file, only after the council ruled the rejection no longer holds (below) | `git mv` to `agents/roadmaps/`, steps adapted to the current tree (below), the active-tree shape (below), a `> Promoted from <folder>/ on YYYY-MM-DD: <condition met + evidence>` line under the title |
|
|
168
|
+
| **absorb** | the surviving steps belong to an active roadmap already covering the area | the steps copied into that roadmap as a new phase or step block, each tagged `<!-- from: <parked-slug> -->`; the target's Risk Register `reviewed:` re-stamped (a new phase is a substantial change); then the parked file is **archived** with a pointer to where its items went |
|
|
169
|
+
| **archive** | every open/deferred step is `already-shipped` or absorbed, and no blocker is still open — or the file is finished and only misfiled | shipped steps flipped to `[x]` with `<!-- shipped: <file:line or PR> -->`, `status: archived`, `git mv` to `archive/`, a `> Archived from <folder>/ on YYYY-MM-DD by /roadmap:triage-parked: <reason>` line |
|
|
170
|
+
| **re-park** | the gate is real and still `unmet` | stays in place; the resume condition rewritten as a **checkable** `entry_condition:` mapping (`what` / `when` / `who`), a `review_by: YYYY-MM-DD` in the frontmatter, a `> Last triaged: YYYY-MM-DD — <verdict of 3a>` line, shipped steps still flipped to `[x]` |
|
|
171
|
+
| **owner-decision** | the only thing between the file and a disposition is a decision an agent may not take — any step judged `obsolete` (cancelling it is `[-]`, owner-reserved), or a gate in the [`decision-revisit-gate`](../../rules/decision-revisit-gate.md) owner-reserved set | stays in place; the question written onto the file with the candidate dispositions, and the item put to the owner (Output 1) |
|
|
172
|
+
|
|
173
|
+
**Adapting a promoted or absorbed step to the current tree** is the point of the
|
|
174
|
+
command, not a nicety. Rewrite each `still-needed` step so it would execute
|
|
175
|
+
against today's tree — renamed paths, moved scripts, changed commands, current
|
|
176
|
+
gate names — and tag it `<!-- adapted: <what changed> -->` so a reader can tell
|
|
177
|
+
an update from a transcription. A step that cannot be made executable becomes a
|
|
178
|
+
`[ ]` investigation step stating what is unknown, never the stale wording.
|
|
179
|
+
|
|
180
|
+
**The active-tree shape a promoted file must have.** `later/` and `skipped/` are
|
|
181
|
+
exempt from the gates that read the active tree; a promoted file is not. Before
|
|
182
|
+
it lands at the top level it carries at least one `## Phase` heading with a
|
|
183
|
+
checkbox step under each (`check_roadmap_trackable`), a `## Risk Register` with a
|
|
184
|
+
current `reviewed:` date (`lint_plan_risk_register`), and it passes
|
|
185
|
+
`lint_roadmap_family_cap`, `lint_roadmap_complexity` and `lint_roadmap_ci_steps`.
|
|
186
|
+
Set `status: ready` only when all of that is written. A file whose plan needs
|
|
187
|
+
more rework than that is promoted as `status: draft` — off the dashboard and the
|
|
188
|
+
risk-register gate until the owner flips it.
|
|
189
|
+
|
|
190
|
+
**Constraints that come with the folder, not with the decision:**
|
|
191
|
+
|
|
192
|
+
- **Reviving a `skipped/` file reopens a recorded rejection.** It goes to the
|
|
193
|
+
council first per [`decision-revisit-gate`](../../rules/decision-revisit-gate.md)
|
|
194
|
+
(mechanism-match, then the five steps), and to the owner when the transition
|
|
195
|
+
lands in the owner-reserved set. 3c's evidence is the input; the verdict is
|
|
196
|
+
recorded on the file before the `git mv`.
|
|
197
|
+
- **`skipped/` → `archive/` is legitimate here** once 3c confirms the file holds
|
|
198
|
+
nothing to resume. This widens `archive/` from "work happened" to "nothing left
|
|
199
|
+
to do here", deliberately: the folder that must stay small is the one nobody
|
|
200
|
+
reads, and the `> Archived from skipped/` line carries the original skip reason
|
|
201
|
+
forward verbatim, so the rejection stays on record.
|
|
202
|
+
- **Deferred `[~]` steps never follow a file into `archive/` silently** —
|
|
203
|
+
[`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md) Iron Law 3
|
|
204
|
+
applies unchanged. Each one is `already-shipped` (flip to `[x]`), or absorbed /
|
|
205
|
+
carried, and then annotated in the source step as
|
|
206
|
+
`<!-- deferred-resolution: merged-into=<slug> -->` or
|
|
207
|
+
`<!-- deferred-resolution: carried-to=<slug> -->` (a carried-to target also
|
|
208
|
+
carries `parent_roadmap: <source-slug>`). A bare `[~]` in `archive/` reds
|
|
209
|
+
`lint_deferral_integrity`.
|
|
210
|
+
- **Blockers resolve before their file moves.** A blocker whose `Resolved when`
|
|
211
|
+
ran `met` in 3a gets `- **Status:** resolved` — the only closing token
|
|
212
|
+
`lint_roadmap_blockers` and the estate count accept. A file with a blocker
|
|
213
|
+
still open is not archived; it is promoted with the blocker, re-parked, or put
|
|
214
|
+
to the owner.
|
|
215
|
+
- **Promotion never lifts a blocker.** A promoted roadmap keeps every blocker
|
|
216
|
+
whose `Resolved when` is still `unmet`, and a blocker marked owner-reserved
|
|
217
|
+
stays so; the file is active because *some* step is executable now, not
|
|
218
|
+
because the gate went away.
|
|
219
|
+
- **Promote only what is executable now.** If every surviving step is gated,
|
|
220
|
+
the answer is `re-park`, however old the file is — the
|
|
221
|
+
[Active vs. Later test](../../skills/roadmap-management/references/archival.md)
|
|
222
|
+
is unchanged.
|
|
223
|
+
|
|
224
|
+
### 5. Apply — the mechanics that red CI if skipped
|
|
225
|
+
|
|
226
|
+
In this order, after all decisions of the batch are taken:
|
|
227
|
+
|
|
228
|
+
1. `git mv` each moved file and fix its own outgoing relative links:
|
|
229
|
+
`later/` or `skipped/` → top level removes exactly one `../` from each;
|
|
230
|
+
`later/` or `skipped/` → `archive/` changes none. Migrate inbound references
|
|
231
|
+
to the new path (`grep -rn '<slug>' agents/ docs/ src/`).
|
|
232
|
+
2. Frontmatter: a file leaving `later/` must not keep `status: later` —
|
|
233
|
+
`lint_roadmap_later_disposition` reads the word, not the folder. Archived →
|
|
234
|
+
`status: archived`; promoted → `status: ready` or `draft` (step 4).
|
|
235
|
+
3. **Estate ratchet — a promotion is an addition.** `check_estate_count` reads a
|
|
236
|
+
`later/x.md` → `x.md` move as a new active roadmap on both halves, and only a
|
|
237
|
+
move of an *active top-level* roadmap out of the tree offsets it — archiving
|
|
238
|
+
a parked file lowers `later_roadmaps`, never `active_roadmaps`. So each
|
|
239
|
+
promoted file needs its own `estate_offset_exempt: <reason>` written in this
|
|
240
|
+
change; the reason must name the disposition rejected instead (archive, park,
|
|
241
|
+
merge — `_lib/exemption_shape.ts`), e.g. *"promoted from later/: resume
|
|
242
|
+
condition met (PR #N); not re-parked because …; not merged because …"*. Many
|
|
243
|
+
parked files already carry an old `estate_offset_exempt` — **replace** it,
|
|
244
|
+
never inherit a reason written for a different event. The gate reads
|
|
245
|
+
`<base>...HEAD`, so it sees only committed changes: run it after the change is
|
|
246
|
+
committed, and read its `this change +N active / -M disposed, K exempt` line,
|
|
247
|
+
where `K` must equal `N`.
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
./scripts-run src/scripts/check_estate_count
|
|
251
|
+
```
|
|
252
|
+
4. Regenerate: `./agent-config roadmap:progress --no-archive` (dashboard — the
|
|
253
|
+
flag keeps it from sweeping unrelated finished roadmaps into this change) and
|
|
254
|
+
`./scripts-run src/scripts/build_archive_index` (archive index — nothing else
|
|
255
|
+
in the archival path regenerates it).
|
|
256
|
+
5. Run the lints that read what moved: `lint_roadmap_later_disposition`,
|
|
257
|
+
`lint_roadmap_blockers`, `lint_deferral_integrity`, `check_no_roadmap_refs`,
|
|
258
|
+
`check_estate_count`, and — for every promoted or absorbing file —
|
|
259
|
+
`check_roadmap_trackable`, `lint_plan_risk_register`,
|
|
260
|
+
`lint_roadmap_family_cap`, `lint_roadmap_complexity`, `lint_roadmap_ci_steps`.
|
|
261
|
+
Draining `later/` loosens ratchets: when `lint_roadmap_later_disposition`
|
|
262
|
+
reports a baseline as loose, lower it in the same change. A drop below a
|
|
263
|
+
`min_scanned` floor in `src/config/gate-coverage.yml` is the corpus shrinking,
|
|
264
|
+
not a regression — lower the floor with the evidence in its note.
|
|
265
|
+
|
|
266
|
+
### 6. Close the run
|
|
267
|
+
|
|
268
|
+
Re-read every edited file once against the decision table (pass 3 of the
|
|
269
|
+
inbox discipline): each `[x]` flip carries its evidence, each promoted step its
|
|
270
|
+
`adapted` tag, each archived file its reason line. A disposition the file does
|
|
271
|
+
not carry is not applied.
|
|
272
|
+
|
|
273
|
+
## Output
|
|
274
|
+
|
|
275
|
+
1. **Owner decisions required**, if any — at the top: the list of every pending
|
|
276
|
+
item (file, question, candidate dispositions), then **one** numbered-options
|
|
277
|
+
question for the most blocking item; the rest are asked one per turn after
|
|
278
|
+
it is answered ([`user-interaction`](../../rules/user-interaction.md),
|
|
279
|
+
[`ask-when-uncertain`](../../rules/ask-when-uncertain.md)). Each question is
|
|
280
|
+
also written onto its file, so the next run finds it posed.
|
|
281
|
+
2. The inventory table (every file in scope) with the `candidate` column.
|
|
282
|
+
3. Per deep-checked file: resume-condition verdicts, the step verification table,
|
|
283
|
+
the disposition and what was written.
|
|
284
|
+
4. **The disposition ledger — the run's completeness check:**
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
scope N files (later: L, skipped: S) · deep-checked: D · deferred to next batch: R
|
|
288
|
+
promote n → <paths>
|
|
289
|
+
absorb n → <parked> → <target roadmap>
|
|
290
|
+
archive n → <paths>
|
|
291
|
+
re-park n → <paths, with the refreshed condition>
|
|
292
|
+
owner n → <paths>
|
|
293
|
+
steps N verified → already-shipped / still-needed / obsolete / unverifiable
|
|
294
|
+
folders later/: before → after · skipped/: before → after
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Deep-checked files must sum to their dispositions. Files past the batch cap
|
|
298
|
+
are named in `deferred to next batch`, never silently absent.
|
|
299
|
+
5. One closing summary: how many files left each folder, how many steps were
|
|
300
|
+
prevented by `already-shipped`, and which gate the run is waiting on next.
|
|
301
|
+
|
|
302
|
+
## Honest enforcement — `instruction-only`
|
|
303
|
+
|
|
304
|
+
No gate checks that a resume condition was executed rather than read, or that an
|
|
305
|
+
`already-shipped` flip was verified. The ledger is the control: it carries
|
|
306
|
+
numbers and `file:line` evidence a reviewer can challenge after the fact. The
|
|
307
|
+
folder-placement and estate gates named in step 5 catch a malformed **move**;
|
|
308
|
+
they cannot see a wrong **decision**.
|
|
309
|
+
|
|
310
|
+
## Do NOT
|
|
311
|
+
|
|
312
|
+
- Promote a roadmap because it is old. Age is evidence that the parking reason
|
|
313
|
+
went unchecked, not evidence that it stopped holding.
|
|
314
|
+
- Archive a file with `still-needed` steps that were neither absorbed nor
|
|
315
|
+
carried into a follow-up.
|
|
316
|
+
- Write `[-]` to make a file archivable. An obsolete step is a finding put to
|
|
317
|
+
the owner; the agent never cancels one.
|
|
318
|
+
- Re-park with the same prose condition. If it could not be checked this run, it
|
|
319
|
+
will not be checked next run either — rewrite it as an `entry_condition:`.
|
|
320
|
+
- Execute a promoted roadmap in the same run — triage authorizes moving and
|
|
321
|
+
rewriting plans, not doing their work
|
|
322
|
+
([`scope-control`](../../rules/scope-control.md) § Authoring vs. implementation).
|
|
323
|
+
`/roadmap:next` or `/roadmap:process-full` picks it up afterwards.
|
|
324
|
+
- Resolve an owner-reserved gate into an accurate paragraph. Past the decision
|
|
325
|
+
the agent cannot take, the output is the escalation block.
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
model_tier: medium
|
|
3
3
|
name: roadmap
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
-
argument-hint: "[create|ai-council|process-step|process-phase|process-full|next] [args]"
|
|
5
|
+
argument-hint: "[create|ai-council|process-step|process-phase|process-full|next|triage-parked|resolve-blockers] [args]"
|
|
6
6
|
pack: product-basic
|
|
7
|
-
intent: "Roadmap dispatcher — create, process-step, process-phase, process-full, next, ai-council"
|
|
8
|
-
routes_to: [roadmap-create, roadmap-ai-council, roadmap-materialize, roadmap-process-step, roadmap-process-phase, roadmap-process-full, roadmap-next]
|
|
7
|
+
intent: "Roadmap dispatcher — create, process-step, process-phase, process-full, next, triage-parked, resolve-blockers, ai-council"
|
|
8
|
+
routes_to: [roadmap-create, roadmap-ai-council, roadmap-materialize, roadmap-process-step, roadmap-process-phase, roadmap-process-full, roadmap-next, roadmap-triage-parked, roadmap-resolve-blockers]
|
|
9
9
|
replaces: []
|
|
10
10
|
visibility: advanced
|
|
11
|
-
description: Roadmap orchestrator —
|
|
11
|
+
description: Roadmap orchestrator — create (authoring), process-step / -phase / -full (execution), next (pick and ship), triage-parked (later/, skipped/), resolve-blockers.
|
|
12
12
|
cluster: roadmap
|
|
13
13
|
type: orchestrator
|
|
14
14
|
suggestion:
|
|
@@ -40,6 +40,8 @@ paused for confirmation before every step) was removed —
|
|
|
40
40
|
| `/roadmap:process-phase` (**default execution scope**) | `commands/roadmap/process-phase.md` | Autonomously process every open step in the current phase |
|
|
41
41
|
| `/roadmap:process-full` | `commands/roadmap/process-full.md` | Autonomously process every open step across every phase; `--all` iterates the whole active estate, `--worktree` isolates the workspace |
|
|
42
42
|
| `/roadmap:next` | `commands/roadmap/next.md` | Screen for the next executable roadmap, then carry it to a reviewable PR (selection + `process-full` + delivery) |
|
|
43
|
+
| `/roadmap:triage-parked` | `commands/roadmap/triage-parked.md` | Re-check every roadmap in `later/` and `skipped/` against the current tree; promote, absorb, archive, or re-park each one |
|
|
44
|
+
| `/roadmap:resolve-blockers` | `commands/roadmap/resolve-blockers.md` | Check every open blocker, close what the tree settled, decide the rest in the AI council, ask the owner one question at a time |
|
|
43
45
|
|
|
44
46
|
Sub-command names match the locked contract in
|
|
45
47
|
[`docs/contracts/command-clusters.md`](../docs/contracts/command-clusters.md).
|
|
@@ -71,6 +73,8 @@ each only binds a scope delta.
|
|
|
71
73
|
> 4. process-phase — process the current phase (default)
|
|
72
74
|
> 5. process-full — process every open step across every phase
|
|
73
75
|
> 6. next — pick the next executable roadmap and ship it to a PR
|
|
76
|
+
> 7. triage-parked — drain later/ and skipped/ against the current tree
|
|
77
|
+
> 8. resolve-blockers — check and resolve open roadmap blockers, council first
|
|
74
78
|
|
|
75
79
|
## Rules
|
|
76
80
|
|
|
@@ -91,3 +95,13 @@ each only binds a scope delta.
|
|
|
91
95
|
[`/roadmap:next`](roadmap/next.md), which is the only sub that
|
|
92
96
|
screens and selects. The three `process-*` subs never choose across
|
|
93
97
|
roadmaps.
|
|
98
|
+
- **Parked-estate intents** (*"go through later/ and skipped/"*, *"geh die
|
|
99
|
+
geparkten Roadmaps durch"*, *"which parked roadmaps are unblocked now?"*) route
|
|
100
|
+
to [`/roadmap:triage-parked`](roadmap/triage-parked.md) — the only sub that
|
|
101
|
+
reads `later/` and `skipped/`. It moves and rewrites plans; it never executes
|
|
102
|
+
one.
|
|
103
|
+
- **Blocker intents** (*"resolve the blockers"*, *"lös die Blocker auf"*,
|
|
104
|
+
*"which blockers still need me?"*) route to
|
|
105
|
+
[`/roadmap:resolve-blockers`](roadmap/resolve-blockers.md) — council first,
|
|
106
|
+
the owner one question at a time. It decides and records; it never executes
|
|
107
|
+
the unblocked work.
|
|
@@ -5,7 +5,7 @@ pack: engineering-base
|
|
|
5
5
|
visibility: internal
|
|
6
6
|
cluster: tests
|
|
7
7
|
sub: create
|
|
8
|
-
skills: [test-case-discovery,
|
|
8
|
+
skills: [test-case-discovery, quality-tools]
|
|
9
9
|
description: Write meaningful tests for the current branch — stack-adaptive (pest / phpunit / vitest / jest / pytest / …)
|
|
10
10
|
suggestion:
|
|
11
11
|
eligible: false
|
|
@@ -27,7 +27,18 @@ tests in the framework the project actually uses, never a hard-coded one:
|
|
|
27
27
|
|
|
28
28
|
- **PHP** → Pest (`pestphp/pest`) or PHPUnit.
|
|
29
29
|
- **JS/TS** → Vitest or Jest. **Python** → pytest. **Go** → `testing`.
|
|
30
|
-
**Rust** → `#[test]`.
|
|
30
|
+
**Rust** → `#[test]`. **Ruby** → RSpec. **JVM** → JUnit.
|
|
31
|
+
**.NET** → `dotnet test`.
|
|
32
|
+
|
|
33
|
+
**The resolver is the only stack authority, and `skills:` deliberately names
|
|
34
|
+
no single-stack skill.** Binding `pest-testing` unconditionally made a
|
|
35
|
+
React-only repository load PHP testing guidance before it reached the sentence
|
|
36
|
+
above telling it not to, and a static list cannot express a per-repository
|
|
37
|
+
answer. So the frontmatter keeps only stack-neutral skills and the load is
|
|
38
|
+
**resolver-conditional**: once step 1 has named the runner, load the skill for
|
|
39
|
+
THAT runner if one exists — `pest-testing` for pest, `laravel` for
|
|
40
|
+
`php artisan test`, `playwright-testing` for playwright. Unconditional became
|
|
41
|
+
conditional; it did not become nothing.
|
|
31
42
|
|
|
32
43
|
Then read the existing tests under the project's test directory to match
|
|
33
44
|
the style and conventions already in use (assertion shape, naming, fixtures).
|
|
@@ -95,7 +106,10 @@ funnel per changed behavior — enumerate first, write second:
|
|
|
95
106
|
|
|
96
107
|
### 7. Verify
|
|
97
108
|
|
|
98
|
-
- Run the tests locally
|
|
109
|
+
- Run the tests locally with the command step 1 resolved — the same runner the
|
|
110
|
+
tests were written for. Reach for a container only when the resolved stack
|
|
111
|
+
calls for one, exactly as `/tests execute` branches on the resolved tool
|
|
112
|
+
before reaching for Docker.
|
|
99
113
|
- If a test fails, fix it — don't just delete it.
|
|
100
114
|
|
|
101
115
|
### Rules
|
|
@@ -5,7 +5,7 @@ pack: engineering-base
|
|
|
5
5
|
visibility: internal
|
|
6
6
|
cluster: tests
|
|
7
7
|
sub: execute
|
|
8
|
-
skills: [
|
|
8
|
+
skills: [quality-tools]
|
|
9
9
|
description: Run the project's test suite — stack-adaptive (pest / phpunit / vitest / jest / pytest / …)
|
|
10
10
|
argument-hint: "[file | filter] [--include-e2e] [--include-slow] [--php]"
|
|
11
11
|
suggestion:
|
|
@@ -31,6 +31,19 @@ returns the runner(s) to invoke per ecosystem:
|
|
|
31
31
|
phpunit (`vendor/bin/phpunit`).
|
|
32
32
|
- **JS/TS** → vitest (`npx vitest run`) or jest (`npx jest`).
|
|
33
33
|
- **Python** → pytest. **Go** → `go test ./...`. **Rust** → `cargo test`.
|
|
34
|
+
- **Ruby** → rspec (`bundle exec rspec`). **JVM** → junit (`./gradlew test`,
|
|
35
|
+
`./mvnw test`). **.NET** → `dotnet test`.
|
|
36
|
+
|
|
37
|
+
**The resolver is the only stack authority, and `skills:` deliberately names
|
|
38
|
+
no single-stack skill.** The frontmatter used to bind `pest-testing` unconditionally, which
|
|
39
|
+
contradicted the sentence directly above it: a React-only repository was handed
|
|
40
|
+
PHP testing guidance before it read the instruction not to hard-code a stack.
|
|
41
|
+
A static list cannot express a per-repository answer, so the frontmatter keeps
|
|
42
|
+
only the stack-neutral `quality-tools` and the load is
|
|
43
|
+
**resolver-conditional**: once step 1 has named the runner, load the skill for
|
|
44
|
+
THAT runner if one exists — `pest-testing` for pest, `laravel` for
|
|
45
|
+
`php artisan test`, `playwright-testing` for playwright (selected under
|
|
46
|
+
`--include-e2e`). Unconditional became conditional; it did not become nothing.
|
|
34
47
|
|
|
35
48
|
**Wrappers win.** When a `Makefile`/`Taskfile.yml` `test:` target or a
|
|
36
49
|
`package.json` `test` script exists, the resolver returns the wrapper
|
|
@@ -52,11 +65,15 @@ ask interactively, or emit `ambiguous_routing` in CI.
|
|
|
52
65
|
`vendor/bin/phpunit`) → run **inside the PHP Docker container**
|
|
53
66
|
(`docker compose exec -T <service> ...`); detect the service from
|
|
54
67
|
`docker-compose.yml` / `compose.yaml` (see `rules/docker-commands.md`).
|
|
55
|
-
- **
|
|
56
|
-
|
|
68
|
+
- **Every other direct tool** — JS, Python, Go, Rust, Ruby
|
|
69
|
+
(`bundle exec rspec`, or bare `rspec` with no Gemfile), JVM
|
|
70
|
+
(`./gradlew test` / `./mvnw test`), .NET (`dotnet test`) → run on the host,
|
|
71
|
+
or in the relevant container when the project containerises it. PHP is the
|
|
72
|
+
only ecosystem with a standing container rule.
|
|
57
73
|
- If the user named a specific file or filter, pass it through the
|
|
58
|
-
resolved runner's native flag
|
|
59
|
-
|
|
74
|
+
resolved runner's native flag: `--filter=…` or a path for pest/phpunit, a
|
|
75
|
+
path or `-t` for vitest/jest, a node-id for pytest, `-e`/a path for rspec,
|
|
76
|
+
`--tests`/`-Dtest=` for gradle/maven, `--filter` for `dotnet test`.
|
|
60
77
|
- No specific test requested → run the resolved fast suite.
|
|
61
78
|
|
|
62
79
|
### 3. Analyze results
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Decision Revisit Gate — Enforcement Reach
|
|
2
|
+
|
|
3
|
+
Loaded by [`decision-revisit-gate`](../../rules/decision-revisit-gate.md).
|
|
4
|
+
The honest-enforcement record moved out of the rule verbatim: why the gate
|
|
5
|
+
ships `instruction-only`, and the two reach limits a consumer install has.
|
|
6
|
+
|
|
7
|
+
## Honest enforcement — `instruction-only`
|
|
8
|
+
|
|
9
|
+
`adr_cite_check` is deterministic where it runs, and nothing makes it run. No
|
|
10
|
+
gate can observe an agent citing a decision it never opened, so step 2 above is
|
|
11
|
+
model-carried — the same honesty boundary
|
|
12
|
+
[`security-sensitive-stop`](security-sensitive-stop.md) and
|
|
13
|
+
[`active-remediation`](active-remediation.md) state for their own obligations.
|
|
14
|
+
|
|
15
|
+
Two reach limits, named rather than implied. The tool lives in this repository's
|
|
16
|
+
`src/scripts/` and is **not** exposed as an `agent-config` verb, so a consumer
|
|
17
|
+
install performs step 2 by hand; wiring the verb touches six further surfaces
|
|
18
|
+
plus the curated `dist/agent-src/scripts/` list and is deliberately out of this
|
|
19
|
+
change. And `docs/decisions/` is projected into no agent-visible tree at all —
|
|
20
|
+
the agent sees ADR *numbers* cited across rules and skills, almost never ADR
|
|
21
|
+
*text*. Until that changes, "evaluate before citing" means opening the file.
|
|
22
|
+
|
|
23
|
+
`docs/contracts/` is unprojected on the same terms (`dist/agent-src/` carries no
|
|
24
|
+
`docs/`), so the burden table this rule points at is maintainer-reachable only.
|
|
25
|
+
That is why the reserved-set table above stays here rather than becoming a
|
|
26
|
+
pointer: a consumer install receives these lines and not the contract.
|
|
27
|
+
|
|
28
|
+
## Why the council is the default venue — the measurement
|
|
29
|
+
|
|
30
|
+
The old "offers the user a
|
|
31
|
+
path" wording made every lock an owner interrupt; measured across 26 days of
|
|
32
|
+
transcripts, the agent reported a lock and waited while the owner voided the
|
|
33
|
+
decision retroactively — twice with the lock report timestamped **before** the
|
|
34
|
+
override demand. The ordering was the defect; the permission was never missing.
|
|
35
|
+
|
|
36
|
+
## Why the five steps are inlined rather than only routed
|
|
37
|
+
|
|
38
|
+
The five are stated here, not only behind a route, because the route was
|
|
39
|
+
measurably unreachable: `decision-review` ships `install.default: false` in the
|
|
40
|
+
non-default `analysis-workbench` pack, so a pack-legal install received the
|
|
41
|
+
obligation and not the procedure. `routes_to` now names two always-on skills;
|
|
42
|
+
the backward-audit depth in
|
|
43
|
+
`decision-review` stays optional.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Design Fidelity — Enforcement Reach
|
|
2
|
+
|
|
3
|
+
Loaded by [`design-fidelity`](../../../rules/design-fidelity.md). The
|
|
4
|
+
honest-enforcement record moved out of the rule verbatim.
|
|
5
|
+
|
|
6
|
+
## Honest enforcement — `instruction-only`
|
|
7
|
+
|
|
8
|
+
Nothing records a fidelity comparison. The estate's two design linters measure
|
|
9
|
+
generic AI-aesthetic tells (`lint_design_slop`) and accessibility
|
|
10
|
+
(`lint_design_quality`); neither opens the handover, so nothing can tell a
|
|
11
|
+
proven 1:1 from an asserted one. The proof clause in the Iron Law is therefore
|
|
12
|
+
model-carried, and the committed matrix
|
|
13
|
+
([`design-review`](../skills/design-review/SKILL.md) § Fidelity proof) is the
|
|
14
|
+
control — a reviewer can open it, which is more than any gate here does.
|
|
15
|
+
|
|
16
|
+
## Routing — why each trigger class is shaped as it is
|
|
17
|
+
|
|
18
|
+
Every class carries its own near-miss row in `ROUTING_MATRIX`
|
|
19
|
+
([`design_fidelity_routing.test.ts`](../../tests/scripts/design_fidelity_routing.test.ts)),
|
|
20
|
+
and the row must test the direction the NEW trigger opens, not one that was
|
|
21
|
+
already closed — apply that before writing a trigger, not after. Why each class
|
|
22
|
+
is shaped as it is, why `*.html` and a bare builder host are refused, and the
|
|
23
|
+
worked example behind the direction rule:
|
|
24
|
+
[`design-fidelity-routing`](../../../guidelines/design-fidelity-routing.md).
|
|
@@ -224,7 +224,7 @@ NEVER A SILENTLY DEGRADED ANSWER. NO LLM CLASSIFIER FALLBACK (CUT C3).
|
|
|
224
224
|
|
|
225
225
|
| Task pattern | Lookup class | Primitive |
|
|
226
226
|
|---|---|---|
|
|
227
|
-
| "where is X defined" / "confirm X's definition location" | `definition` | capped `rg` (definition-shaped patterns, `--max-count`); `code_graph query` only as an opportunistic accelerant when an index is present + fresh
|
|
227
|
+
| "where is X defined" / "confirm X's definition location" | `definition` | capped `rg` (definition-shaped patterns, `--max-count`); `code_graph query` only as an opportunistic accelerant when an index is present + fresh (`hooks.code_graph.enabled` gates nothing — it is inert) |
|
|
228
228
|
| "who calls / imports X" / "confirm call sites" | `references` | capped `rg` (reference-shaped patterns); same optional `code_graph affected` accelerant clause |
|
|
229
229
|
| "does string Y exist" / "probe candidate strings" | `string-existence` | FTS one-shot (`memory_lookup` for the knowledge corpus) or capped `rg -n --max-count` for the codebase |
|
|
230
230
|
| "run report Z" / "run check_*" | `report-run` | direct script run, wrapped per the **measured** rtk allowlist (`internal/bench/rtk-savings/RESULTS.md` — wrap only the ~55%-savings class) |
|
|
@@ -232,11 +232,11 @@ NEVER A SILENTLY DEGRADED ANSWER. NO LLM CLASSIFIER FALLBACK (CUT C3).
|
|
|
232
232
|
**Why rg-first** (council 2026-07-28, 2 rounds): the pre-registered benchmark
|
|
233
233
|
behind the `code-graph-retrieval-null` claim (`docs/CLAIMS.md`) measured
|
|
234
234
|
native-graph recall 0.365 vs grep 0.797 on graph-shaped questions — an
|
|
235
|
-
indexing gap that kept `code_graph.enabled` false BY DEFAULT until
|
|
236
|
-
was
|
|
237
|
-
|
|
238
|
-
clause above is that bound's escape hatch, reached only when a
|
|
239
|
-
usable graph, which no production caller yet does.
|
|
235
|
+
indexing gap that kept `code_graph.enabled` false BY DEFAULT until the hook it
|
|
236
|
+
gated was replaced (2026-09-07), leaving the key inert and still registered —
|
|
237
|
+
not permanently: the figures predate the 2026-08-22 extractor repair. The
|
|
238
|
+
accelerant clause above is that bound's escape hatch, reached only when a
|
|
239
|
+
caller passes a usable graph, which no production caller yet does.
|
|
240
240
|
|
|
241
241
|
**Escalation, not degradation:** a primitive that returns nothing (index miss,
|
|
242
242
|
pattern too ambiguous, report script absent) — **or an unusable result**
|
|
@@ -1056,8 +1056,38 @@ execution either way.
|
|
|
1056
1056
|
|
|
1057
1057
|
### 6a. Deferred-resolution gate — Iron Law 3
|
|
1058
1058
|
|
|
1059
|
-
|
|
1060
|
-
|
|
1059
|
+
**Default: the sweep resolves it.** `archive_completed_roadmaps --all` carries
|
|
1060
|
+
every bare `[~]` step, plus every open blocker such a step names, into a
|
|
1061
|
+
`<slug>-carried` follow-up created in the same change (`deferral_carry.ts`),
|
|
1062
|
+
annotates the parent `carried-to=<slug>`, and archives — the "carry item +
|
|
1063
|
+
blocker" council row below, executed deterministically, so a finished
|
|
1064
|
+
`/roadmap:process-full` run ends archived instead of parked at 100 %. The
|
|
1065
|
+
manual flow below applies only to what the sweep refuses: an open blocker no
|
|
1066
|
+
deferred step names, a hand-written annotation that fails validation, or a run
|
|
1067
|
+
with `--no-carry`.
|
|
1068
|
+
|
|
1069
|
+
**Owner-dependent blockers stop the carry.** When a carried step names a blocker
|
|
1070
|
+
whose `Owner:` is the human (`maintainer` / `user` / `owner`, or any value that is
|
|
1071
|
+
not `implementer` / `council` / `agent` / `ai`), the sweep writes nothing and
|
|
1072
|
+
prints a `❓` block plus one `OWNER-DECISION {json}` line. Put that decision to
|
|
1073
|
+
the owner as ONE numbered-options question, never resolve it yourself:
|
|
1074
|
+
|
|
1075
|
+
1. **Archive it** — run the printed `archive_command` (`… --owner-decision later --only <roadmap>`):
|
|
1076
|
+
the parent archives, the steps and their blockers park in
|
|
1077
|
+
`later/<slug>-carried.md`.
|
|
1078
|
+
2. **Step by step** — show the FIRST step (`first_step`, verbatim) with its
|
|
1079
|
+
blocker's question, in the same message, so the owner can answer it or push
|
|
1080
|
+
it to later in one reply. An answer → do the step, flip it, show the next
|
|
1081
|
+
one. "Later" → leave that step `[~]` and show the next one. When no step is
|
|
1082
|
+
left to show, run that `archive_command`: what is still
|
|
1083
|
+
deferred parks, the parent archives.
|
|
1084
|
+
|
|
1085
|
+
A **subagent** never answers this and never passes `--owner-decision` itself: it
|
|
1086
|
+
stops and returns the `OWNER-DECISION` line verbatim, and the orchestrator puts
|
|
1087
|
+
it to the owner. A non-interactive run ends on the question, not on a report.
|
|
1088
|
+
|
|
1089
|
+
Before any `git mv` to `archive/` the sweep refused, count `[~]` items in the
|
|
1090
|
+
closing roadmap. If `count_deferred > 0`, archival is **blocked** per
|
|
1061
1091
|
[`roadmap-progress-sync § Iron Law 3`](../../rules/roadmap-progress-sync.md).
|
|
1062
1092
|
The loop MUST:
|
|
1063
1093
|
|