@event4u/agent-config 11.0.0 → 12.1.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +173 -229
- package/agents/templates/.ai-council.yml.example +46 -3
- package/dist/agent-src/commands/agent-handoff.md +0 -1
- package/dist/agent-src/commands/agent-status.md +0 -1
- package/dist/agent-src/commands/agents/audit.md +0 -1
- package/dist/agent-src/commands/agents/init.md +0 -1
- package/dist/agent-src/commands/agents/optimize.md +0 -1
- package/dist/agent-src/commands/agents/user/accept.md +0 -1
- package/dist/agent-src/commands/agents/user/delete.md +0 -1
- package/dist/agent-src/commands/agents/user/init.md +0 -1
- package/dist/agent-src/commands/agents/user/review.md +0 -1
- package/dist/agent-src/commands/agents/user/show.md +0 -1
- package/dist/agent-src/commands/agents/user/update.md +0 -1
- package/dist/agent-src/commands/agents/user.md +0 -1
- package/dist/agent-src/commands/agents.md +0 -1
- package/dist/agent-src/commands/analytics/prune.md +0 -1
- package/dist/agent-src/commands/analytics/show.md +0 -1
- package/dist/agent-src/commands/analytics.md +0 -1
- package/dist/agent-src/commands/analyze/conformance.md +0 -1
- package/dist/agent-src/commands/analyze/decision.md +0 -1
- package/dist/agent-src/commands/analyze/inbox.md +0 -1
- package/dist/agent-src/commands/analyze/incident.md +0 -1
- package/dist/agent-src/commands/analyze/near-miss.md +0 -1
- package/dist/agent-src/commands/analyze/postmortem.md +0 -1
- package/dist/agent-src/commands/analyze/premortem.md +0 -1
- package/dist/agent-src/commands/analyze/reference-repo.md +0 -1
- package/dist/agent-src/commands/analyze.md +0 -1
- package/dist/agent-src/commands/brand/identity.md +0 -1
- package/dist/agent-src/commands/brand/review.md +0 -1
- package/dist/agent-src/commands/brand/strategy.md +0 -1
- package/dist/agent-src/commands/brand/tokens.md +0 -1
- package/dist/agent-src/commands/brand/voice.md +0 -1
- package/dist/agent-src/commands/brand.md +0 -1
- package/dist/agent-src/commands/bug/fix.md +0 -1
- package/dist/agent-src/commands/bug/investigate.md +0 -1
- package/dist/agent-src/commands/bug.md +0 -1
- package/dist/agent-src/commands/challenge-me/vision.md +0 -1
- package/dist/agent-src/commands/challenge-me/with-docs.md +0 -1
- package/dist/agent-src/commands/challenge-me.md +0 -1
- package/dist/agent-src/commands/chat-history/import.md +0 -1
- package/dist/agent-src/commands/chat-history.md +0 -1
- package/dist/agent-src/commands/check-current-md.md +0 -1
- package/dist/agent-src/commands/commit/in-chunks.md +0 -1
- package/dist/agent-src/commands/commit.md +0 -1
- package/dist/agent-src/commands/condense.md +0 -1
- package/dist/agent-src/commands/context/create.md +0 -1
- package/dist/agent-src/commands/context/refactor.md +0 -1
- package/dist/agent-src/commands/context.md +0 -1
- package/dist/agent-src/commands/contribution-precheck.md +0 -1
- package/dist/agent-src/commands/cost/profile.md +0 -1
- package/dist/agent-src/commands/cost/report.md +0 -1
- package/dist/agent-src/commands/cost.md +0 -1
- package/dist/agent-src/commands/council/analysis.md +0 -1
- package/dist/agent-src/commands/council/debate.md +0 -1
- package/dist/agent-src/commands/council/default.md +0 -1
- package/dist/agent-src/commands/council/design.md +0 -1
- package/dist/agent-src/commands/council/optimize.md +0 -1
- package/dist/agent-src/commands/council/pr.md +0 -1
- package/dist/agent-src/commands/council.md +0 -1
- package/dist/agent-src/commands/design-system/capture.md +0 -1
- package/dist/agent-src/commands/design-system/generate.md +0 -1
- package/dist/agent-src/commands/design-system/import.md +0 -1
- package/dist/agent-src/commands/design-system.md +0 -1
- package/dist/agent-src/commands/estimate-ticket.md +0 -1
- package/dist/agent-src/commands/explain-run.md +0 -1
- package/dist/agent-src/commands/feature/dev.md +0 -1
- package/dist/agent-src/commands/feature/explore.md +0 -1
- package/dist/agent-src/commands/feature/plan.md +0 -1
- package/dist/agent-src/commands/feature/refactor.md +0 -1
- package/dist/agent-src/commands/feature/roadmap.md +0 -1
- package/dist/agent-src/commands/feature.md +0 -1
- package/dist/agent-src/commands/fix/ci.md +0 -1
- package/dist/agent-src/commands/fix/comments.md +0 -1
- package/dist/agent-src/commands/fix/portability.md +0 -1
- package/dist/agent-src/commands/fix/pr-comments-loop.md +0 -1
- package/dist/agent-src/commands/fix/pr-comments.md +0 -1
- package/dist/agent-src/commands/fix/quality.md +0 -1
- package/dist/agent-src/commands/fix/refs.md +0 -1
- package/dist/agent-src/commands/fix/route.md +0 -1
- package/dist/agent-src/commands/fix/seeder.md +0 -1
- package/dist/agent-src/commands/fix.md +0 -1
- package/dist/agent-src/commands/ghostwriter/delete.md +0 -1
- package/dist/agent-src/commands/ghostwriter/fetch.md +0 -1
- package/dist/agent-src/commands/ghostwriter/list.md +0 -1
- package/dist/agent-src/commands/ghostwriter/show.md +0 -1
- package/dist/agent-src/commands/ghostwriter/write.md +0 -1
- package/dist/agent-src/commands/ghostwriter.md +0 -1
- package/dist/agent-src/commands/grill-me.md +0 -1
- package/dist/agent-src/commands/humanize.md +0 -1
- package/dist/agent-src/commands/image/analyse.md +0 -1
- package/dist/agent-src/commands/image/create.md +0 -1
- package/dist/agent-src/commands/image/verify.md +0 -1
- package/dist/agent-src/commands/image.md +0 -1
- package/dist/agent-src/commands/implement-ticket.md +0 -1
- package/dist/agent-src/commands/jira-ticket.md +0 -1
- package/dist/agent-src/commands/judge/on-diff.md +0 -1
- package/dist/agent-src/commands/judge/solo.md +0 -1
- package/dist/agent-src/commands/judge/steps.md +0 -1
- package/dist/agent-src/commands/judge.md +0 -1
- package/dist/agent-src/commands/knowledge/cross-repo.md +0 -1
- package/dist/agent-src/commands/knowledge/forget.md +0 -1
- package/dist/agent-src/commands/knowledge/ingest.md +0 -1
- package/dist/agent-src/commands/knowledge/list.md +0 -1
- package/dist/agent-src/commands/knowledge.md +0 -1
- package/dist/agent-src/commands/memory/add.md +0 -1
- package/dist/agent-src/commands/memory/learn-low-impact.md +0 -1
- package/dist/agent-src/commands/memory/load.md +0 -1
- package/dist/agent-src/commands/memory/mine-session.md +0 -1
- package/dist/agent-src/commands/memory/promote.md +0 -1
- package/dist/agent-src/commands/memory/propose.md +0 -1
- package/dist/agent-src/commands/memory.md +0 -1
- package/dist/agent-src/commands/mission/upgrade.md +0 -1
- package/dist/agent-src/commands/mode.md +0 -1
- package/dist/agent-src/commands/module/create.md +0 -1
- package/dist/agent-src/commands/module/explore.md +0 -1
- package/dist/agent-src/commands/module.md +0 -1
- package/dist/agent-src/commands/optimize/agents-dir.md +0 -1
- package/dist/agent-src/commands/optimize/augmentignore.md +0 -1
- package/dist/agent-src/commands/optimize/deep.md +0 -1
- package/dist/agent-src/commands/optimize/project.md +0 -1
- package/dist/agent-src/commands/optimize/prompt.md +0 -1
- package/dist/agent-src/commands/optimize/rtk.md +0 -1
- package/dist/agent-src/commands/optimize/skills.md +0 -1
- package/dist/agent-src/commands/optimize.md +0 -1
- package/dist/agent-src/commands/orchestrate.md +0 -1
- package/dist/agent-src/commands/override/create.md +0 -1
- package/dist/agent-src/commands/override/manage.md +0 -1
- package/dist/agent-src/commands/override.md +0 -1
- package/dist/agent-src/commands/package/reset.md +0 -1
- package/dist/agent-src/commands/package/test.md +0 -1
- package/dist/agent-src/commands/package.md +0 -1
- package/dist/agent-src/commands/post-as/ghostwriter.md +0 -1
- package/dist/agent-src/commands/post-as/me.md +0 -1
- package/dist/agent-src/commands/post-as.md +0 -1
- package/dist/agent-src/commands/pr/create/description-only.md +0 -1
- package/dist/agent-src/commands/pr/create.md +23 -9
- package/dist/agent-src/commands/prediction-pool.md +0 -1
- package/dist/agent-src/commands/prepare-for-review.md +0 -1
- package/dist/agent-src/commands/profile/activate.md +0 -1
- package/dist/agent-src/commands/profile/deactivate.md +0 -1
- package/dist/agent-src/commands/profile/show.md +0 -1
- package/dist/agent-src/commands/profile.md +0 -1
- package/dist/agent-src/commands/project/analyze.md +0 -1
- package/dist/agent-src/commands/project/health.md +0 -1
- package/dist/agent-src/commands/project.md +0 -1
- package/dist/agent-src/commands/refine-ticket.md +0 -1
- package/dist/agent-src/commands/research/deep.md +0 -1
- package/dist/agent-src/commands/research/report.md +0 -1
- package/dist/agent-src/commands/research.md +0 -1
- package/dist/agent-src/commands/review/changes.md +0 -1
- package/dist/agent-src/commands/review/routing.md +0 -1
- package/dist/agent-src/commands/review.md +0 -1
- package/dist/agent-src/commands/roadmap/ai-council.md +0 -1
- package/dist/agent-src/commands/roadmap/create.md +0 -1
- package/dist/agent-src/commands/roadmap/materialize.md +0 -1
- package/dist/agent-src/commands/roadmap/next.md +0 -1
- package/dist/agent-src/commands/roadmap/process-full.md +0 -1
- package/dist/agent-src/commands/roadmap/process-phase.md +0 -1
- package/dist/agent-src/commands/roadmap/process-step.md +0 -1
- package/dist/agent-src/commands/roadmap.md +0 -1
- package/dist/agent-src/commands/rule-compliance-audit.md +0 -1
- package/dist/agent-src/commands/security-audit-config.md +0 -1
- package/dist/agent-src/commands/skill/preview.md +0 -1
- package/dist/agent-src/commands/skill.md +0 -1
- package/dist/agent-src/commands/skills/discover.md +0 -1
- package/dist/agent-src/commands/skills.md +0 -1
- package/dist/agent-src/commands/sync/agent-settings.md +0 -1
- package/dist/agent-src/commands/sync/gitignore/fix.md +0 -1
- package/dist/agent-src/commands/sync/gitignore.md +0 -1
- package/dist/agent-src/commands/sync.md +0 -1
- package/dist/agent-src/commands/tdd/green.md +0 -1
- package/dist/agent-src/commands/tdd/red.md +0 -1
- package/dist/agent-src/commands/tdd/refactor.md +0 -1
- package/dist/agent-src/commands/tdd.md +0 -1
- package/dist/agent-src/commands/team/adversarial.md +0 -1
- package/dist/agent-src/commands/team/delegate.md +0 -1
- package/dist/agent-src/commands/team/review.md +0 -1
- package/dist/agent-src/commands/team/status.md +0 -1
- package/dist/agent-src/commands/team-knowledge/bootstrap.md +0 -1
- package/dist/agent-src/commands/team-knowledge/consolidate.md +0 -1
- package/dist/agent-src/commands/team-knowledge.md +0 -1
- package/dist/agent-src/commands/team.md +0 -1
- package/dist/agent-src/commands/tests/create.md +0 -1
- package/dist/agent-src/commands/tests/e2e-heal.md +0 -1
- package/dist/agent-src/commands/tests/e2e-plan.md +0 -1
- package/dist/agent-src/commands/tests/execute.md +0 -1
- package/dist/agent-src/commands/tests.md +0 -1
- package/dist/agent-src/commands/threat-model.md +0 -1
- package/dist/agent-src/commands/update-form-request-messages.md +0 -1
- package/dist/agent-src/commands/upstream-contribute.md +0 -1
- package/dist/agent-src/commands/video/from-script.md +0 -1
- package/dist/agent-src/commands/video/from-song.md +0 -1
- package/dist/agent-src/commands/video/scene.md +0 -1
- package/dist/agent-src/commands/video/stitch.md +0 -1
- package/dist/agent-src/commands/video/storyboard.md +0 -1
- package/dist/agent-src/commands/video.md +0 -1
- package/dist/agent-src/commands/work.md +0 -1
- package/dist/agent-src/commands/worktree/cleanup.md +0 -1
- package/dist/agent-src/commands/worktree/create.md +0 -1
- package/dist/agent-src/commands/worktree/status.md +0 -1
- package/dist/agent-src/commands/worktree/verify.md +0 -1
- package/dist/agent-src/commands/worktree.md +0 -1
- package/dist/agent-src/contexts/model-recommendations.md +6 -4
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
- package/dist/agent-src/scripts/roadmap_gates.ts +30 -2
- package/dist/agent-src/scripts/update_roadmap_progress.ts +32 -1
- package/dist/agent-src/skills/docx-authoring/SKILL.md +1 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +9 -1
- package/dist/agent-src/skills/pdf-tools/SKILL.md +1 -0
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +7 -7
- package/dist/agent-src/skills/skill-writing/SKILL.md +35 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +41 -3
- package/dist/cli/commands/commands.candidates.test.js +1 -1
- package/dist/cli/commands/commands.candidates.test.js.map +1 -1
- package/dist/cli/commands/commands.js +9 -15
- package/dist/cli/commands/commands.js.map +1 -1
- package/dist/cli/commands/profiles.test.js +7 -7
- package/dist/cli/commands/profiles.test.js.map +1 -1
- package/dist/cli/discovery/loadManifest.js.map +1 -1
- package/dist/cli/main.js +2 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/registry.js +1 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/chunk-K34QTSD5.js +3895 -0
- package/dist/cli-delegate/{chunk-L565YFXH.js → chunk-LKZ5DOYW.js} +557 -297
- package/dist/cli-delegate/{chunk-NN4KW4HZ.js → chunk-O52B4F5S.js} +123 -2338
- package/dist/cli-delegate/cmd_conformance.js +18 -6
- package/dist/cli-delegate/cmd_doctor.js +2 -2
- package/dist/cli-delegate/cmd_export.js +1 -1
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_prune.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +1 -1
- package/dist/cli-delegate/cmd_uninstall.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +213 -412
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +2 -2
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +3 -3
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +3 -3
- package/dist/hooks/dispatch.js +2588 -1082
- package/dist/install/install.mjs +744 -482
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +159 -15
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/model_tier.js +9 -0
- package/dist/scripts/_lib/model_tier.js.map +1 -1
- package/dist/scripts/condense.js +50 -0
- package/dist/scripts/condense.js.map +1 -1
- package/docs/MIGRATION.md +21 -1
- package/docs/contracts/settings-classes.md +41 -0
- package/package.json +1 -1
- package/src/agent-src/scripts/roadmap_gates.ts +30 -2
- package/src/agent-src/scripts/update_roadmap_progress.ts +32 -1
- package/src/config/agent-settings.template.yml +34 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +39 -9
- package/src/config/gate-violation-baselines.json +9 -3
- package/src/config/hook-token-budget.json +7 -1
- package/src/config/preamble-payload-budget.json +28 -0
- package/src/scripts/_dispatch.bash +52 -5
- package/src/scripts/_lib/git_common_dir.ts +173 -0
- package/src/scripts/_lib/model_tier.ts +9 -0
- package/src/scripts/_lib/release_highlights.ts +108 -7
- package/src/scripts/_lib/skill_catalogue.ts +862 -0
- package/src/scripts/ai_council/clients.ts +182 -3
- package/src/scripts/ai_council/config.ts +16 -1
- package/src/scripts/ai_council/low_impact.ts +14 -1
- package/src/scripts/ai_council/orchestrator.ts +14 -1
- package/src/scripts/ai_council/transport_resolver.ts +32 -2
- package/src/scripts/audit_command_surface.ts +21 -15
- package/src/scripts/build_catalog_index.ts +1 -1
- package/src/scripts/build_discovery_manifest.ts +30 -34
- package/src/scripts/capture_skill_catalogue.ts +185 -328
- package/src/scripts/check_branch_freshness.ts +217 -62
- package/src/scripts/check_release_published.ts +6 -2
- package/src/scripts/check_release_trunk_sync.ts +18 -2
- package/src/scripts/condense.ts +50 -1
- package/src/scripts/dispatch_r2_reviewer.ts +15 -5
- package/src/scripts/evidence_report.ts +15 -4
- package/src/scripts/gen_discovery_baseline.ts +3 -3
- package/src/scripts/hook_manifest.yaml +67 -13
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/orchestration_record_hook.ts +21 -0
- package/src/scripts/hooks/subagent_ledger_hook.ts +17 -4
- package/src/scripts/hooks/tool_result_bytes_hook.ts +219 -0
- package/src/scripts/hot_context_hook.ts +13 -1
- package/src/scripts/install.ts +129 -0
- package/src/scripts/janitor.ts +77 -2
- package/src/scripts/lint_command_tiers.ts +29 -75
- package/src/scripts/lint_originality.ts +101 -14
- package/src/scripts/lint_plan_risk_register.ts +22 -9
- package/src/scripts/lint_roadmap_blockers.ts +109 -6
- package/src/scripts/lint_scheduled_deprecations.ts +738 -0
- package/src/scripts/migration_status.ts +17 -1
- package/src/scripts/probe_review_binding_drift.ts +731 -0
- package/src/scripts/release.ts +95 -1
- package/src/scripts/schemas/command.schema.json +6 -11
- package/src/scripts/schemas/skill.schema.json +12 -2
- package/src/scripts/schemas/subagent.schema.json +2 -2
- package/src/scripts/session_eol_report.ts +81 -0
- package/src/scripts/skill_linter.ts +82 -2
- package/src/scripts/workspace_doctor.ts +464 -0
- package/src/scripts/worktree_cleanup_check.ts +113 -8
- package/dist/cli-delegate/chunk-AYKQGIBG.js +0 -1594
|
@@ -20,6 +20,7 @@ import * as fs from 'node:fs';
|
|
|
20
20
|
import * as path from 'node:path';
|
|
21
21
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
22
22
|
|
|
23
|
+
import { checkRatchet } from './_lib/gate_baseline.js';
|
|
23
24
|
import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
24
25
|
|
|
25
26
|
const _HERE = fileURLToPath(import.meta.url);
|
|
@@ -46,6 +47,41 @@ const REQUIRED_FIELDS: ReadonlyArray<readonly [string, RegExp]> = [
|
|
|
46
47
|
['Resolved when', /^-[ \t]*\*\*Resolved when:\*\*/im],
|
|
47
48
|
];
|
|
48
49
|
|
|
50
|
+
/**
|
|
51
|
+
* The fields that make a blocker DECIDABLE rather than merely described.
|
|
52
|
+
*
|
|
53
|
+
* Separated from `REQUIRED_FIELDS` on purpose: the five above are a settled
|
|
54
|
+
* contract every entry in the tree already satisfies, so a missing one is a
|
|
55
|
+
* hard failure. These three are new, and 36 open entries predate them — held
|
|
56
|
+
* to the same bar on day one they would red the whole backlog, which is the
|
|
57
|
+
* "strict gate fires on ~283 files" failure this repo has already recorded
|
|
58
|
+
* once. They run through the ratchet instead: the backlog is legal at its
|
|
59
|
+
* measured size, and every entry added or edited after this must clear them.
|
|
60
|
+
*/
|
|
61
|
+
const DECIDABILITY_FIELDS: ReadonlyArray<readonly [string, RegExp]> = [
|
|
62
|
+
['Recommendation', /^-[ \t]*\*\*Recommendation:\*\*[ \t]*\S/im],
|
|
63
|
+
['If you do nothing', /^-[ \t]*\*\*If you do nothing:\*\*[ \t]*\S/im],
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
/** `What to do:` body — everything up to the next field marker. */
|
|
67
|
+
const WHAT_TO_DO_SLICE_RE =
|
|
68
|
+
/^-[ \t]*\*\*What to do:\*\*([\s\S]*?)(?=^-[ \t]*\*\*[A-Z]|^###[ \t]|$(?![\s\S]))/im;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Does `What to do` carry anything the owner can actually execute?
|
|
72
|
+
*
|
|
73
|
+
* A backticked span (a command, a path, a flag) or an enumerated option set
|
|
74
|
+
* (`(a)` / `1.`) both count. Bare prose does not: "pick exactly one — accept
|
|
75
|
+
* the reading, or re-cut the criterion" names no file, no command and no
|
|
76
|
+
* consequence, and hands the analysis back to the person least equipped to
|
|
77
|
+
* redo it. Measured 2026-08-15: 14 of 46 entries in this tree are that shape.
|
|
78
|
+
*/
|
|
79
|
+
function _hasExecutableSubstance(body: string): boolean {
|
|
80
|
+
const m = WHAT_TO_DO_SLICE_RE.exec(body);
|
|
81
|
+
const slice = m ? (m[1] as string) : '';
|
|
82
|
+
return /`[^`\n]+`/.test(slice) || /(^|\s)\((?:[a-z]|[0-9]+)\)\s/i.test(slice);
|
|
83
|
+
}
|
|
84
|
+
|
|
49
85
|
interface Violation {
|
|
50
86
|
line: number;
|
|
51
87
|
message: string;
|
|
@@ -68,7 +104,19 @@ function _stripFencedCode(text: string): string {
|
|
|
68
104
|
}
|
|
69
105
|
|
|
70
106
|
function _scan(rawText: string): Violation[] {
|
|
107
|
+
return _scanBoth(rawText).hard;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
interface ScanResult {
|
|
111
|
+
/** Contract violations — always fatal. */
|
|
112
|
+
hard: Violation[];
|
|
113
|
+
/** Open entries that are not yet decidable — counted against the ratchet. */
|
|
114
|
+
decidability: Violation[];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function _scanBoth(rawText: string): ScanResult {
|
|
71
118
|
const violations: Violation[] = [];
|
|
119
|
+
const decidability: Violation[] = [];
|
|
72
120
|
const text = _stripFencedCode(rawText);
|
|
73
121
|
const declaredIds = new Set<string>();
|
|
74
122
|
|
|
@@ -105,6 +153,23 @@ function _scan(rawText: string): Violation[] {
|
|
|
105
153
|
message: `blocker '${cur.id}' missing required field(s): ${missing.join(', ')}`,
|
|
106
154
|
});
|
|
107
155
|
}
|
|
156
|
+
// Resolved entries are history — re-litigating a decision already
|
|
157
|
+
// made would be churn, and the ratchet would never reach zero.
|
|
158
|
+
const isResolved = /^-[ \t]*\*\*Status:\*\*[ \t]*resolved/im.test(body);
|
|
159
|
+
if (!isResolved) {
|
|
160
|
+
const gaps = DECIDABILITY_FIELDS.filter(([, re]) => !re.test(body)).map(
|
|
161
|
+
([name]) => name,
|
|
162
|
+
);
|
|
163
|
+
if (!_hasExecutableSubstance(body)) {
|
|
164
|
+
gaps.push('What to do (no command, path or option set)');
|
|
165
|
+
}
|
|
166
|
+
if (gaps.length) {
|
|
167
|
+
decidability.push({
|
|
168
|
+
line: _lineAt(text, sectionStart + cur.start),
|
|
169
|
+
message: `blocker '${cur.id}' is not decidable yet: ${gaps.join(', ')}`,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
108
173
|
}
|
|
109
174
|
}
|
|
110
175
|
|
|
@@ -131,7 +196,8 @@ function _scan(rawText: string): Violation[] {
|
|
|
131
196
|
}
|
|
132
197
|
}
|
|
133
198
|
violations.sort((a, b) => a.line - b.line);
|
|
134
|
-
|
|
199
|
+
decidability.sort((a, b) => a.line - b.line);
|
|
200
|
+
return { hard: violations, decidability };
|
|
135
201
|
}
|
|
136
202
|
|
|
137
203
|
/** Sorted `agents/roadmaps/*.md` (non-recursive — active roadmaps only). */
|
|
@@ -206,14 +272,18 @@ function main(): number {
|
|
|
206
272
|
return 0;
|
|
207
273
|
}
|
|
208
274
|
let failed = 0;
|
|
275
|
+
const undecidable: Array<{ rel: string; v: Violation }> = [];
|
|
209
276
|
for (const roadmap of roadmaps) {
|
|
210
277
|
const rel = _relPosix(roadmap, REPO_ROOT);
|
|
211
278
|
const text = fs.readFileSync(roadmap, 'utf-8');
|
|
212
|
-
const
|
|
213
|
-
|
|
279
|
+
const { hard, decidability } = _scanBoth(text);
|
|
280
|
+
for (const v of decidability) {
|
|
281
|
+
undecidable.push({ rel, v });
|
|
282
|
+
}
|
|
283
|
+
if (hard.length) {
|
|
214
284
|
failed += 1;
|
|
215
285
|
process.stderr.write(`❌ ${rel}\n`);
|
|
216
|
-
for (const v of
|
|
286
|
+
for (const v of hard) {
|
|
217
287
|
process.stderr.write(` line ${v.line}: ${v.message}\n`);
|
|
218
288
|
}
|
|
219
289
|
} else if (!QUIET) {
|
|
@@ -228,8 +298,31 @@ function main(): number {
|
|
|
228
298
|
);
|
|
229
299
|
return 1;
|
|
230
300
|
}
|
|
301
|
+
|
|
302
|
+
// The decidability ratchet. A blocker that names no option, no command and
|
|
303
|
+
// no recommendation is a research task handed to the person with the least
|
|
304
|
+
// context — the defect this half of the gate exists to stop growing.
|
|
305
|
+
const verdict = checkRatchet({
|
|
306
|
+
gate: 'lint_roadmap_blockers:decidability',
|
|
307
|
+
actual: undecidable.length,
|
|
308
|
+
repoRoot: REPO_ROOT,
|
|
309
|
+
});
|
|
310
|
+
if (!verdict.ok) {
|
|
311
|
+
process.stderr.write(`❌ ${verdict.message}\n`);
|
|
312
|
+
for (const { rel, v } of undecidable) {
|
|
313
|
+
process.stderr.write(` ${rel}:${v.line}: ${v.message}\n`);
|
|
314
|
+
}
|
|
315
|
+
process.stderr.write(
|
|
316
|
+
'\n Every open blocker needs **Recommendation:** (which option, and why),\n' +
|
|
317
|
+
' **If you do nothing:** (the cost of the non-decision), and a\n' +
|
|
318
|
+
' **What to do:** carrying a command, a path or an enumerated option set.\n' +
|
|
319
|
+
' See templates/roadmaps.md rule 20.\n',
|
|
320
|
+
);
|
|
321
|
+
return 1;
|
|
322
|
+
}
|
|
231
323
|
if (!QUIET) {
|
|
232
324
|
process.stdout.write(`\n✅ ${roadmaps.length} roadmap(s) blocker-contract-clean\n`);
|
|
325
|
+
process.stdout.write(`✅ ${verdict.message}\n`);
|
|
233
326
|
}
|
|
234
327
|
return 0;
|
|
235
328
|
}
|
|
@@ -260,5 +353,15 @@ if (_isCliEntry() || process.argv[1] === _HERE) {
|
|
|
260
353
|
process.exit(main());
|
|
261
354
|
}
|
|
262
355
|
|
|
263
|
-
export {
|
|
264
|
-
|
|
356
|
+
export {
|
|
357
|
+
REPO_ROOT,
|
|
358
|
+
ROADMAP_GLOB,
|
|
359
|
+
REQUIRED_FIELDS,
|
|
360
|
+
DECIDABILITY_FIELDS,
|
|
361
|
+
_hasExecutableSubstance,
|
|
362
|
+
_scan,
|
|
363
|
+
_scanBoth,
|
|
364
|
+
_globRoadmaps,
|
|
365
|
+
main,
|
|
366
|
+
};
|
|
367
|
+
export type { Violation, ScanResult };
|