FN-7104: Align ce-brainstorm durable artifact references

Keep bundled ce-brainstorm guidance aligned with docs/plans as the durable planning artifact.

- Update the visual probe reference to name docs/plans as the durable artifact.
- Add a recursive skill-content guard that prevents docs/brainstorms from being described as new or durable output.
- Assert legacy docs/brainstorms wording remains limited to ce-plan inputs.

Files changed:
 .../__tests__/skill-content-alias-guard.test.ts    | 85 ++++++++++++++++++++++
 .../ce-brainstorm/references/visual-probes.md      |  2 +-
 2 files changed, 86 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-7104

Fusion-Task-Lineage: dd26a511-816d-479c-99ac-7cfec2b96bd4

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
This commit is contained in:
gsxdsm
2026-06-27 01:21:44 -07:00
parent b69dd8eb14
commit 9843f2e772
2 changed files with 86 additions and 1 deletions

View File

@@ -0,0 +1,85 @@
import { readdirSync, readFileSync, statSync } from "node:fs";
import { relative, join } from "node:path";
import { fileURLToPath } from "node:url";
import { describe, expect, it } from "vitest";
const ceBrainstormRoot = fileURLToPath(new URL("../skills/ce-brainstorm/", import.meta.url));
const visualProbesPath = join(ceBrainstormRoot, "references/visual-probes.md");
const skillPath = join(ceBrainstormRoot, "SKILL.md");
const brainstormSectionsPath = join(ceBrainstormRoot, "references/brainstorm-sections.md");
function readUtf8(path: string): string {
return readFileSync(path, "utf8");
}
function listMarkdownFiles(root: string): string[] {
return readdirSync(root, { withFileTypes: true }).flatMap((entry) => {
const path = join(root, entry.name);
if (entry.isDirectory()) {
return listMarkdownFiles(path);
}
if (entry.isFile() && entry.name.endsWith(".md")) {
return [path];
}
return [];
});
}
function lineNumberForOffset(content: string, offset: number): number {
return content.slice(0, offset).split("\n").length;
}
/*
FNXC:CompoundEngineering 2026-06-27-01:15:
CE brainstorm and plan share a unified durable artifact under docs/plans/, while docs/brainstorms/ remains only a legacy input. This content guard protects the prompt-executed bundled skill text from regressing to a new-output or durable-artifact claim for docs/brainstorms/ during future upstream refreshes.
*/
describe("bundled ce-brainstorm docs/plans alias content", () => {
it("does not name docs/brainstorms as the durable or new brainstorm output", () => {
const forbiddenDurableOutputClaims = [
/docs\/brainstorms\/[^\n.]*\b(?:is|are)\b[^\n.]*\bdurable artifact\b/gi,
/(?:durable artifact|durable document|durable output|final requirements doc)[^\n.]*docs\/brainstorms\//gi,
/new\s+`?ce-brainstorm`?\s+outputs?\s+(?:write|go|land|belong)[^\n.]*docs\/brainstorms\//gi,
];
const failures = listMarkdownFiles(ceBrainstormRoot).flatMap((path) => {
const content = readUtf8(path);
return forbiddenDurableOutputClaims.flatMap((pattern) => {
pattern.lastIndex = 0;
return Array.from(content.matchAll(pattern), (match) => {
const line = lineNumberForOffset(content, match.index ?? 0);
return `${relative(ceBrainstormRoot, path)}:${line}: ${match[0]}`;
});
});
});
expect(failures).toEqual([]);
});
it("keeps visual probes pointing at docs/plans for the durable artifact", () => {
const visualProbes = readUtf8(visualProbesPath);
expect(visualProbes).toContain(
"The requirements-only unified plan in `docs/plans/` is the durable artifact.",
);
expect(visualProbes).not.toContain(
"The final requirements doc in `docs/brainstorms/` is the durable artifact.",
);
});
it("keeps docs/brainstorms labeled as legacy input rather than new output", () => {
const skill = readUtf8(skillPath);
const brainstormSections = readUtf8(brainstormSectionsPath);
expect(skill).toContain(
"Historical `docs/brainstorms/*-requirements.{md,html}` files remain legacy inputs for `ce-plan`, but new `ce-brainstorm` outputs do not write there.",
);
expect(brainstormSections).toContain(
"Historical `docs/brainstorms/*-requirements.*` files remain valid legacy\ninputs. Do not migrate or rewrite them when creating new artifacts.",
);
});
it("keeps the ce-brainstorm skill directory present for recursive content checks", () => {
expect(statSync(ceBrainstormRoot).isDirectory()).toBe(true);
expect(listMarkdownFiles(ceBrainstormRoot).length).toBeGreaterThan(0);
});
});

View File

@@ -125,4 +125,4 @@ Use OS temp by default because visual probes are disposable scratch:
display-info.json
```
Use `.context/compound-engineering/ce-brainstorm-visual/<run-id>/` only when the user explicitly wants to inspect, preserve, or curate the sketches after the session. The final requirements doc in `docs/brainstorms/` is the durable artifact.
Use `.context/compound-engineering/ce-brainstorm-visual/<run-id>/` only when the user explicitly wants to inspect, preserve, or curate the sketches after the session. The requirements-only unified plan in `docs/plans/` is the durable artifact.