cclaw-cli 7.7.1 → 8.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/README.md +210 -134
- package/dist/artifact-frontmatter.d.ts +51 -0
- package/dist/artifact-frontmatter.js +131 -0
- package/dist/artifact-paths.d.ts +7 -27
- package/dist/artifact-paths.js +20 -249
- package/dist/cancel.d.ts +16 -0
- package/dist/cancel.js +66 -0
- package/dist/cli.d.ts +2 -27
- package/dist/cli.js +90 -508
- package/dist/compound.d.ts +26 -0
- package/dist/compound.js +96 -0
- package/dist/config.d.ts +14 -51
- package/dist/config.js +23 -359
- package/dist/constants.d.ts +11 -18
- package/dist/constants.js +19 -106
- package/dist/content/antipatterns.d.ts +1 -0
- package/dist/content/antipatterns.js +109 -0
- package/dist/content/artifact-templates.d.ts +10 -0
- package/dist/content/artifact-templates.js +550 -0
- package/dist/content/cancel-command.d.ts +2 -2
- package/dist/content/cancel-command.js +25 -17
- package/dist/content/core-agents.d.ts +9 -233
- package/dist/content/core-agents.js +39 -768
- package/dist/content/decision-protocol.d.ts +1 -12
- package/dist/content/decision-protocol.js +27 -20
- package/dist/content/examples.d.ts +8 -42
- package/dist/content/examples.js +293 -425
- package/dist/content/idea-command.d.ts +2 -0
- package/dist/content/idea-command.js +38 -0
- package/dist/content/iron-laws.d.ts +4 -138
- package/dist/content/iron-laws.js +18 -197
- package/dist/content/meta-skill.d.ts +1 -3
- package/dist/content/meta-skill.js +57 -134
- package/dist/content/node-hooks.d.ts +12 -8
- package/dist/content/node-hooks.js +188 -838
- package/dist/content/recovery.d.ts +8 -0
- package/dist/content/recovery.js +179 -0
- package/dist/content/reference-patterns.d.ts +4 -13
- package/dist/content/reference-patterns.js +260 -389
- package/dist/content/research-playbooks.d.ts +8 -8
- package/dist/content/research-playbooks.js +108 -121
- package/dist/content/review-loop.d.ts +6 -192
- package/dist/content/review-loop.js +29 -731
- package/dist/content/skills.d.ts +8 -38
- package/dist/content/skills.js +681 -732
- package/dist/content/specialist-prompts/architect.d.ts +1 -0
- package/dist/content/specialist-prompts/architect.js +225 -0
- package/dist/content/specialist-prompts/brainstormer.d.ts +1 -0
- package/dist/content/specialist-prompts/brainstormer.js +168 -0
- package/dist/content/specialist-prompts/index.d.ts +2 -0
- package/dist/content/specialist-prompts/index.js +14 -0
- package/dist/content/specialist-prompts/planner.d.ts +1 -0
- package/dist/content/specialist-prompts/planner.js +182 -0
- package/dist/content/specialist-prompts/reviewer.d.ts +1 -0
- package/dist/content/specialist-prompts/reviewer.js +193 -0
- package/dist/content/specialist-prompts/security-reviewer.d.ts +1 -0
- package/dist/content/specialist-prompts/security-reviewer.js +133 -0
- package/dist/content/specialist-prompts/slice-builder.d.ts +1 -0
- package/dist/content/specialist-prompts/slice-builder.js +232 -0
- package/dist/content/stage-playbooks.d.ts +8 -0
- package/dist/content/stage-playbooks.js +404 -0
- package/dist/content/start-command.d.ts +2 -12
- package/dist/content/start-command.js +221 -207
- package/dist/flow-state.d.ts +21 -178
- package/dist/flow-state.js +67 -170
- package/dist/fs-utils.d.ts +6 -26
- package/dist/fs-utils.js +29 -162
- package/dist/gitignore.d.ts +2 -1
- package/dist/gitignore.js +51 -34
- package/dist/harness-detect.d.ts +10 -0
- package/dist/harness-detect.js +29 -0
- package/dist/install.d.ts +27 -15
- package/dist/install.js +230 -1342
- package/dist/knowledge-store.d.ts +19 -163
- package/dist/knowledge-store.js +56 -590
- package/dist/logger.d.ts +8 -3
- package/dist/logger.js +13 -4
- package/dist/orchestrator-routing.d.ts +29 -0
- package/dist/orchestrator-routing.js +156 -0
- package/dist/run-persistence.d.ts +7 -118
- package/dist/run-persistence.js +29 -845
- package/dist/runtime/run-hook.entry.d.ts +1 -3
- package/dist/runtime/run-hook.entry.js +19 -4
- package/dist/runtime/run-hook.mjs +13 -1024
- package/dist/types.d.ts +25 -261
- package/dist/types.js +8 -36
- package/package.json +6 -3
- package/dist/artifact-linter/brainstorm.d.ts +0 -2
- package/dist/artifact-linter/brainstorm.js +0 -353
- package/dist/artifact-linter/design.d.ts +0 -18
- package/dist/artifact-linter/design.js +0 -444
- package/dist/artifact-linter/findings-dedup.d.ts +0 -56
- package/dist/artifact-linter/findings-dedup.js +0 -232
- package/dist/artifact-linter/plan.d.ts +0 -2
- package/dist/artifact-linter/plan.js +0 -826
- package/dist/artifact-linter/review-army.d.ts +0 -49
- package/dist/artifact-linter/review-army.js +0 -520
- package/dist/artifact-linter/review.d.ts +0 -2
- package/dist/artifact-linter/review.js +0 -113
- package/dist/artifact-linter/scope.d.ts +0 -2
- package/dist/artifact-linter/scope.js +0 -158
- package/dist/artifact-linter/shared.d.ts +0 -637
- package/dist/artifact-linter/shared.js +0 -2163
- package/dist/artifact-linter/ship.d.ts +0 -2
- package/dist/artifact-linter/ship.js +0 -250
- package/dist/artifact-linter/spec.d.ts +0 -2
- package/dist/artifact-linter/spec.js +0 -176
- package/dist/artifact-linter/tdd.d.ts +0 -118
- package/dist/artifact-linter/tdd.js +0 -1404
- package/dist/artifact-linter.d.ts +0 -15
- package/dist/artifact-linter.js +0 -517
- package/dist/codex-feature-flag.d.ts +0 -58
- package/dist/codex-feature-flag.js +0 -193
- package/dist/content/closeout-guidance.d.ts +0 -14
- package/dist/content/closeout-guidance.js +0 -44
- package/dist/content/diff-command.d.ts +0 -1
- package/dist/content/diff-command.js +0 -43
- package/dist/content/harness-doc.d.ts +0 -1
- package/dist/content/harness-doc.js +0 -65
- package/dist/content/hook-events.d.ts +0 -9
- package/dist/content/hook-events.js +0 -23
- package/dist/content/hook-manifest.d.ts +0 -81
- package/dist/content/hook-manifest.js +0 -156
- package/dist/content/hooks.d.ts +0 -11
- package/dist/content/hooks.js +0 -1972
- package/dist/content/idea.d.ts +0 -60
- package/dist/content/idea.js +0 -416
- package/dist/content/language-policy.d.ts +0 -2
- package/dist/content/language-policy.js +0 -13
- package/dist/content/learnings.d.ts +0 -6
- package/dist/content/learnings.js +0 -141
- package/dist/content/observe.d.ts +0 -19
- package/dist/content/observe.js +0 -86
- package/dist/content/opencode-plugin.d.ts +0 -1
- package/dist/content/opencode-plugin.js +0 -635
- package/dist/content/review-prompts.d.ts +0 -1
- package/dist/content/review-prompts.js +0 -104
- package/dist/content/runtime-shared-snippets.d.ts +0 -8
- package/dist/content/runtime-shared-snippets.js +0 -80
- package/dist/content/session-hooks.d.ts +0 -7
- package/dist/content/session-hooks.js +0 -107
- package/dist/content/skills-elicitation.d.ts +0 -1
- package/dist/content/skills-elicitation.js +0 -167
- package/dist/content/stage-command.d.ts +0 -2
- package/dist/content/stage-command.js +0 -17
- package/dist/content/stage-schema.d.ts +0 -117
- package/dist/content/stage-schema.js +0 -955
- package/dist/content/stages/_lint-metadata/index.d.ts +0 -2
- package/dist/content/stages/_lint-metadata/index.js +0 -97
- package/dist/content/stages/brainstorm.d.ts +0 -2
- package/dist/content/stages/brainstorm.js +0 -184
- package/dist/content/stages/design.d.ts +0 -2
- package/dist/content/stages/design.js +0 -288
- package/dist/content/stages/index.d.ts +0 -8
- package/dist/content/stages/index.js +0 -11
- package/dist/content/stages/plan.d.ts +0 -2
- package/dist/content/stages/plan.js +0 -191
- package/dist/content/stages/review.d.ts +0 -2
- package/dist/content/stages/review.js +0 -240
- package/dist/content/stages/schema-types.d.ts +0 -203
- package/dist/content/stages/schema-types.js +0 -1
- package/dist/content/stages/scope.d.ts +0 -2
- package/dist/content/stages/scope.js +0 -254
- package/dist/content/stages/ship.d.ts +0 -2
- package/dist/content/stages/ship.js +0 -159
- package/dist/content/stages/spec.d.ts +0 -2
- package/dist/content/stages/spec.js +0 -170
- package/dist/content/stages/tdd.d.ts +0 -4
- package/dist/content/stages/tdd.js +0 -273
- package/dist/content/state-contracts.d.ts +0 -1
- package/dist/content/state-contracts.js +0 -63
- package/dist/content/status-command.d.ts +0 -4
- package/dist/content/status-command.js +0 -109
- package/dist/content/subagent-context-skills.d.ts +0 -4
- package/dist/content/subagent-context-skills.js +0 -279
- package/dist/content/subagents.d.ts +0 -3
- package/dist/content/subagents.js +0 -997
- package/dist/content/templates.d.ts +0 -26
- package/dist/content/templates.js +0 -1692
- package/dist/content/track-render-context.d.ts +0 -18
- package/dist/content/track-render-context.js +0 -53
- package/dist/content/tree-command.d.ts +0 -1
- package/dist/content/tree-command.js +0 -64
- package/dist/content/utility-skills.d.ts +0 -30
- package/dist/content/utility-skills.js +0 -160
- package/dist/content/view-command.d.ts +0 -2
- package/dist/content/view-command.js +0 -92
- package/dist/delegation.d.ts +0 -649
- package/dist/delegation.js +0 -1539
- package/dist/early-loop.d.ts +0 -70
- package/dist/early-loop.js +0 -302
- package/dist/execution-topology.d.ts +0 -44
- package/dist/execution-topology.js +0 -95
- package/dist/gate-evidence.d.ts +0 -85
- package/dist/gate-evidence.js +0 -631
- package/dist/harness-adapters.d.ts +0 -151
- package/dist/harness-adapters.js +0 -756
- package/dist/harness-selection.d.ts +0 -31
- package/dist/harness-selection.js +0 -214
- package/dist/hook-schema.d.ts +0 -6
- package/dist/hook-schema.js +0 -114
- package/dist/hook-schemas/claude-hooks.v1.json +0 -10
- package/dist/hook-schemas/codex-hooks.v1.json +0 -10
- package/dist/hook-schemas/cursor-hooks.v1.json +0 -13
- package/dist/init-detect.d.ts +0 -2
- package/dist/init-detect.js +0 -50
- package/dist/internal/advance-stage/advance.d.ts +0 -89
- package/dist/internal/advance-stage/advance.js +0 -655
- package/dist/internal/advance-stage/cancel-run.d.ts +0 -8
- package/dist/internal/advance-stage/cancel-run.js +0 -19
- package/dist/internal/advance-stage/flow-state-coercion.d.ts +0 -3
- package/dist/internal/advance-stage/flow-state-coercion.js +0 -81
- package/dist/internal/advance-stage/helpers.d.ts +0 -14
- package/dist/internal/advance-stage/helpers.js +0 -145
- package/dist/internal/advance-stage/hook.d.ts +0 -8
- package/dist/internal/advance-stage/hook.js +0 -40
- package/dist/internal/advance-stage/parsers.d.ts +0 -72
- package/dist/internal/advance-stage/parsers.js +0 -357
- package/dist/internal/advance-stage/proactive-delegation-trace.d.ts +0 -24
- package/dist/internal/advance-stage/proactive-delegation-trace.js +0 -56
- package/dist/internal/advance-stage/review-loop.d.ts +0 -16
- package/dist/internal/advance-stage/review-loop.js +0 -199
- package/dist/internal/advance-stage/rewind.d.ts +0 -14
- package/dist/internal/advance-stage/rewind.js +0 -108
- package/dist/internal/advance-stage/start-flow.d.ts +0 -13
- package/dist/internal/advance-stage/start-flow.js +0 -241
- package/dist/internal/advance-stage/verify.d.ts +0 -21
- package/dist/internal/advance-stage/verify.js +0 -185
- package/dist/internal/advance-stage.d.ts +0 -7
- package/dist/internal/advance-stage.js +0 -138
- package/dist/internal/cohesion-contract-stub.d.ts +0 -24
- package/dist/internal/cohesion-contract-stub.js +0 -148
- package/dist/internal/compound-readiness.d.ts +0 -23
- package/dist/internal/compound-readiness.js +0 -102
- package/dist/internal/detect-public-api-changes.d.ts +0 -5
- package/dist/internal/detect-public-api-changes.js +0 -45
- package/dist/internal/detect-supply-chain-changes.d.ts +0 -6
- package/dist/internal/detect-supply-chain-changes.js +0 -138
- package/dist/internal/early-loop-status.d.ts +0 -7
- package/dist/internal/early-loop-status.js +0 -93
- package/dist/internal/envelope-validate.d.ts +0 -7
- package/dist/internal/envelope-validate.js +0 -66
- package/dist/internal/flow-state-repair.d.ts +0 -20
- package/dist/internal/flow-state-repair.js +0 -104
- package/dist/internal/plan-split-waves.d.ts +0 -190
- package/dist/internal/plan-split-waves.js +0 -764
- package/dist/internal/runtime-integrity.d.ts +0 -7
- package/dist/internal/runtime-integrity.js +0 -268
- package/dist/internal/slice-commit.d.ts +0 -7
- package/dist/internal/slice-commit.js +0 -619
- package/dist/internal/tdd-loop-status.d.ts +0 -14
- package/dist/internal/tdd-loop-status.js +0 -68
- package/dist/internal/tdd-red-evidence.d.ts +0 -7
- package/dist/internal/tdd-red-evidence.js +0 -153
- package/dist/internal/waiver-grant.d.ts +0 -62
- package/dist/internal/waiver-grant.js +0 -294
- package/dist/internal/wave-status.d.ts +0 -74
- package/dist/internal/wave-status.js +0 -506
- package/dist/managed-resources.d.ts +0 -53
- package/dist/managed-resources.js +0 -313
- package/dist/policy.d.ts +0 -10
- package/dist/policy.js +0 -167
- package/dist/retro-gate.d.ts +0 -9
- package/dist/retro-gate.js +0 -47
- package/dist/run-archive.d.ts +0 -61
- package/dist/run-archive.js +0 -391
- package/dist/runs.d.ts +0 -2
- package/dist/runs.js +0 -2
- package/dist/stack-detection.d.ts +0 -116
- package/dist/stack-detection.js +0 -489
- package/dist/streaming/event-stream.d.ts +0 -31
- package/dist/streaming/event-stream.js +0 -114
- package/dist/tdd-cycle.d.ts +0 -107
- package/dist/tdd-cycle.js +0 -289
- package/dist/tdd-verification-evidence.d.ts +0 -17
- package/dist/tdd-verification-evidence.js +0 -122
- package/dist/track-heuristics.d.ts +0 -27
- package/dist/track-heuristics.js +0 -154
- package/dist/util/slice-id.d.ts +0 -58
- package/dist/util/slice-id.js +0 -89
- package/dist/worktree-manager.d.ts +0 -20
- package/dist/worktree-manager.js +0 -108
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { checkCriticPredictionsContract, evaluateInvestigationTrace, evaluateQaLogFloor, sectionBodyByHeadingPrefix, sectionBodyByName, extractCanonicalScopeMode, getMarkdownTableRows } from "./shared.js";
|
|
2
|
-
import { readDelegationLedger, recordExpansionStrategistSkippedByTrack } from "../delegation.js";
|
|
3
|
-
import { shouldDemoteArtifactValidationByTrack } from "../content/stage-schema.js";
|
|
4
|
-
import { readFlowState } from "../run-persistence.js";
|
|
5
|
-
export async function lintScopeStage(ctx) {
|
|
6
|
-
const { projectRoot, track, raw, absFile, sections, findings, parsedFrontmatter, brainstormShortCircuitBody, brainstormShortCircuitActivated, staleDiagramAuditEnabled, isTrivialOverride, activeStageFlags, taskClass } = ctx;
|
|
7
|
-
evaluateInvestigationTrace(ctx, "Q&A Log");
|
|
8
|
-
const lockedDecisionsBody = sectionBodyByHeadingPrefix(sections, "Locked Decisions") ?? "";
|
|
9
|
-
const scopeSummaryBody = sectionBodyByName(sections, "Scope Summary") ?? "";
|
|
10
|
-
const selectedScopeMode = extractCanonicalScopeMode(scopeSummaryBody);
|
|
11
|
-
const qaLogBody = sectionBodyByName(sections, "Q&A Log");
|
|
12
|
-
const qaLogRows = qaLogBody ? getMarkdownTableRows(qaLogBody) : [];
|
|
13
|
-
const qaLogOk = qaLogBody !== null && qaLogRows.length > 0;
|
|
14
|
-
findings.push({
|
|
15
|
-
section: "qa_log_missing",
|
|
16
|
-
required: false,
|
|
17
|
-
rule: "[P2] qa_log_missing — Q&A Log empty — confirm you actually had a dialogue with the user, not a draft from memory.",
|
|
18
|
-
found: qaLogOk,
|
|
19
|
-
details: qaLogOk
|
|
20
|
-
? `Q&A Log contains ${qaLogRows.length} data row(s).`
|
|
21
|
-
: qaLogBody === null
|
|
22
|
-
? "Missing `## Q&A Log` section."
|
|
23
|
-
: "Q&A Log is present but has zero data rows."
|
|
24
|
-
});
|
|
25
|
-
{
|
|
26
|
-
const skipQuestions = activeStageFlags.includes("--skip-questions");
|
|
27
|
-
const floor = evaluateQaLogFloor(qaLogBody, track, "scope", { discoveryMode: ctx.discoveryMode, skipQuestions });
|
|
28
|
-
findings.push({
|
|
29
|
-
section: "qa_log_unconverged",
|
|
30
|
-
required: !floor.skipQuestionsAdvisory,
|
|
31
|
-
rule: "[P1] qa_log_unconverged — Q&A Log has not converged for this stage. Continue elicitation until every forcing-question topic id is tagged with `[topic:<id>]` on at least one row, the last 2 rows produce no decision-changing impact (Ralph-Loop), or an explicit user stop-signal row is appended.",
|
|
32
|
-
found: floor.ok,
|
|
33
|
-
details: floor.details
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
const strategistRequired = selectedScopeMode === "SCOPE EXPANSION" || selectedScopeMode === "SELECTIVE EXPANSION";
|
|
37
|
-
if (strategistRequired) {
|
|
38
|
-
// for `track === "quick"` (lite-tier) or
|
|
39
|
-
// `taskClass === "software-bugfix"`, the Expansion Strategist
|
|
40
|
-
// delegation requirement is dropped entirely. The user's
|
|
41
|
-
// 3-file static landing page hit this gate without any
|
|
42
|
-
// discovery scope — pure ceremony for trivial work. Standard
|
|
43
|
-
// tracks remain unchanged.
|
|
44
|
-
const skipByTrack = shouldDemoteArtifactValidationByTrack(track, taskClass);
|
|
45
|
-
if (skipByTrack) {
|
|
46
|
-
findings.push({
|
|
47
|
-
section: "Product Discovery Delegation (Strategist Mode)",
|
|
48
|
-
required: false,
|
|
49
|
-
rule: "When Scope Summary selects SCOPE EXPANSION or SELECTIVE EXPANSION, a completed `product-discovery` delegation for the active run with non-empty evidenceRefs is required.",
|
|
50
|
-
found: true,
|
|
51
|
-
details: `Product-discovery delegation requirement skipped for track="${track}"` +
|
|
52
|
-
(taskClass ? `, taskClass="${taskClass}"` : "") +
|
|
53
|
-
` (lite-tier escape; selectedMode=${selectedScopeMode}).`
|
|
54
|
-
});
|
|
55
|
-
// Best-effort audit; we read the flow-state runId here
|
|
56
|
-
// because StageLintContext does not surface it directly.
|
|
57
|
-
try {
|
|
58
|
-
const flowState = await readFlowState(projectRoot);
|
|
59
|
-
const runId = flowState.activeRunId ?? null;
|
|
60
|
-
if (runId) {
|
|
61
|
-
await recordExpansionStrategistSkippedByTrack(projectRoot, {
|
|
62
|
-
track,
|
|
63
|
-
taskClass: taskClass ?? null,
|
|
64
|
-
runId,
|
|
65
|
-
selectedScopeMode
|
|
66
|
-
}).catch(() => { });
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
// Audit is best-effort; never block scope linting.
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
const delegationLedger = await readDelegationLedger(projectRoot);
|
|
75
|
-
const discoveryRows = delegationLedger.entries.filter((entry) => entry.stage === "scope" &&
|
|
76
|
-
entry.agent === "product-discovery" &&
|
|
77
|
-
entry.runId === delegationLedger.runId &&
|
|
78
|
-
entry.status === "completed");
|
|
79
|
-
const hasCompleted = discoveryRows.length > 0;
|
|
80
|
-
const hasEvidence = discoveryRows.some((entry) => Array.isArray(entry.evidenceRefs) && entry.evidenceRefs.length > 0);
|
|
81
|
-
findings.push({
|
|
82
|
-
section: "Product Discovery Delegation (Strategist Mode)",
|
|
83
|
-
required: true,
|
|
84
|
-
rule: "When Scope Summary selects SCOPE EXPANSION or SELECTIVE EXPANSION, a completed `product-discovery` delegation for the active run with non-empty evidenceRefs is required.",
|
|
85
|
-
found: hasCompleted && hasEvidence,
|
|
86
|
-
details: !hasCompleted
|
|
87
|
-
? `Scope mode ${selectedScopeMode} requires a completed product-discovery delegation row for active run ${delegationLedger.runId}. In SELECTIVE EXPANSION / SCOPE EXPANSION, run product-discovery (mode=proactive) BEFORE stage-complete.`
|
|
88
|
-
: hasEvidence
|
|
89
|
-
? `product-discovery delegation satisfied for mode ${selectedScopeMode}.`
|
|
90
|
-
: "product-discovery delegation exists but evidenceRefs is empty; add at least one artifact/code evidence reference."
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
const criticPredictions = checkCriticPredictionsContract(sections);
|
|
95
|
-
if (criticPredictions !== null) {
|
|
96
|
-
findings.push({
|
|
97
|
-
section: "critic.predictions_missing",
|
|
98
|
-
required: false,
|
|
99
|
-
rule: "[P2] critic.predictions_missing — pre-commitment predictions block missing or empty",
|
|
100
|
-
found: criticPredictions.found,
|
|
101
|
-
details: criticPredictions.details
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
if (sectionBodyByHeadingPrefix(sections, "Locked Decisions") !== null) {
|
|
105
|
-
// D-XX IDs are the stable contract. The legacy LD#<sha8> hash anchor
|
|
106
|
-
// check was removed in it caused agents to spam
|
|
107
|
-
// shell hash commands when shifting decision rows around, and provided
|
|
108
|
-
// no signal beyond the D-XX uniqueness check below.
|
|
109
|
-
const listDecisionLines = lockedDecisionsBody
|
|
110
|
-
.split(/\r?\n/u)
|
|
111
|
-
.map((line) => line.trim())
|
|
112
|
-
.filter((line) => /^[-*]\s+\S/u.test(line));
|
|
113
|
-
const tableDecisionRows = getMarkdownTableRows(lockedDecisionsBody);
|
|
114
|
-
const tableDecisionLines = tableDecisionRows.map((row) => row.join(" | "));
|
|
115
|
-
const decisionLines = [...listDecisionLines, ...tableDecisionLines];
|
|
116
|
-
const orphanDecisionLines = decisionLines.filter((line) => !/\bD-\d+\b/u.test(line));
|
|
117
|
-
const rowDecisionIds = [
|
|
118
|
-
...listDecisionLines.map((line) => /\bD-\d+\b/u.exec(line)?.[0]),
|
|
119
|
-
...tableDecisionRows.map((row) => /\bD-\d+\b/u.exec(row[0] ?? "")?.[0])
|
|
120
|
-
].filter((id) => typeof id === "string");
|
|
121
|
-
const duplicateIds = (() => {
|
|
122
|
-
const counts = new Map();
|
|
123
|
-
for (const id of rowDecisionIds)
|
|
124
|
-
counts.set(id, (counts.get(id) ?? 0) + 1);
|
|
125
|
-
return [...counts.entries()].filter(([, n]) => n > 1).map(([id]) => id);
|
|
126
|
-
})();
|
|
127
|
-
const issues = [];
|
|
128
|
-
if (rowDecisionIds.length === 0 && decisionLines.length === 0) {
|
|
129
|
-
issues.push("section is empty");
|
|
130
|
-
}
|
|
131
|
-
if (orphanDecisionLines.length > 0) {
|
|
132
|
-
const examples = orphanDecisionLines
|
|
133
|
-
.slice(0, 3)
|
|
134
|
-
.map((line) => `\`${line.slice(0, 120)}\``)
|
|
135
|
-
.join(", ");
|
|
136
|
-
issues.push(`${orphanDecisionLines.length} decision row(s) missing a D-XX ID${examples.length > 0 ? `: ${examples}` : ""}`);
|
|
137
|
-
}
|
|
138
|
-
if (duplicateIds.length > 0) {
|
|
139
|
-
issues.push(`duplicate IDs: ${duplicateIds.join(", ")}`);
|
|
140
|
-
}
|
|
141
|
-
findings.push({
|
|
142
|
-
section: "Locked Decisions ID Integrity",
|
|
143
|
-
required: false,
|
|
144
|
-
rule: "Locked Decisions section must list each decision with a unique stable D-XX ID.",
|
|
145
|
-
found: issues.length === 0,
|
|
146
|
-
details: issues.length === 0
|
|
147
|
-
? `${rowDecisionIds.length} decision ID(s) recorded with no duplicates.`
|
|
148
|
-
: issues.join("; ")
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
// scope no longer owns architecture-tier alternatives
|
|
152
|
-
// (`## Implementation Alternatives` was removed from the scope template
|
|
153
|
-
// and stage schema). Design OWNS the architecture-tier decision via
|
|
154
|
-
// `## Architecture Decision Record (ADR)` and `## Engineering Lock`.
|
|
155
|
-
// The legacy linter rule `Implementation Alternatives Recommendation`
|
|
156
|
-
// was removed in if a legacy artifact still has the section,
|
|
157
|
-
// it is now treated as informational only.
|
|
158
|
-
}
|