cclaw-cli 0.5.13 → 0.5.15
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/dist/artifact-linter.js
CHANGED
|
@@ -199,6 +199,7 @@ function validateSectionBody(sectionBody, rule) {
|
|
|
199
199
|
details: `Rule expects exactly one selected token (${tokens.join(", ")}); found ${selected.size}.`
|
|
200
200
|
};
|
|
201
201
|
}
|
|
202
|
+
return { ok: true, details: "Exactly one token selected as expected." };
|
|
202
203
|
}
|
|
203
204
|
}
|
|
204
205
|
if (/Status:\s*pending\s+until/iu.test(rule)) {
|
|
@@ -419,9 +420,34 @@ export async function validateReviewArmy(projectRoot) {
|
|
|
419
420
|
if (!Array.isArray(rec.conflicts)) {
|
|
420
421
|
errors.push("reconciliation.conflicts must be an array.");
|
|
421
422
|
}
|
|
423
|
+
else {
|
|
424
|
+
rec.conflicts.forEach((c, ci) => {
|
|
425
|
+
if (c === null || typeof c !== "object" || Array.isArray(c)) {
|
|
426
|
+
errors.push(`reconciliation.conflicts[${ci}] must be an object.`);
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const co = c;
|
|
430
|
+
if (!isNonEmptyString(co.findingId)) {
|
|
431
|
+
errors.push(`reconciliation.conflicts[${ci}].findingId must be a non-empty string.`);
|
|
432
|
+
}
|
|
433
|
+
else if (!findingIds.has(co.findingId)) {
|
|
434
|
+
errors.push(`reconciliation.conflicts[${ci}].findingId references unknown finding "${co.findingId}".`);
|
|
435
|
+
}
|
|
436
|
+
if (!isNonEmptyString(co.description)) {
|
|
437
|
+
errors.push(`reconciliation.conflicts[${ci}].description must be a non-empty string.`);
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
}
|
|
422
441
|
if (!isStringArray(rec.multiSpecialistConfirmed)) {
|
|
423
442
|
errors.push("reconciliation.multiSpecialistConfirmed must be an array of finding ids.");
|
|
424
443
|
}
|
|
444
|
+
else {
|
|
445
|
+
for (const msId of rec.multiSpecialistConfirmed) {
|
|
446
|
+
if (!findingIds.has(msId)) {
|
|
447
|
+
errors.push(`reconciliation.multiSpecialistConfirmed references unknown finding id "${msId}".`);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
425
451
|
if (!isStringArray(rec.shipBlockers)) {
|
|
426
452
|
errors.push("reconciliation.shipBlockers must be an array of finding ids.");
|
|
427
453
|
}
|
|
@@ -11,6 +11,12 @@ export function commandContract(stage) {
|
|
|
11
11
|
const gateIds = schema.requiredGates
|
|
12
12
|
.map((g) => `\`${g.id}\``)
|
|
13
13
|
.join(", ");
|
|
14
|
+
const writes = schema.crossStageTrace.writesTo;
|
|
15
|
+
const writesLine = writes.map((w) => `\`${w}\``).join(", ");
|
|
16
|
+
const primaryArtifact = `.cclaw/artifacts/${schema.artifactFile}`;
|
|
17
|
+
const writeStepPaths = writes.length > 1
|
|
18
|
+
? writes.map((w) => `\`${w}\``).join(" and ")
|
|
19
|
+
: `\`${primaryArtifact}\``;
|
|
14
20
|
return `# /cc-${stage}
|
|
15
21
|
|
|
16
22
|
Load and follow **${skillPath}** — it contains the full checklist, examples, interaction protocol, and verification discipline.
|
|
@@ -20,7 +26,7 @@ ${schema.hardGate}
|
|
|
20
26
|
|
|
21
27
|
## In / Out
|
|
22
28
|
- **Reads:** ${readsLine}
|
|
23
|
-
- **Writes:**
|
|
29
|
+
- **Writes:** ${writesLine}
|
|
24
30
|
- **Next:** \`/cc-next\` (updates flow-state and loads the next stage)
|
|
25
31
|
|
|
26
32
|
## Context Hydration (mandatory before stage work)
|
|
@@ -29,7 +35,7 @@ ${schema.hardGate}
|
|
|
29
35
|
3. Load required upstream artifacts for this stage:
|
|
30
36
|
${hydrationLines}
|
|
31
37
|
4. Load \`.cclaw/knowledge.md\` and apply relevant entries.
|
|
32
|
-
5. Write stage output to
|
|
38
|
+
5. Write stage output to ${writeStepPaths}.
|
|
33
39
|
6. Do NOT copy artifacts into \`.cclaw/runs/\`; archival is handled only by \`cclaw archive\`.
|
|
34
40
|
|
|
35
41
|
## Gates
|
package/dist/content/examples.js
CHANGED
|
@@ -360,61 +360,77 @@ Execution rule: complete and verify each wave before starting the next wave.
|
|
|
360
360
|
|
|
361
361
|
- Plan task IDs: T-1, T-2, T-3
|
|
362
362
|
- Spec criterion IDs: AC-1, AC-2, AC-3`,
|
|
363
|
-
review: `### Layer 1
|
|
363
|
+
review: `### Layer 1 Verdict
|
|
364
364
|
|
|
365
|
-
| Criterion |
|
|
365
|
+
| Criterion | Verdict | Evidence |
|
|
366
366
|
| --- | --- | --- |
|
|
367
|
-
| Delivery within 5s without reload | PASS | \`notification-feed.e2e.ts:44-88\` asserts SSE-to-UI timing under mock clock |
|
|
368
|
-
|
|
|
369
|
-
| Degraded mode + REST snapshot | PASS | \`NotificationsPanel.tsx:112-140\` renders banner + calls snapshot endpoint |
|
|
367
|
+
| AC-1: Delivery within 5s without reload | PASS | \`notification-feed.e2e.ts:44-88\` asserts SSE-to-UI timing under mock clock |
|
|
368
|
+
| AC-2: Dedupe — one visible item per key | PARTIAL | Unit tests cover publisher dedupe; UI merge path lacks test for race reordering (\`feedStore.test.ts\` missing case) |
|
|
369
|
+
| AC-3: Degraded mode + REST snapshot | PASS | \`NotificationsPanel.tsx:112-140\` renders banner + calls snapshot endpoint |
|
|
370
370
|
|
|
371
|
-
### Layer 2
|
|
371
|
+
### Layer 2 Findings
|
|
372
372
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
-
|
|
376
|
-
-
|
|
377
|
-
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
373
|
+
| ID | Severity | Category | Description | Status |
|
|
374
|
+
| --- | --- | --- | --- | --- |
|
|
375
|
+
| R-1 | Critical | correctness | Snapshot endpoint returns newest N rows but does not guarantee consistency with stream cursor — users can miss items between snapshot and subscribe. | open |
|
|
376
|
+
| R-2 | Important | performance | \`feedStore.merge()\` does full-array scan on every SSE event; O(n) per event where n is feed length. | open |
|
|
377
|
+
| R-3 | Suggestion | architecture | SSE reconnect logic duplicated across \`useNotifications\` and \`usePresence\`; extract shared hook. | open |
|
|
378
|
+
|
|
379
|
+
### Review Army Contract
|
|
380
|
+
|
|
381
|
+
- See \`07-review-army.json\`
|
|
382
|
+
- Reconciliation summary: 1 duplicate collapsed (R-1 reported by spec-reviewer and code-reviewer), 0 conflicts
|
|
383
|
+
|
|
384
|
+
### Review Readiness Dashboard
|
|
385
|
+
|
|
386
|
+
- Layer 1 complete: yes (3/3 criteria)
|
|
387
|
+
- Layer 2 complete: yes (5 sections reviewed)
|
|
388
|
+
- Review army schema valid: yes
|
|
389
|
+
- Open critical blockers: 1 (R-1)
|
|
390
|
+
- Ship recommendation: BLOCKED until R-1 resolved
|
|
381
391
|
|
|
382
|
-
###
|
|
392
|
+
### Severity Summary
|
|
383
393
|
|
|
384
|
-
-
|
|
385
|
-
-
|
|
394
|
+
- Critical: 1
|
|
395
|
+
- Important: 1
|
|
396
|
+
- Suggestion: 1
|
|
386
397
|
|
|
387
|
-
###
|
|
398
|
+
### Final Verdict
|
|
388
399
|
|
|
389
|
-
-
|
|
390
|
-
|
|
391
|
-
ship: `### Preflight checklist (sample)
|
|
400
|
+
- BLOCKED`,
|
|
401
|
+
ship: `### Preflight Results
|
|
392
402
|
|
|
393
|
-
-
|
|
394
|
-
-
|
|
395
|
-
-
|
|
396
|
-
-
|
|
403
|
+
- Review verdict: APPROVED_WITH_CONCERNS (R-1 resolved, R-2 accepted as known debt)
|
|
404
|
+
- Build: pass (\`pnpm build\` succeeds)
|
|
405
|
+
- Tests: pass (\`pnpm vitest run && pnpm playwright test\` — 47 passed, 0 failed)
|
|
406
|
+
- Lint: pass (\`pnpm lint\` clean)
|
|
407
|
+
- Type-check: pass (\`pnpm typecheck\` clean)
|
|
408
|
+
- Working tree clean: yes (\`git status\` shows no uncommitted changes)
|
|
397
409
|
|
|
398
|
-
### Release
|
|
410
|
+
### Release Notes
|
|
399
411
|
|
|
400
|
-
- **Added:** In-app notification feed with SSE updates and REST fallback snapshotting.
|
|
401
|
-
- **Changed:** Notification payloads now include a stable dedupe key for idempotent rendering.
|
|
412
|
+
- **Added:** In-app notification feed with SSE updates and REST fallback snapshotting (AC-1, AC-3).
|
|
413
|
+
- **Changed:** Notification payloads now include a stable dedupe key for idempotent rendering (AC-2).
|
|
402
414
|
- **Fixed:** Panel no longer drops the newest item when reconnecting after sleep/resume.
|
|
415
|
+
- **Breaking changes:** None.
|
|
403
416
|
|
|
404
|
-
### Rollback
|
|
417
|
+
### Rollback Plan
|
|
405
418
|
|
|
406
|
-
|
|
407
|
-
|
|
419
|
+
- Trigger conditions: error rate on \`/notifications/stream\` exceeds 5% for >5 minutes, or p95 publish-to-visible lag exceeds 10s.
|
|
420
|
+
- Rollback steps: \`git revert <merge-sha> && git push origin main\` then redeploy; if DB migrations shipped, run \`2026_04_12_notifications_cursor_down.sql\` before traffic.
|
|
421
|
+
- Verification steps: confirm error rate returns to pre-release baseline within 10 minutes; smoke-test feed panel manually.
|
|
408
422
|
|
|
409
|
-
###
|
|
423
|
+
### Monitoring
|
|
410
424
|
|
|
411
|
-
-
|
|
412
|
-
-
|
|
425
|
+
- Metrics/logs to watch: error rate on \`/notifications/stream\` and snapshot endpoint for 24h; p95 publish-to-visible lag via metrics dashboard.
|
|
426
|
+
- Risk note (if no monitoring): N/A — monitoring is in place.
|
|
413
427
|
|
|
414
|
-
###
|
|
428
|
+
### Finalization
|
|
415
429
|
|
|
416
|
-
-
|
|
417
|
-
-
|
|
430
|
+
- Selected enum: FINALIZE_OPEN_PR
|
|
431
|
+
- Selected label: B
|
|
432
|
+
- Execution result: PR #42 created via \`gh pr create\`; CI passed; squash-merged to main.
|
|
433
|
+
- PR URL: https://github.com/example/repo/pull/42`,
|
|
418
434
|
};
|
|
419
435
|
export function stageExamples(stage) {
|
|
420
436
|
const examples = STAGE_EXAMPLES[stage];
|
|
@@ -1016,7 +1016,8 @@ const TDD = {
|
|
|
1016
1016
|
{ claim: "One broad integration test is enough.", reality: "Slice-level RED tests are required for precise failure signal." },
|
|
1017
1017
|
{ claim: "Refactor can be skipped for speed.", reality: "Skipping refactor accumulates debt and weakens maintainability." },
|
|
1018
1018
|
{ claim: "Only changed tests need to pass.", reality: "Full-suite checks are needed to detect regressions." },
|
|
1019
|
-
{ claim: "Traceability is implied by commit diff.", reality: "Explicit mapping avoids ambiguity in review and rollback." }
|
|
1019
|
+
{ claim: "Traceability is implied by commit diff.", reality: "Explicit mapping avoids ambiguity in review and rollback." },
|
|
1020
|
+
{ claim: "Tests written after implementation achieve the same goals.", reality: "Post-hoc tests confirm assumptions, not behavior. They test what you built, not what you should have built. TDD forces you to think about behavior before you have an implementation to be anchored by." }
|
|
1020
1021
|
],
|
|
1021
1022
|
redFlags: [
|
|
1022
1023
|
"No failing test output (RED missing)",
|
|
@@ -1035,7 +1036,8 @@ const TDD = {
|
|
|
1035
1036
|
{ name: "Minimal Viable Change", description: "The best implementation is the smallest one that passes all RED tests. Every extra line is risk. Resist the urge to 'improve while you are here.'" },
|
|
1036
1037
|
{ name: "Regression Paranoia", description: "Assume every change breaks something until the full suite proves otherwise. Partial test runs are lies of omission." },
|
|
1037
1038
|
{ name: "Refactor-as-Hygiene", description: "Refactoring is not optional cleanup — it is the third leg of TDD. GREEN without REFACTOR accumulates mess. REFACTOR without GREEN breaks things." },
|
|
1038
|
-
{ name: "Evidence Over Anecdote", description: "Every claim about test state must be backed by captured output. 'It passed' without terminal evidence is not evidence. 'I saw it fail' without the failure output is not RED. Capture commands, outputs, and results — not summaries from memory." }
|
|
1039
|
+
{ name: "Evidence Over Anecdote", description: "Every claim about test state must be backed by captured output. 'It passed' without terminal evidence is not evidence. 'I saw it fail' without the failure output is not RED. Capture commands, outputs, and results — not summaries from memory." },
|
|
1040
|
+
{ name: "Characterization First", description: "Before changing existing behavior, write characterization tests that capture current behavior as-is. These tests document what the system does today — even if that behavior is wrong. Only after the characterization suite is green do you add the new RED test for the desired change. This prevents accidental behavior destruction during refactoring." }
|
|
1039
1041
|
],
|
|
1040
1042
|
reviewSections: [
|
|
1041
1043
|
{
|
|
@@ -1144,7 +1146,8 @@ const REVIEW = {
|
|
|
1144
1146
|
{ id: "review_layer2_performance", description: "Performance review completed." },
|
|
1145
1147
|
{ id: "review_layer2_architecture", description: "Architecture fit review completed." },
|
|
1146
1148
|
{ id: "review_severity_classified", description: "All findings are severity-tagged." },
|
|
1147
|
-
{ id: "review_criticals_resolved", description: "No unresolved critical blockers remain." }
|
|
1149
|
+
{ id: "review_criticals_resolved", description: "No unresolved critical blockers remain." },
|
|
1150
|
+
{ id: "review_army_json_valid", description: "07-review-army.json passes schema validation (validateReviewArmy)." }
|
|
1148
1151
|
],
|
|
1149
1152
|
requiredEvidence: [
|
|
1150
1153
|
"Artifact written to `.cclaw/artifacts/07-review.md`.",
|
|
@@ -1179,7 +1182,9 @@ const REVIEW = {
|
|
|
1179
1182
|
{ claim: "Passing tests mean spec compliance by default.", reality: "Tests can miss requirement mismatches; explicit spec review is mandatory." },
|
|
1180
1183
|
{ claim: "Severity labels are unnecessary.", reality: "Without severity, release decisions become inconsistent." },
|
|
1181
1184
|
{ claim: "Critical issues can be fixed after ship.", reality: "Critical blockers must be resolved before release handoff." },
|
|
1182
|
-
{ claim: "Security review is not needed for internal tools.", reality: "Internal tools become external surface area. Security is always in scope." }
|
|
1185
|
+
{ claim: "Security review is not needed for internal tools.", reality: "Internal tools become external surface area. Security is always in scope." },
|
|
1186
|
+
{ claim: "A quick skim is sufficient for small diffs.", reality: "Small diffs hide high-impact changes. A 3-line auth bypass is still critical. Every diff gets layered review regardless of size." },
|
|
1187
|
+
{ claim: "The author already reviewed their own code.", reality: "Self-review misses blind spots by definition. Independent review exists precisely because authors cannot objectively evaluate their own assumptions." }
|
|
1183
1188
|
],
|
|
1184
1189
|
redFlags: [
|
|
1185
1190
|
"No separate Layer 1/Layer 2 outcomes",
|
|
@@ -1276,7 +1281,7 @@ const REVIEW = {
|
|
|
1276
1281
|
completionStatus: ["APPROVED", "APPROVED_WITH_CONCERNS", "BLOCKED"],
|
|
1277
1282
|
crossStageTrace: {
|
|
1278
1283
|
readsFrom: [".cclaw/artifacts/06-tdd.md", ".cclaw/artifacts/04-spec.md", ".cclaw/artifacts/05-plan.md"],
|
|
1279
|
-
writesTo: [".cclaw/artifacts/07-review.md"],
|
|
1284
|
+
writesTo: [".cclaw/artifacts/07-review.md", ".cclaw/artifacts/07-review-army.json"],
|
|
1280
1285
|
traceabilityRule: "Review verdict must reference specific spec criteria and TDD evidence. Downstream ship stage must reference review verdict."
|
|
1281
1286
|
},
|
|
1282
1287
|
artifactValidation: [
|
|
@@ -1284,7 +1289,7 @@ const REVIEW = {
|
|
|
1284
1289
|
{ section: "Layer 2 Findings", required: true, validationRule: "Each finding has severity, description, and resolution status." },
|
|
1285
1290
|
{ section: "Review Army Contract", required: true, validationRule: "Structured findings include id/severity/confidence/fingerprint/reportedBy/status with dedup reconciliation summary." },
|
|
1286
1291
|
{ section: "Review Readiness Dashboard", required: true, validationRule: "At least 4 readiness checklist lines including blocker and recommendation status." },
|
|
1287
|
-
{ section: "Severity Summary", required: true, validationRule: "
|
|
1292
|
+
{ section: "Severity Summary", required: true, validationRule: "Per-severity count lines for critical, important, and suggestion buckets." },
|
|
1288
1293
|
{ section: "Final Verdict", required: true, validationRule: "Exactly one of: APPROVED, APPROVED_WITH_CONCERNS, BLOCKED." }
|
|
1289
1294
|
],
|
|
1290
1295
|
namedAntiPattern: {
|
|
@@ -1345,7 +1350,8 @@ const SHIP = {
|
|
|
1345
1350
|
{ id: "ship_release_notes_written", description: "Release notes are complete and accurate." },
|
|
1346
1351
|
{ id: "ship_rollback_plan_ready", description: "Rollback trigger, steps, and verification are documented." },
|
|
1347
1352
|
{ id: "ship_finalization_mode_selected", description: "Exactly one finalization action is selected." },
|
|
1348
|
-
{ id: "ship_finalization_executed", description: "Selected finalization action was executed and verified." }
|
|
1353
|
+
{ id: "ship_finalization_executed", description: "Selected finalization action was executed and verified." },
|
|
1354
|
+
{ id: "ship_post_merge_tests", description: "Full test suite re-run on the merged result (not just the branch). Post-merge failures caught before release." }
|
|
1349
1355
|
],
|
|
1350
1356
|
requiredEvidence: [
|
|
1351
1357
|
"Artifact written to `.cclaw/artifacts/08-ship.md`.",
|
|
@@ -1378,7 +1384,10 @@ const SHIP = {
|
|
|
1378
1384
|
rationalizations: [
|
|
1379
1385
|
{ claim: "Rollback details can be written after release.", reality: "Rollback is part of release readiness, not post-release cleanup." },
|
|
1380
1386
|
{ claim: "Finalization choice is obvious from context.", reality: "Explicit branch action prevents accidental release state." },
|
|
1381
|
-
{ claim: "Urgent fixes can skip preflight.", reality: "Urgency increases risk; preflight discipline matters more, not less." }
|
|
1387
|
+
{ claim: "Urgent fixes can skip preflight.", reality: "Urgency increases risk; preflight discipline matters more, not less." },
|
|
1388
|
+
{ claim: "Monitoring can be set up after deploy.", reality: "If you cannot observe the release, you cannot detect failure. Monitoring is a ship prerequisite, not a follow-up task." },
|
|
1389
|
+
{ claim: "A small merge does not need post-merge testing.", reality: "Small merges on diverged bases cause silent conflicts. Post-merge suite runs catch what branch-only CI misses." },
|
|
1390
|
+
{ claim: "Release notes are internal documentation, not a ship gate.", reality: "Release notes are the rollback decision input. Without them, the team cannot assess what changed or why a rollback is needed." }
|
|
1382
1391
|
],
|
|
1383
1392
|
redFlags: [
|
|
1384
1393
|
"No rollback trigger/steps",
|
|
@@ -1403,7 +1412,8 @@ const SHIP = {
|
|
|
1403
1412
|
{ name: "Rollback-First Thinking", description: "Before shipping, answer: what tells me this is broken? How do I undo it? How do I verify the undo worked? If you cannot answer all three, you are not ready." },
|
|
1404
1413
|
{ name: "Explicit Over Implicit Finalization", description: "Merge, PR, keep, discard — each has different consequences. Pick one. Say it out loud. Write it down. Never let finalization be 'whatever the default is.'" },
|
|
1405
1414
|
{ name: "Post-Merge Paranoia", description: "The merge itself can introduce failures even when both branches pass independently. Always run the full suite AFTER merge, not just before." },
|
|
1406
|
-
{ name: "Observability Before Ship", description: "If you cannot monitor the change in production, you cannot know if it is broken. Monitoring/logging is a ship prerequisite, not a follow-up." }
|
|
1415
|
+
{ name: "Observability Before Ship", description: "If you cannot monitor the change in production, you cannot know if it is broken. Monitoring/logging is a ship prerequisite, not a follow-up." },
|
|
1416
|
+
{ name: "Release Blast Radius", description: "Before shipping, map the blast radius: how many users are affected if this breaks? Is it one endpoint or the entire app? Scale rollback urgency and monitoring to the blast radius, not the diff size. A 3-line auth change can have infinite blast radius." }
|
|
1407
1417
|
],
|
|
1408
1418
|
reviewSections: [
|
|
1409
1419
|
{
|
|
@@ -1430,17 +1440,22 @@ const SHIP = {
|
|
|
1430
1440
|
],
|
|
1431
1441
|
completionStatus: ["SHIPPED", "SHIPPED_WITH_EXCEPTIONS", "BLOCKED"],
|
|
1432
1442
|
crossStageTrace: {
|
|
1433
|
-
readsFrom: [".cclaw/artifacts/07-review.md", ".cclaw/artifacts/06-tdd.md"],
|
|
1443
|
+
readsFrom: [".cclaw/artifacts/07-review.md", ".cclaw/artifacts/06-tdd.md", ".cclaw/artifacts/05-plan.md", ".cclaw/artifacts/04-spec.md"],
|
|
1434
1444
|
writesTo: [".cclaw/artifacts/08-ship.md"],
|
|
1435
|
-
traceabilityRule: "Ship artifact must reference review verdict and resolution status. Rollback plan must reference specific changes that could fail."
|
|
1445
|
+
traceabilityRule: "Ship artifact must reference review verdict and resolution status. Release notes must reference spec criteria. Rollback plan must reference specific changes that could fail."
|
|
1436
1446
|
},
|
|
1437
1447
|
artifactValidation: [
|
|
1438
1448
|
{ section: "Preflight Results", required: true, validationRule: "Build, test, lint, type-check results captured with fresh output. Exceptions documented if any." },
|
|
1439
1449
|
{ section: "Release Notes", required: true, validationRule: "What changed, why, impact. References spec criteria. Breaking changes flagged." },
|
|
1440
1450
|
{ section: "Rollback Plan", required: true, validationRule: "Trigger conditions, rollback steps (exact commands), verification steps." },
|
|
1441
1451
|
{ section: "Monitoring", required: false, validationRule: "If applicable: what metrics/logs to watch post-deploy. Risk note if no monitoring." },
|
|
1442
|
-
{ section: "Finalization", required: true, validationRule: "Exactly one finalization enum token selected. Execution result documented. Worktree cleaned if applicable." }
|
|
1443
|
-
|
|
1452
|
+
{ section: "Finalization", required: true, validationRule: "Exactly one finalization enum token selected. Execution result documented. Worktree cleaned if applicable." },
|
|
1453
|
+
{ section: "Completion Status", required: false, validationRule: "If present: exactly one of SHIPPED, SHIPPED_WITH_EXCEPTIONS, BLOCKED. Exceptions documented when applicable." }
|
|
1454
|
+
],
|
|
1455
|
+
namedAntiPattern: {
|
|
1456
|
+
title: "Green CI Means Safe to Merge",
|
|
1457
|
+
description: "CI passing on a feature branch does not prove the merged result is safe. Post-merge test failures are common when the base branch has diverged. Re-run the full suite on the merge result, not just the branch. A green branch badge is a necessary condition, not a sufficient one."
|
|
1458
|
+
}
|
|
1444
1459
|
};
|
|
1445
1460
|
// ---------------------------------------------------------------------------
|
|
1446
1461
|
// Stage map and accessors
|
|
@@ -375,8 +375,7 @@ Execution rule: complete and verify each wave before starting the next wave.
|
|
|
375
375
|
"confidence": 7,
|
|
376
376
|
"category": "correctness",
|
|
377
377
|
"location": {
|
|
378
|
-
"file": ""
|
|
379
|
-
"line": 0
|
|
378
|
+
"file": ""
|
|
380
379
|
},
|
|
381
380
|
"fingerprint": "",
|
|
382
381
|
"reportedBy": [],
|
|
@@ -423,6 +422,10 @@ Execution rule: complete and verify each wave before starting the next wave.
|
|
|
423
422
|
- Selected label (A/B/C/D):
|
|
424
423
|
- Execution result:
|
|
425
424
|
- PR URL / merge commit / kept branch / discard confirmation:
|
|
425
|
+
|
|
426
|
+
## Completion Status
|
|
427
|
+
- SHIPPED | SHIPPED_WITH_EXCEPTIONS | BLOCKED
|
|
428
|
+
- Exceptions (if any):
|
|
426
429
|
`
|
|
427
430
|
};
|
|
428
431
|
export const RULEBOOK_MARKDOWN = `# Cclaw Rulebook
|