@warpgogol/forge 5.3.4 → 6.2.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/CHANGELOG.md +8 -0
- package/bin/cli.ts +7 -2
- package/dist/bin/cli.js +7 -2
- package/dist/bin/cli.js.map +1 -1
- package/dist/os/adr/adr.module.d.ts.map +1 -1
- package/dist/os/adr/adr.module.js +2 -0
- package/dist/os/adr/adr.module.js.map +1 -1
- package/dist/os/audit/audit.module.d.ts.map +1 -1
- package/dist/os/audit/audit.module.js +2 -0
- package/dist/os/audit/audit.module.js.map +1 -1
- package/dist/os/compass/compass.module.d.ts.map +1 -1
- package/dist/os/compass/compass.module.js +47 -15
- package/dist/os/compass/compass.module.js.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.d.ts +2 -0
- package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.js +40 -10
- package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-docs-validate.d.ts +13 -0
- package/dist/os/compass/handlers/compass-docs-validate.d.ts.map +1 -0
- package/dist/os/compass/handlers/compass-docs-validate.js +328 -0
- package/dist/os/compass/handlers/compass-docs-validate.js.map +1 -0
- package/dist/os/compass/handlers/summary-record.d.ts +11 -2
- package/dist/os/compass/handlers/summary-record.d.ts.map +1 -1
- package/dist/os/compass/handlers/summary-record.js +95 -15
- package/dist/os/compass/handlers/summary-record.js.map +1 -1
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +124 -73
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/core/handlers/file-size-lint.d.ts.map +1 -1
- package/dist/os/core/handlers/file-size-lint.js +2 -0
- package/dist/os/core/handlers/file-size-lint.js.map +1 -1
- package/dist/os/exploration/exploration.module.d.ts.map +1 -1
- package/dist/os/exploration/exploration.module.js +3 -0
- package/dist/os/exploration/exploration.module.js.map +1 -1
- package/dist/os/naming/naming-convention.d.ts.map +1 -1
- package/dist/os/naming/naming-convention.js +11 -1
- package/dist/os/naming/naming-convention.js.map +1 -1
- package/dist/os/naming/naming.module.d.ts.map +1 -1
- package/dist/os/naming/naming.module.js +9 -2
- package/dist/os/naming/naming.module.js.map +1 -1
- package/dist/os/notes/notes.module.d.ts.map +1 -1
- package/dist/os/notes/notes.module.js +17 -6
- package/dist/os/notes/notes.module.js.map +1 -1
- package/dist/os/plan/plan.module.d.ts.map +1 -1
- package/dist/os/plan/plan.module.js +2 -0
- package/dist/os/plan/plan.module.js.map +1 -1
- package/dist/os/plugin/plugin.module.d.ts.map +1 -1
- package/dist/os/plugin/plugin.module.js +9 -2
- package/dist/os/plugin/plugin.module.js.map +1 -1
- package/dist/os/program/program.module.d.ts.map +1 -1
- package/dist/os/program/program.module.js +19 -4
- package/dist/os/program/program.module.js.map +1 -1
- package/dist/os/queue/handlers/queue-validate.d.ts.map +1 -1
- package/dist/os/queue/handlers/queue-validate.js +154 -7
- package/dist/os/queue/handlers/queue-validate.js.map +1 -1
- package/dist/os/queue/manifest.d.ts +17 -1
- package/dist/os/queue/manifest.d.ts.map +1 -1
- package/dist/os/queue/manifest.js +127 -6
- package/dist/os/queue/manifest.js.map +1 -1
- package/dist/os/queue/queue.module.d.ts.map +1 -1
- package/dist/os/queue/queue.module.js +32 -4
- package/dist/os/queue/queue.module.js.map +1 -1
- package/dist/os/queue/types.d.ts +100 -1
- package/dist/os/queue/types.d.ts.map +1 -1
- package/dist/os/queue/types.js +44 -0
- package/dist/os/queue/types.js.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.js +30 -8
- package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
- package/dist/os/rfc/rfc.module.d.ts.map +1 -1
- package/dist/os/rfc/rfc.module.js +25 -6
- package/dist/os/rfc/rfc.module.js.map +1 -1
- package/dist/os/rfc/types.d.ts +12 -2
- package/dist/os/rfc/types.d.ts.map +1 -1
- package/dist/os/rfc/types.js +2 -2
- package/dist/os/rfc/types.js.map +1 -1
- package/dist/os/rfc/verification-evidence.d.ts +21 -0
- package/dist/os/rfc/verification-evidence.d.ts.map +1 -1
- package/dist/os/rfc/verification-evidence.js +134 -23
- package/dist/os/rfc/verification-evidence.js.map +1 -1
- package/dist/os/rfc/verification-refresh.d.ts.map +1 -1
- package/dist/os/rfc/verification-refresh.js +66 -37
- package/dist/os/rfc/verification-refresh.js.map +1 -1
- package/dist/os/session/handlers/save.d.ts.map +1 -1
- package/dist/os/session/handlers/save.js +42 -5
- package/dist/os/session/handlers/save.js.map +1 -1
- package/dist/os/session/session.module.d.ts.map +1 -1
- package/dist/os/session/session.module.js +5 -0
- package/dist/os/session/session.module.js.map +1 -1
- package/dist/os/spec/live-spec-merge.d.ts.map +1 -1
- package/dist/os/spec/live-spec-merge.js +55 -134
- package/dist/os/spec/live-spec-merge.js.map +1 -1
- package/dist/os/spec/live-spec-rebuild.d.ts +32 -0
- package/dist/os/spec/live-spec-rebuild.d.ts.map +1 -0
- package/dist/os/spec/live-spec-rebuild.js +272 -0
- package/dist/os/spec/live-spec-rebuild.js.map +1 -0
- package/dist/os/spec/live-spec-shared.d.ts +62 -0
- package/dist/os/spec/live-spec-shared.d.ts.map +1 -0
- package/dist/os/spec/live-spec-shared.js +315 -0
- package/dist/os/spec/live-spec-shared.js.map +1 -0
- package/dist/os/spec/live-spec-types.d.ts +17 -1
- package/dist/os/spec/live-spec-types.d.ts.map +1 -1
- package/dist/os/spec/live-spec-types.js +3 -0
- package/dist/os/spec/live-spec-types.js.map +1 -1
- package/dist/os/spec/live-spec-validate.d.ts.map +1 -1
- package/dist/os/spec/live-spec-validate.js +105 -2
- package/dist/os/spec/live-spec-validate.js.map +1 -1
- package/dist/os/spec/spec-materialize.d.ts +2 -0
- package/dist/os/spec/spec-materialize.d.ts.map +1 -1
- package/dist/os/spec/spec-materialize.js +45 -5
- package/dist/os/spec/spec-materialize.js.map +1 -1
- package/dist/os/spec/spec-schema.d.ts +19 -0
- package/dist/os/spec/spec-schema.d.ts.map +1 -1
- package/dist/os/spec/spec-schema.js +30 -0
- package/dist/os/spec/spec-schema.js.map +1 -1
- package/dist/os/spec/spec-status.d.ts +4 -0
- package/dist/os/spec/spec-status.d.ts.map +1 -1
- package/dist/os/spec/spec-status.js +19 -1
- package/dist/os/spec/spec-status.js.map +1 -1
- package/dist/os/spec/spec-validate.d.ts.map +1 -1
- package/dist/os/spec/spec-validate.js +55 -8
- package/dist/os/spec/spec-validate.js.map +1 -1
- package/dist/os/spec/spec.module.d.ts.map +1 -1
- package/dist/os/spec/spec.module.js +84 -8
- package/dist/os/spec/spec.module.js.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js +10 -4
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js.map +1 -1
- package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -1
- package/dist/os/werkstatt/werkstatt.module.js +13 -4
- package/dist/os/werkstatt/werkstatt.module.js.map +1 -1
- package/dist/os/workflow/workflow.module.d.ts.map +1 -1
- package/dist/os/workflow/workflow.module.js +13 -5
- package/dist/os/workflow/workflow.module.js.map +1 -1
- package/dist/src/cli-flags.d.ts.map +1 -1
- package/dist/src/cli-flags.js +25 -5
- package/dist/src/cli-flags.js.map +1 -1
- package/dist/src/config/forge-config.d.ts +3 -0
- package/dist/src/config/forge-config.d.ts.map +1 -1
- package/dist/src/config/forge-config.js +2 -0
- package/dist/src/config/forge-config.js.map +1 -1
- package/dist/src/onboarding/doctor.d.ts.map +1 -1
- package/dist/src/onboarding/doctor.js +2 -3
- package/dist/src/onboarding/doctor.js.map +1 -1
- package/dist/src/onboarding/init.d.ts.map +1 -1
- package/dist/src/onboarding/init.js +8 -3
- package/dist/src/onboarding/init.js.map +1 -1
- package/dist/src/pipeline-status.d.ts +14 -1
- package/dist/src/pipeline-status.d.ts.map +1 -1
- package/dist/src/pipeline-status.js +28 -8
- package/dist/src/pipeline-status.js.map +1 -1
- package/dist/src/types.d.ts +7 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/generated-marker.d.ts +8 -0
- package/dist/src/utils/generated-marker.d.ts.map +1 -1
- package/dist/src/utils/generated-marker.js +25 -0
- package/dist/src/utils/generated-marker.js.map +1 -1
- package/dist/src/validators/skill-validate.d.ts.map +1 -1
- package/dist/src/validators/skill-validate.js +2 -4
- package/dist/src/validators/skill-validate.js.map +1 -1
- package/os/adr/adr.module.ts +2 -0
- package/os/audit/audit.module.ts +2 -0
- package/os/compass/compass.module.ts +49 -15
- package/os/compass/handlers/compass-audit-handler.ts +51 -10
- package/os/compass/handlers/compass-docs-validate.ts +361 -0
- package/os/compass/handlers/summary-record.ts +106 -15
- package/os/compass/handlers/tests/compass-audit-record.test.ts +2 -1
- package/os/compass/handlers/tests/compass-audit-validate.test.ts +92 -3
- package/os/compass/handlers/tests/compass-docs-validate.test.ts +203 -0
- package/os/compass/handlers/tests/compass-ledger-scope.test.ts +2 -1
- package/os/compass/handlers/tests/compass-policy.test.ts +7 -1
- package/os/compass/handlers/tests/summary-record.test.ts +127 -0
- package/os/core/core.module.ts +147 -75
- package/os/core/docs-archive.test.ts +136 -0
- package/os/core/handlers/file-size-lint.ts +2 -0
- package/os/exploration/exploration.module.ts +3 -0
- package/os/naming/naming-convention.ts +11 -1
- package/os/naming/naming.module.ts +9 -2
- package/os/notes/notes.module.ts +17 -6
- package/os/plan/plan-0000-template.md +150 -0
- package/os/plan/plan.module.ts +2 -0
- package/os/plugin/plugin.module.ts +9 -2
- package/os/program/program.module.ts +19 -4
- package/os/queue/decision-ledger.test.ts +163 -0
- package/os/queue/handlers/queue-validate.ts +190 -8
- package/os/queue/manifest.ts +201 -7
- package/os/queue/queue-validate.test.ts +303 -0
- package/os/queue/queue.module.ts +32 -4
- package/os/queue/types.ts +56 -1
- package/os/rfc/handlers/implement-stamp.ts +37 -8
- package/os/rfc/rfc-read-only-no-side-effects.test.ts +1 -0
- package/os/rfc/rfc.module.ts +27 -6
- package/os/rfc/types.ts +18 -3
- package/os/rfc/verification-emit.test.ts +305 -0
- package/os/rfc/verification-evidence.ts +149 -24
- package/os/rfc/verification-refresh.test.ts +222 -1
- package/os/rfc/verification-refresh.ts +74 -38
- package/os/session/handlers/save.ts +37 -5
- package/os/session/session.module.ts +5 -0
- package/os/spec/live-spec-idempotency.pbt.test.ts +222 -0
- package/os/spec/live-spec-list-show-validate.test.ts +10 -6
- package/os/spec/live-spec-merge.test.ts +187 -7
- package/os/spec/live-spec-merge.ts +71 -155
- package/os/spec/live-spec-rebuild.test.ts +317 -0
- package/os/spec/live-spec-rebuild.ts +356 -0
- package/os/spec/live-spec-shared.ts +378 -0
- package/os/spec/live-spec-types.ts +21 -1
- package/os/spec/live-spec-validate.test.ts +317 -0
- package/os/spec/live-spec-validate.ts +106 -2
- package/os/spec/spec-materialize.test.ts +192 -0
- package/os/spec/spec-materialize.ts +48 -4
- package/os/spec/spec-schema.ts +49 -0
- package/os/spec/spec-status.ts +24 -0
- package/os/spec/spec-validate.test.ts +66 -0
- package/os/spec/spec-validate.ts +62 -8
- package/os/spec/spec.module.ts +85 -8
- package/os/werkstatt/handlers/werkstatt-operation-validate.ts +10 -4
- package/os/werkstatt/werkstatt.module.ts +13 -4
- package/os/workflow/workflow.module.ts +13 -5
- package/package.json +1 -1
- package/skills/_shared/fo-pipeline-conventions.md +126 -1
- package/skills/fo/fo-doc-audit/SKILL.md +4 -4
- package/skills/fo/fo-explore/SKILL.md +2 -1
- package/skills/fo/fo-fix/SKILL.md +11 -3
- package/skills/fo/fo-handoff/SKILL.md +4 -6
- package/skills/fo/fo-idea-create-rfc/SKILL.md +2 -1
- package/skills/fo/fo-idea-enhance/SKILL.md +23 -4
- package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +86 -22
- package/skills/fo/fo-idea-implement/SKILL.md +53 -10
- package/skills/fo/fo-idea-plan/SKILL.md +28 -6
- package/skills/fo/fo-review/SKILL.md +69 -8
- package/skills/fo/fo-session-retro/SKILL.md +3 -2
- package/skills/fo/fo-step-commit/SKILL.md +2 -0
- package/skills/shared/grilling/SKILL.md +12 -0
- package/skills/shared/writing-great-skills/GLOSSARY.md +2 -0
- package/skills/shared/writing-great-skills/SKILL.md +2 -1
- package/src/cli-flags.ts +23 -5
- package/src/config/forge-config.ts +4 -0
- package/src/onboarding/doctor.ts +2 -3
- package/src/onboarding/init.ts +8 -3
- package/src/pipeline-status.ts +32 -8
- package/src/tests/cli-flags.test.ts +20 -0
- package/src/tests/cli-output.test.ts +13 -7
- package/src/tests/fixtures/agents-generate-business-before.txt +7 -7
- package/src/tests/implement-stamp.test.ts +38 -0
- package/src/tests/session-handlers.test.ts +33 -0
- package/src/types.ts +13 -1
- package/src/utils/generated-marker.ts +28 -0
- package/src/validators/skill-validate.ts +2 -4
- package/skills/fo/fo-idea-implement/ADR-FLOW.md +0 -179
- package/skills/fo/fo-review/AXES.md +0 -70
|
@@ -429,6 +429,44 @@ describe("rfc.implement.stamp", () => {
|
|
|
429
429
|
expect(result.data?.violations).toEqual([]);
|
|
430
430
|
});
|
|
431
431
|
|
|
432
|
+
it("auto-selects the sole implement/feat-prefixed commit among multiple candidates", async () => {
|
|
433
|
+
const rfcFile = join(workspaceRoot, "docs", "rfcs", "rfc-0001-test-rfc.md");
|
|
434
|
+
await writeFile(rfcFile, RFC_BODY("RFC-0001", "accepted", true));
|
|
435
|
+
await commitAll(workspaceRoot, "docs: audit RFC-0001");
|
|
436
|
+
await writeFile(join(workspaceRoot, "src.txt"), "impl");
|
|
437
|
+
const implCommit = await commitAll(workspaceRoot, "implement: RFC-0001 — the change");
|
|
438
|
+
await writeFile(join(workspaceRoot, "src.txt"), "evidence");
|
|
439
|
+
await commitAll(workspaceRoot, "docs: RFC-0001 evidence sweep");
|
|
440
|
+
|
|
441
|
+
const result = await runRfcImplementStamp(
|
|
442
|
+
makeInputAutoDetect("RFC-0001"),
|
|
443
|
+
makeContext(workspaceRoot),
|
|
444
|
+
);
|
|
445
|
+
|
|
446
|
+
expect(result.exitCode).toBe(0);
|
|
447
|
+
expect(result.data?.status).toBe("pass");
|
|
448
|
+
expect(implCommit.startsWith(result.data?.data?.implementationCommit ?? "")).toBe(true);
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
it("still blocks with annotated candidates when several implement-prefixed commits exist", async () => {
|
|
452
|
+
const rfcFile = join(workspaceRoot, "docs", "rfcs", "rfc-0001-test-rfc.md");
|
|
453
|
+
await writeFile(rfcFile, RFC_BODY("RFC-0001", "accepted", true));
|
|
454
|
+
await commitAll(workspaceRoot, "implement: RFC-0001 step 1");
|
|
455
|
+
await writeFile(join(workspaceRoot, "src.txt"), "step 2");
|
|
456
|
+
await commitAll(workspaceRoot, "implement: RFC-0001 step 2");
|
|
457
|
+
|
|
458
|
+
const result = await runRfcImplementStamp(
|
|
459
|
+
makeInputAutoDetect("RFC-0001"),
|
|
460
|
+
makeContext(workspaceRoot),
|
|
461
|
+
);
|
|
462
|
+
|
|
463
|
+
expect(result.exitCode).toBe(1);
|
|
464
|
+
const imp03 = result.data?.violations.find((v) => v.rule === "RFC-IMP-03");
|
|
465
|
+
expect(imp03?.message).toContain("Multiple commits reference RFC-0001");
|
|
466
|
+
expect(imp03?.message).toContain("[implementation-shaped]");
|
|
467
|
+
expect(imp03?.message).toContain("Likely:");
|
|
468
|
+
});
|
|
469
|
+
|
|
432
470
|
// ── RFC-0795: RFC-IMP-07 dependsOn dependency gate tests ──────────────────
|
|
433
471
|
|
|
434
472
|
it("blocks stamping when a dependsOn RFC is not implemented (RFC-IMP-07)", async () => {
|
|
@@ -99,6 +99,39 @@ describe("session.save", () => {
|
|
|
99
99
|
expect(data2.skipped[0]).toHaveProperty("reason", "already converted");
|
|
100
100
|
});
|
|
101
101
|
|
|
102
|
+
test("ignores non-.atif files — claim intermediates and writer temp files are skipped", async () => {
|
|
103
|
+
const rawDir = join(dir, "docs/sessions/.raw");
|
|
104
|
+
await writeFile(join(rawDir, "orphan.atif.claim-999"), SAMPLE_ATIF, "utf-8");
|
|
105
|
+
await writeFile(join(rawDir, "half-written.atif.tmp"), SAMPLE_ATIF, "utf-8");
|
|
106
|
+
|
|
107
|
+
const result = await runSessionSave(makeInput(), makeContext(dir));
|
|
108
|
+
const data = result.data as SessionSaveResult & { skipped: Array<{ rawFile: string }> };
|
|
109
|
+
|
|
110
|
+
// Neither junk file was converted, claimed, or deleted.
|
|
111
|
+
const touched = data.skipped.map((s) => s.rawFile);
|
|
112
|
+
expect(touched).not.toContain("orphan.atif.claim-999");
|
|
113
|
+
expect(touched).not.toContain("half-written.atif.tmp");
|
|
114
|
+
const remaining = await readdir(rawDir);
|
|
115
|
+
expect(remaining).toContain("orphan.atif.claim-999");
|
|
116
|
+
expect(remaining).toContain("half-written.atif.tmp");
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test("--keep-raw restores the original filename after the atomic claim", async () => {
|
|
120
|
+
const rawDir = join(dir, "docs/sessions/.raw");
|
|
121
|
+
const uniqueAtif = `2026-07-28T10:00:00+02:00
|
|
122
|
+
User: keep-raw claim restore test.
|
|
123
|
+
Assistant: Done.
|
|
124
|
+
Commands: session.save`;
|
|
125
|
+
await writeFile(join(rawDir, "keepraw-claim.atif"), uniqueAtif, "utf-8");
|
|
126
|
+
|
|
127
|
+
const result = await runSessionSave(makeInput({ "keep-raw": true }), makeContext(dir));
|
|
128
|
+
expect(result.data.id).not.toBe("");
|
|
129
|
+
|
|
130
|
+
const remaining = await readdir(rawDir);
|
|
131
|
+
expect(remaining).toContain("keepraw-claim.atif");
|
|
132
|
+
expect(remaining.filter((n) => n.startsWith("keepraw-claim.atif.claim-"))).toHaveLength(0);
|
|
133
|
+
});
|
|
134
|
+
|
|
102
135
|
test("deletes raw file on skip when --keep-raw is not set (idempotency cleanup)", async () => {
|
|
103
136
|
const uniqueAtif = `2026-07-27T09:15:00+02:00
|
|
104
137
|
User: Fix the session.save idempotency bug in save.ts.
|
package/src/types.ts
CHANGED
|
@@ -17,6 +17,12 @@ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten
|
|
|
17
17
|
|
|
18
18
|
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
19
19
|
<item>RFC-1147: ForgeRegisteredCommandInfo.provider narrowed to "workspace" and siteName field removed — forge never enumerated sites; mirrors the KernelRegisteredCommandInfo cleanup.</item>
|
|
20
|
+
<item>RFC-1231: step 1 — rename supportsAllSites to acceptsAllFlag
|
|
21
|
+
|
|
22
|
+
Mechanical sweep: the field only ever gated --all argv acceptance; fan-out
|
|
23
|
+
follows the parsed selector. Guard renamed assertAllSitesAllowed ->
|
|
24
|
+
assertAllFlagAccepted, message updated. 417 declaration sites + type
|
|
25
|
+
surfaces (KernelCommandMetadata, ForgeCommandMetadata) in one atomic pass.</item>
|
|
20
26
|
</CHANGE_SUMMARY>
|
|
21
27
|
*/
|
|
22
28
|
|
|
@@ -185,7 +191,7 @@ export interface ForgeCommandMetadata {
|
|
|
185
191
|
*/
|
|
186
192
|
modulePath?: string;
|
|
187
193
|
requiresNetwork?: boolean;
|
|
188
|
-
|
|
194
|
+
acceptsAllFlag?: boolean;
|
|
189
195
|
/** RFC-0963: validation contract this command belongs to (e.g. "content", "seo"). */
|
|
190
196
|
contract?: string;
|
|
191
197
|
/** RFC-0963: rule IDs this validator can emit. Empty for non-emitting validators. */
|
|
@@ -200,6 +206,12 @@ export interface ForgeCommandMetadata {
|
|
|
200
206
|
* with GateMetadata from @warpgogol/site-kernel. Does NOT affect execution.
|
|
201
207
|
*/
|
|
202
208
|
gate?: GateMetadata;
|
|
209
|
+
/**
|
|
210
|
+
* RFC-1243: coverage declaration for commands with no mechanical invocation
|
|
211
|
+
* record. Structurally mirrors KernelCommandMetadata.
|
|
212
|
+
*/
|
|
213
|
+
coverage?: "operator" | "ci" | "delegated";
|
|
214
|
+
coverageNote?: string;
|
|
203
215
|
}
|
|
204
216
|
|
|
205
217
|
// ---------------------------------------------------------------------------
|
|
@@ -7,10 +7,14 @@ source (dependency inversion).</purpose>
|
|
|
7
7
|
<item>Do not perform file I/O — operates on in-memory content strings only.</item>
|
|
8
8
|
</non-goals>
|
|
9
9
|
</MODULE_CONTRACT>
|
|
10
|
+
<KEY_DECISIONS>
|
|
11
|
+
<item>RFC-1237: generatedHeaderFields emits marker data as leading YAML keys (not comment lines) so the emit-canonical envelope header survives yamlParse round-trips — comment headers could not express ownerCommand/regenerateCommand in parsed form.</item>
|
|
12
|
+
</KEY_DECISIONS>
|
|
10
13
|
<CHANGE_SUMMARY>
|
|
11
14
|
<item>Moved from @warpgogol/site-kernel/generated-marker to forge as canonical source.</item>
|
|
12
15
|
<item>Added optional commandPrefix to GeneratedHeaderInput — defaults to "forge" for autonomous mode; site-kernel passes "pnpm exec werkstatt run".</item>
|
|
13
16
|
<item>Added editable flag to GeneratedHeaderInput — when true, emits a permissive marker and advisory that encourages agents to edit the file. AGENTS.md files use editable: true; other generated files keep the restrictive marker.</item>
|
|
17
|
+
<item>RFC-1237: added generatedHeaderFields — structured marker keys for generated YAML files (generatedMarker/doNotEdit/ownerCommand/editInstead/regenerateCommand), the emit-canonical envelope header format.</item>
|
|
14
18
|
</CHANGE_SUMMARY>
|
|
15
19
|
*/
|
|
16
20
|
|
|
@@ -166,6 +170,30 @@ export function commentStyleForPath(filePath: string): GeneratedHeaderCommentSty
|
|
|
166
170
|
return "line-slash";
|
|
167
171
|
}
|
|
168
172
|
|
|
173
|
+
/**
|
|
174
|
+
* RFC-1237: structured marker fields for generated YAML files — the key-format
|
|
175
|
+
* counterpart of buildGeneratedHeader's comment rendering. Generators whose
|
|
176
|
+
* output is YAML prepend these as leading top-level keys; consumers strip them
|
|
177
|
+
* (e.g. loadInternalManifest drops generatedMarker/doNotEdit/ownerCommand/
|
|
178
|
+
* editInstead/regenerateCommand before parsing the payload).
|
|
179
|
+
*/
|
|
180
|
+
export function generatedHeaderFields(
|
|
181
|
+
input: Pick<GeneratedHeaderInput, "ownerCommand" | "commandPrefix" | "site" | "editable">,
|
|
182
|
+
): Record<string, string> {
|
|
183
|
+
const prefix = input.commandPrefix ?? "forge";
|
|
184
|
+
const editable = input.editable ?? false;
|
|
185
|
+
const regenerateCommand = input.site
|
|
186
|
+
? `${prefix} ${input.ownerCommand} --site ${input.site}`
|
|
187
|
+
: `${prefix} ${input.ownerCommand}`;
|
|
188
|
+
return {
|
|
189
|
+
generatedMarker: editable ? EDITABLE_GENERATED_MARKER : GENERATED_MARKER,
|
|
190
|
+
doNotEdit: editable ? SAFE_TO_EDIT_LINE : DO_NOT_EDIT_LINE,
|
|
191
|
+
ownerCommand: input.ownerCommand,
|
|
192
|
+
editInstead: `the ${input.ownerCommand} generator source (not this file).`,
|
|
193
|
+
regenerateCommand,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
169
197
|
export function buildGeneratedHeader(input: GeneratedHeaderInput): string {
|
|
170
198
|
const style = commentStyleForPath(input.filePath);
|
|
171
199
|
const prefix = input.commandPrefix ?? "forge";
|
|
@@ -6,9 +6,6 @@
|
|
|
6
6
|
</non-goals>
|
|
7
7
|
</MODULE_CONTRACT>
|
|
8
8
|
<CHANGE_SUMMARY>
|
|
9
|
-
<item>RFC-1225: forgeRoot resolves via resolveForgeRoot (monorepo or npm-installed package); unresolvable root returns a single SKILL-00; pack discovery loads forge.yaml from workspaceRoot.</item>
|
|
10
|
-
<item>RFC-1227: SKILL-17 exempts HTML comment regions (file metadata written by the platform's own changelog tooling); pack-skill loop drops SKILL-17 (RFC-0553 scoped it to shipped canonical skills only).</item>
|
|
11
|
-
<item>RFC-0642: added SKILL-18 — forge skill instruction lines must not reference software-specific binding keys (typecheck, scopedBuild, test); use semantic keys (validate, produce, verify) instead.</item>
|
|
12
9
|
<item>RFC-0660: added SKILL-19 (knowledge entry schema validity) and SKILL-20 (entry identifier uniqueness) for structured knowledge files.</item>
|
|
13
10
|
<item>RFC-0661: added SKILL-21 (knowledge layer token budget warnings), refactored warning handling — warnings go to separate `warnings` array, not `violations`.</item>
|
|
14
11
|
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
@@ -17,7 +14,8 @@ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten
|
|
|
17
14
|
<item>RFC-1097: sweep — packages/forge + services clean
|
|
18
15
|
|
|
19
16
|
Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
|
|
20
|
-
<
|
|
17
|
+
<item>RFC-1249: wire werkstatt.commands.validate into packages.check + retire CMD-OUTPUT debt</item>
|
|
18
|
+
<history>RFC-0374, RFC-0393, RFC-0523, RFC-0524, RFC-0539, RFC-0548, RFC-0553, RFC-0642, RFC-1225, RFC-1227, SKILL-00, SKILL-17</history>
|
|
21
19
|
</CHANGE_SUMMARY>
|
|
22
20
|
*/
|
|
23
21
|
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
# ADR Implementation Flow
|
|
2
|
-
|
|
3
|
-
Execute this flow when the document is an ADR (prefix `ADR-`, or file in `docs/adrs/`).
|
|
4
|
-
|
|
5
|
-
## 4.1. Read the ADR
|
|
6
|
-
|
|
7
|
-
Read the ADR file. Extract:
|
|
8
|
-
|
|
9
|
-
- **Status** — must be `accepted`, `reviewing`, or `proposed`. If `superseded` or `rejected` (terminal), stop with message: `ADR-XXXX is <status> (terminal). Terminal ADRs cannot be implemented. To change this decision, create a new ADR or RFC that supersedes ADR-XXXX.` If `implemented`, stop with message: `ADR-XXXX is already implemented. Nothing to do.`
|
|
10
|
-
- **Decision** — the core decision from the `## Decision` section.
|
|
11
|
-
- **Context** — the local situation and constraints from `## Context`.
|
|
12
|
-
- **Consequences** — what the decision implies for the codebase.
|
|
13
|
-
- **Related** — any RFCs, ADRs, or DNA invariants referenced.
|
|
14
|
-
|
|
15
|
-
## 4.2. Transition to accepted (if needed)
|
|
16
|
-
|
|
17
|
-
If the ADR is `proposed` or `reviewing`, transition it to `accepted`:
|
|
18
|
-
|
|
19
|
-
1. Set `status: accepted` in the frontmatter.
|
|
20
|
-
2. Set `updatedAt: <today's date>`.
|
|
21
|
-
3. If `reviewers` is empty, read the default reviewer(s) from the `reviewers` field comment in `docs/adrs/adr-0000-template.md`. Set all listed default reviewers.
|
|
22
|
-
4. Commit:
|
|
23
|
-
|
|
24
|
-
```txt
|
|
25
|
-
adr: accept ADR-XXXX <short title>
|
|
26
|
-
|
|
27
|
-
Transition ADR-XXXX to accepted status for implementation.
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
Stage only the ADR file.
|
|
31
|
-
|
|
32
|
-
If the ADR is already `accepted`, proceed directly.
|
|
33
|
-
|
|
34
|
-
## 4.3. Implement the decision
|
|
35
|
-
|
|
36
|
-
Read the `## Decision` section and implement it in code. Follow the same principles as RFC implementation:
|
|
37
|
-
|
|
38
|
-
- Make autonomous, ecosystem-aligned decisions.
|
|
39
|
-
- Use `edit`/`multi_edit` for changes to existing files, `write_to_file` for new files.
|
|
40
|
-
- Commit each logical phase of work:
|
|
41
|
-
|
|
42
|
-
```txt
|
|
43
|
-
implement: ADR-XXXX — <phase description>
|
|
44
|
-
|
|
45
|
-
<one-line description of what was done in this phase>.
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Stage only the files touched by this phase — see `_shared/fo-pipeline-conventions.md` §Commit discipline.
|
|
49
|
-
|
|
50
|
-
- Recoverable errors: see `_shared/fo-pipeline-conventions.md` §Recoverable errors.
|
|
51
|
-
|
|
52
|
-
## 4.4. Run scoped build checks
|
|
53
|
-
|
|
54
|
-
After implementation is complete, run heavy checks for the impacted workspaces only:
|
|
55
|
-
|
|
56
|
-
1. ADR validation:
|
|
57
|
-
|
|
58
|
-
```sh
|
|
59
|
-
ref(forge.yaml bindings.commands.validateAdr)
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
2. Determine impacted packages/apps from the ADR's `scope` and the files touched during implementation. Build only those workspaces:
|
|
63
|
-
|
|
64
|
-
```sh
|
|
65
|
-
pnpm --filter @gogol/<package> run build:check
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Or for apps:
|
|
69
|
-
|
|
70
|
-
```sh
|
|
71
|
-
pnpm --filter <app-name> run build:check
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
See `_shared/fo-pipeline-conventions.md` §Build verification discipline.
|
|
75
|
-
|
|
76
|
-
## 4.5. Fix errors
|
|
77
|
-
|
|
78
|
-
If any check fails, fix every error:
|
|
79
|
-
|
|
80
|
-
1. Read the error output.
|
|
81
|
-
2. Identify the root cause.
|
|
82
|
-
3. Fix it.
|
|
83
|
-
4. Re-run the failing check to confirm the fix.
|
|
84
|
-
5. Commit each fix:
|
|
85
|
-
|
|
86
|
-
```txt
|
|
87
|
-
fix: ADR-XXXX — <error description>
|
|
88
|
-
|
|
89
|
-
<one-line description of the root cause and fix>.
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Continue until all impacted checks pass.
|
|
93
|
-
|
|
94
|
-
## 4.6. Documentation audit (fo-doc-audit)
|
|
95
|
-
|
|
96
|
-
After implementation is complete and all checks pass, invoke `fo-doc-audit` via the `skill` tool. It analyzes the session's changes, checks all documentation surfaces, applies needed updates, and commits them separately. Wait for it to complete.
|
|
97
|
-
|
|
98
|
-
If `fo-doc-audit` reports that no updates are needed, proceed to the next step.
|
|
99
|
-
|
|
100
|
-
## 4.7. ADR code-trace
|
|
101
|
-
|
|
102
|
-
Before stamping `implemented`, verify that the ADR is mentioned in the codebase — this leaves a trace linking code back to the decision record, just as RFCs leave traces.
|
|
103
|
-
|
|
104
|
-
1. **Search for the ADR id** — use `grep_search` to scan `apps/`, `packages/`, and `services/` for the ADR id string (e.g. `ADR-0003`). Check:
|
|
105
|
-
- **COMPASS block comments** — `MODULE_CONTRACT`, `CHANGE_SUMMARY`, or other Compass scaffolding comments that reference the ADR id.
|
|
106
|
-
- **Inline code mentions** — comments, docstrings, or annotations in source files that reference the ADR id.
|
|
107
|
-
|
|
108
|
-
2. **If mentions are found** — the trace exists. Proceed to step 4.8.
|
|
109
|
-
|
|
110
|
-
3. **If no mentions are found** — attempt to find the most relevant file(s) where the decision was implemented. If the file(s) can be identified:
|
|
111
|
-
- Add a Compass block comment referencing the ADR id to the file's `MODULE_CONTRACT` or `CHANGE_SUMMARY` section. For example: `<item>ADR-0003: <brief note on what this ADR decided for this module.</item>`
|
|
112
|
-
- If the file has no Compass scaffolding, add a brief inline comment at the top of the file: `// Implements ADR-XXXX: <one-line decision summary>`
|
|
113
|
-
- Commit the trace:
|
|
114
|
-
|
|
115
|
-
```txt
|
|
116
|
-
trace: ADR-XXXX — add code mention
|
|
117
|
-
|
|
118
|
-
Add ADR-XXXX reference to <file> to link the decision to the code.
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
- Proceed to step 4.8.
|
|
122
|
-
|
|
123
|
-
4. **If the relevant file(s) cannot be identified** — ask the operator: `ADR-XXXX was implemented but no code mention was found. Please point to the file(s) where this ADR's decision was applied so I can add a trace reference.` After the operator provides the file(s), add the trace as described in step 3, commit, and proceed.
|
|
124
|
-
|
|
125
|
-
**For already-implemented ADRs** (if this step is reached for an ADR that was already `implemented`): this check is informational — attempt to find the trace and add it if missing, but do not block on it.
|
|
126
|
-
|
|
127
|
-
## 4.8. Stamp implemented
|
|
128
|
-
|
|
129
|
-
After all checks pass and documentation is updated, transition the ADR to `implemented`:
|
|
130
|
-
|
|
131
|
-
1. Set `status: implemented` in the frontmatter.
|
|
132
|
-
2. Set `implementedAt: <today's date>`.
|
|
133
|
-
3. Set `updatedAt: <today's date>`.
|
|
134
|
-
4. Commit:
|
|
135
|
-
|
|
136
|
-
```txt
|
|
137
|
-
adr: implement ADR-XXXX <short title>
|
|
138
|
-
|
|
139
|
-
Transition ADR-XXXX to implemented status. Decision is live in code,
|
|
140
|
-
scoped build passes.
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
Stage only the ADR file.
|
|
144
|
-
|
|
145
|
-
## 4.9. Review (fo-review) — MANDATORY GATE
|
|
146
|
-
|
|
147
|
-
**This step is unconditional.** It MUST be executed after every implementation run — regardless of whether build checks passed, failed, or were fixed. No exceptions. The ADR report (step 4.11) MUST NOT be emitted until this step is complete.
|
|
148
|
-
|
|
149
|
-
1. **Determine the diff scope** — identify the git fixed point at the start of this implementation session (the commit before the first `implement:` or `adr:` commit). Capture the diff via `git diff <fixed-point>...HEAD`.
|
|
150
|
-
2. **Invoke `fo-review`** — run the review skill inline via the `skill` tool, passing the diff scope. Wait for it to complete (mechanical floor, seven axes, spec compliance, persist report + commit). If the `skill` tool call fails, retry once. If it fails again, proceed to step 4.11 and note the failure in the report.
|
|
151
|
-
3. **Read the review report** — extract the verdict and all findings.
|
|
152
|
-
|
|
153
|
-
If the review verdict is **Approved** with zero findings, skip step 4.10 and proceed directly to step 4.11 (Report).
|
|
154
|
-
|
|
155
|
-
## 4.10. Fix findings (fo-fix) — MANDATORY if findings exist
|
|
156
|
-
|
|
157
|
-
If the review has ANY findings — this step MUST be executed — it is not optional. "Findings" means any issue noted under any review axis (A–G), regardless of severity label ("minor", "cosmetic", "advisory") or the review's overall verdict. An **approved** verdict with minor findings **still requires** `fo-fix` — do not skip because the verdict is "approved" or findings are "minor". The only case where this step is skipped is a review with **zero findings** (every axis says "No issues."):
|
|
158
|
-
|
|
159
|
-
1. **Re-verify findings** — before fixing, quickly check whether each finding is still relevant: the flagged code may have been changed by a subsequent step. Discard stale findings.
|
|
160
|
-
2. **Invoke `fo-fix`** — run the fix skill inline via the `skill` tool. It reads the persisted review report, applies fixes in priority order, runs scoped typecheck verification, commits, and delegates doc updates to `fo-doc-audit`. Wait for it to complete. If the `skill` tool call fails, retry once. If it fails again, proceed to step 4.11 and note the failure in the report.
|
|
161
|
-
3. **Re-run scoped build checks** if `fo-fix` made code changes — repeat step 4.4 for any workspaces touched by the fixes.
|
|
162
|
-
|
|
163
|
-
If the review verdict is **Approved** with zero findings, skip this step — no fix is needed.
|
|
164
|
-
|
|
165
|
-
## 4.11. Report
|
|
166
|
-
|
|
167
|
-
After implementation, review, and fix are complete, report:
|
|
168
|
-
|
|
169
|
-
```
|
|
170
|
-
## ADR-XXXX Implementation Summary
|
|
171
|
-
|
|
172
|
-
### Decision: <one-line summary>
|
|
173
|
-
### Phases implemented: <count>
|
|
174
|
-
### Commits: <count>
|
|
175
|
-
### Scoped build: <Pass | Fail — fixed>
|
|
176
|
-
### Review: <verdict> — <N> findings
|
|
177
|
-
### Fix: <done, <N> findings fixed | skipped, no findings>
|
|
178
|
-
### Status: implemented (<date>)
|
|
179
|
-
```
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
# Review Axes
|
|
2
|
-
|
|
3
|
-
Load this file when running step 4 of `fo-review`. For each axis, check every item. An item either **passes**, **fails** (specific finding with evidence), or is **not applicable** (state why). Skip N/A items silently — do not pad the report.
|
|
4
|
-
|
|
5
|
-
## Axis A — Structural correctness
|
|
6
|
-
|
|
7
|
-
Beyond what the mechanical floor catches:
|
|
8
|
-
|
|
9
|
-
- **Strict typing** — flag `any`, implicit casts, missing interfaces, untyped parameters, non-exhaustive switch/if chains.
|
|
10
|
-
- **No magic numbers or untyped data** — flag literal constants that should be named, enums, or config; flag strings standing in for domain concepts.
|
|
11
|
-
- **Minimalism** — flag over-engineered abstractions, speculative generality, duplicated logic, or middle-man modules that can be simplified.
|
|
12
|
-
- **Dead code** — flag unreachable branches, unused exports, commented-out code blocks.
|
|
13
|
-
- **Error handling** — flag swallowed errors, bare `catch` blocks without context, missing error types.
|
|
14
|
-
|
|
15
|
-
## Axis B — DNA alignment
|
|
16
|
-
|
|
17
|
-
Check the diff against every DNA invariant it touches. The list below is the minimum scan set — if the diff touches a DNA invariant not listed here, check it too.
|
|
18
|
-
|
|
19
|
-
- **DNA-1** (monorepo boundary) — no `apps/* → apps/*` or `apps/* → services/*` imports.
|
|
20
|
-
- **DNA-4** (canonical content) — no hardcoded copy strings or configuration in routes/components that belongs in `src/content/`.
|
|
21
|
-
- **DNA-5 / DNA-17** (mirror quintet) — every new `.astro` component/section has colocated `manifest.yaml`, content schema, `.css`, and content `.md`.
|
|
22
|
-
- **DNA-6** (kebab-case) — all new filenames use kebab-case.
|
|
23
|
-
- **DNA-7** (thin routes) — route files are orchestrators only; no inline `<style>`, hardcoded body copy, or layout logic.
|
|
24
|
-
- **DNA-8** (page → section → component → content) — visitor-facing page bodies are composed as ordered section components.
|
|
25
|
-
- **DNA-10** (no hardcoded tokens) — CSS uses `--ds-*` custom properties only; no raw `rgba()` or `#hex`.
|
|
26
|
-
- **DNA-23** (cosmic naming) — new manifests carry `cosmicName` from the correct closed catalog; three-way alignment (manifest ↔ `PLANET_IMPORT_PATHS` / `MOON_IMPORT_PATHS` ↔ `system.md`).
|
|
27
|
-
- **DNA-24** (block-declarative pages) — page entries are frontmatter-only; no markdown bodies.
|
|
28
|
-
- **DNA-25** (single buildPage) — routes call `buildPage`; no hand-assembled block composition.
|
|
29
|
-
- **DNA-40** (env-example) — new env vars are documented in `.env.example`.
|
|
30
|
-
- **DNA-42** (Compass markup) — new authored source files carry `MODULE_CONTRACT` and `CHANGE_SUMMARY`.
|
|
31
|
-
- **DNA-51** (Werkstatt primitives) — mutating Werkstatt commands use shared lock/idempotency/atomic-write helpers.
|
|
32
|
-
|
|
33
|
-
## Axis C — Ecosystem fit
|
|
34
|
-
|
|
35
|
-
- **Package boundaries**: imports flow `apps/* → packages/*` and `services/* → packages/*`, never `apps/* → apps/*` or `apps/* → services/*`.
|
|
36
|
-
- **Pipeline placement**: new checks are placed in the correct pipeline (`build.prepare`, `build.check`, `sites-check`, `sites-check-postbuild`) with justified blocking vs. advisory choice.
|
|
37
|
-
- **Compass sync**: if the diff changes repository-wide requirements, shared package contracts, or app-package relationships, the relevant `docs/*.xml` files are updated.
|
|
38
|
-
- **AGENTS.md updates**: if the diff introduces new rules or patterns, the relevant `AGENTS.md` files are updated.
|
|
39
|
-
- **Cosmic naming**: if the diff touches manifests or component/section/page contracts, the three-way alignment is maintained.
|
|
40
|
-
- **Command lifecycle**: new commands are registered in the correct module; changed commands update their metadata; removed commands are explicitly deprecated.
|
|
41
|
-
|
|
42
|
-
## Axis D — Forward-only compliance
|
|
43
|
-
|
|
44
|
-
- No compatibility shims, bridges, or dual-paths that keep legacy behavior alive.
|
|
45
|
-
- Deprecation means removal in the same change, not an indefinite grace period.
|
|
46
|
-
- Legacy code paths are deleted, not maintained behind a flag.
|
|
47
|
-
- If the diff amends an existing contract, it changes the contract directly — no parallel interpretation.
|
|
48
|
-
|
|
49
|
-
## Axis E — Agent-facing clarity
|
|
50
|
-
|
|
51
|
-
- **Compass scaffolding**: new non-trivial source files carry `MODULE_CONTRACT` and `CHANGE_SUMMARY`; high-risk files carry `@ai-invariant` lines.
|
|
52
|
-
- **No ungrounded assertions**: code comments and docstrings reference real functions, types, and files — no invented APIs or phantom parameters.
|
|
53
|
-
- **Readable by another agent**: variable names reveal what they hold; function names reveal what they do; no mysterious names.
|
|
54
|
-
- **Log-driven development**: logs carry enough context for debugging; no bare `console.log` without context or structure. Prefer the repo's shared logging contracts when they exist.
|
|
55
|
-
- **Anti-fabrication**: if the diff includes content claims (prose, business records), the code distinguishes between generated content and human-authored content.
|
|
56
|
-
|
|
57
|
-
## Axis F — Pragmatism
|
|
58
|
-
|
|
59
|
-
- **Minimal command surface**: each new command earns its existence — no command that could be a flag on an existing command.
|
|
60
|
-
- **Lean contracts**: TypeScript types are the minimum needed — no speculative generality, no unused optional fields.
|
|
61
|
-
- **Existing patterns**: the diff checks whether an existing command, schema, or pattern can be extended before introducing a new one.
|
|
62
|
-
- **Scope discipline**: the diff touches only what's necessary; no scope creep into unrelated areas.
|
|
63
|
-
|
|
64
|
-
## Axis G — Blind spots
|
|
65
|
-
|
|
66
|
-
- **Performance**: new build-time commands specify their cost (file scan count, regex complexity, I/O patterns).
|
|
67
|
-
- **False positives**: new validators estimate their false-positive rate and describe suppression during migration.
|
|
68
|
-
- **Edge cases**: the diff considers empty states (new app with no content), concurrent execution, and interrupted operations.
|
|
69
|
-
- **Migration path**: existing apps' path to compliance is documented.
|
|
70
|
-
- **Security / privacy**: if the diff touches user data, PII, or external services, it addresses GDPR/privacy and secret management. No cookies (`document.cookie`, `Set-Cookie`). Client-side persistence is `localStorage` only; server-side is `unstorage`.
|