@warpgogol/forge 0.22.0 → 0.24.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/AGENTS.md +33 -3
- package/dist/bin/cli.js +1 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/os/adr/handlers/validate.d.ts.map +1 -1
- package/dist/os/adr/handlers/validate.js +11 -1
- package/dist/os/adr/handlers/validate.js.map +1 -1
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +66 -0
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/core/handlers/release-publish.js +4 -4
- package/dist/os/core/handlers/release-publish.js.map +1 -1
- package/dist/os/exploration/exploration.module.d.ts +3 -0
- package/dist/os/exploration/exploration.module.d.ts.map +1 -0
- package/dist/os/exploration/exploration.module.js +82 -0
- package/dist/os/exploration/exploration.module.js.map +1 -0
- package/dist/os/exploration/frontmatter-io.d.ts +13 -0
- package/dist/os/exploration/frontmatter-io.d.ts.map +1 -0
- package/dist/os/exploration/frontmatter-io.js +63 -0
- package/dist/os/exploration/frontmatter-io.js.map +1 -0
- package/dist/os/exploration/handlers/archive.d.ts +4 -0
- package/dist/os/exploration/handlers/archive.d.ts.map +1 -0
- package/dist/os/exploration/handlers/archive.js +135 -0
- package/dist/os/exploration/handlers/archive.js.map +1 -0
- package/dist/os/exploration/handlers/list.d.ts +4 -0
- package/dist/os/exploration/handlers/list.d.ts.map +1 -0
- package/dist/os/exploration/handlers/list.js +56 -0
- package/dist/os/exploration/handlers/list.js.map +1 -0
- package/dist/os/exploration/handlers/show.d.ts +4 -0
- package/dist/os/exploration/handlers/show.d.ts.map +1 -0
- package/dist/os/exploration/handlers/show.js +91 -0
- package/dist/os/exploration/handlers/show.js.map +1 -0
- package/dist/os/exploration/index.d.ts +7 -0
- package/dist/os/exploration/index.d.ts.map +1 -0
- package/dist/os/exploration/index.js +17 -0
- package/dist/os/exploration/index.js.map +1 -0
- package/dist/os/exploration/types.d.ts +38 -0
- package/dist/os/exploration/types.d.ts.map +1 -0
- package/dist/os/exploration/types.js +23 -0
- package/dist/os/exploration/types.js.map +1 -0
- package/dist/os/rfc/handlers/validate-rules.d.ts +5 -4
- package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
- package/dist/os/rfc/handlers/validate-rules.js +52 -7
- package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
- package/dist/os/rfc/handlers/validate.d.ts.map +1 -1
- package/dist/os/rfc/handlers/validate.js +5 -2
- package/dist/os/rfc/handlers/validate.js.map +1 -1
- package/dist/os/rfc/index.d.ts +2 -2
- package/dist/os/rfc/index.d.ts.map +1 -1
- package/dist/os/rfc/index.js +1 -1
- package/dist/os/rfc/index.js.map +1 -1
- package/dist/os/rfc/types.d.ts +13 -0
- package/dist/os/rfc/types.d.ts.map +1 -1
- package/dist/os/rfc/types.js +1 -0
- package/dist/os/rfc/types.js.map +1 -1
- package/dist/os/spec/live-spec-list.d.ts +4 -0
- package/dist/os/spec/live-spec-list.d.ts.map +1 -0
- package/dist/os/spec/live-spec-list.js +64 -0
- package/dist/os/spec/live-spec-list.js.map +1 -0
- package/dist/os/spec/live-spec-merge.d.ts +4 -0
- package/dist/os/spec/live-spec-merge.d.ts.map +1 -0
- package/dist/os/spec/live-spec-merge.js +345 -0
- package/dist/os/spec/live-spec-merge.js.map +1 -0
- package/dist/os/spec/live-spec-show.d.ts +4 -0
- package/dist/os/spec/live-spec-show.d.ts.map +1 -0
- package/dist/os/spec/live-spec-show.js +99 -0
- package/dist/os/spec/live-spec-show.js.map +1 -0
- package/dist/os/spec/live-spec-types.d.ts +71 -0
- package/dist/os/spec/live-spec-types.d.ts.map +1 -0
- package/dist/os/spec/live-spec-types.js +14 -0
- package/dist/os/spec/live-spec-types.js.map +1 -0
- package/dist/os/spec/live-spec-validate.d.ts +4 -0
- package/dist/os/spec/live-spec-validate.d.ts.map +1 -0
- package/dist/os/spec/live-spec-validate.js +140 -0
- package/dist/os/spec/live-spec-validate.js.map +1 -0
- package/dist/os/spec/spec.module.d.ts.map +1 -1
- package/dist/os/spec/spec.module.js +54 -2
- package/dist/os/spec/spec.module.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/os/rfc/rfc-0000-template.md +5 -0
- package/package.json +9 -1
- package/skills/_shared/fo-pipeline-conventions.md +24 -0
- package/skills/_shared/fo-session-summary.md +6 -0
- package/skills/fo/fo-design-summit/SKILL.md +240 -0
- package/skills/fo/fo-explore/SKILL.md +145 -0
- package/skills/fo/fo-idea/SKILL.md +44 -20
- package/skills/fo/fo-idea-audit/SKILL.md +1 -0
- package/skills/fo/fo-idea-create-rfc/SKILL.md +3 -0
- package/skills/fo/fo-idea-enhance/SKILL.md +3 -2
- package/skills/fo/fo-idea-implement/SKILL.md +9 -4
- package/skills/fo/fo-idea-plan/SKILL.md +10 -0
- package/skills/fo/fo-review/SKILL.md +5 -0
- package/skills/fo/fo-session-retro/SKILL.md +15 -8
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>spec.live.validate handler — validates all living specs in docs/specs/live/
|
|
4
|
+
with rules V-LS-01..05 (RFC-0711).</purpose>
|
|
5
|
+
<non-goals>
|
|
6
|
+
<item>Do not merge or list — use spec.live.merge / spec.live.list.</item>
|
|
7
|
+
</non-goals>
|
|
8
|
+
</MODULE_CONTRACT>
|
|
9
|
+
<CHANGE_SUMMARY>
|
|
10
|
+
<item>RFC-0711: initial spec.live.validate handler with V-LS-01..05 rules.</item>
|
|
11
|
+
</CHANGE_SUMMARY>
|
|
12
|
+
*/
|
|
13
|
+
import fs from "node:fs/promises";
|
|
14
|
+
import { existsSync } from "node:fs";
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
import YAML from "yaml";
|
|
17
|
+
import { listRfcFiles, readAndParseRfc } from "../rfc/frontmatter-io.js";
|
|
18
|
+
import { RFC_DIR } from "../rfc/types.js";
|
|
19
|
+
const LIVE_SPECS_DIR = "docs/specs/live";
|
|
20
|
+
const REQUIRED_FM_FIELDS = ["domain", "title", "lastMergedRfc", "updatedAt", "createdAt", "history"];
|
|
21
|
+
export async function runSpecLiveValidate(_input, context) {
|
|
22
|
+
const { workspaceRoot, logger, outputFormat } = context;
|
|
23
|
+
const liveSpecsDir = path.join(workspaceRoot, LIVE_SPECS_DIR);
|
|
24
|
+
const rfcDir = path.join(workspaceRoot, RFC_DIR);
|
|
25
|
+
const violations = [];
|
|
26
|
+
let specsChecked = 0;
|
|
27
|
+
const domains = new Set();
|
|
28
|
+
const archivedRfcIds = new Set();
|
|
29
|
+
const rfcFiles = await listRfcFiles(rfcDir);
|
|
30
|
+
for (const file of rfcFiles) {
|
|
31
|
+
const parsed = await readAndParseRfc(rfcDir, file);
|
|
32
|
+
if (parsed) {
|
|
33
|
+
const id = String(parsed.parsed.frontmatter["id"] ?? "").trim();
|
|
34
|
+
const status = String(parsed.parsed.frontmatter["status"] ?? "").trim();
|
|
35
|
+
if (id && (status === "implemented" || status === "rejected" || status === "superseded")) {
|
|
36
|
+
archivedRfcIds.add(id);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (!existsSync(liveSpecsDir)) {
|
|
41
|
+
const result = {
|
|
42
|
+
command: "spec.live.validate",
|
|
43
|
+
status: "pass",
|
|
44
|
+
violations: [],
|
|
45
|
+
specsChecked: 0,
|
|
46
|
+
};
|
|
47
|
+
if (outputFormat === "pretty") {
|
|
48
|
+
logger.info("spec.live.validate: no living specs directory — pass (empty)");
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
data: result,
|
|
52
|
+
exitCode: 0,
|
|
53
|
+
summary: "spec.live.validate: 0 living specs — pass",
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const files = await fs.readdir(liveSpecsDir);
|
|
57
|
+
const specFiles = files.filter((f) => f.endsWith(".md") && f !== "README.md");
|
|
58
|
+
for (const file of specFiles) {
|
|
59
|
+
specsChecked++;
|
|
60
|
+
const filePath = path.join(liveSpecsDir, file);
|
|
61
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
62
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
63
|
+
if (!match) {
|
|
64
|
+
violations.push({ rule: "V-LS-01", message: `${file}: no valid frontmatter block`, domain: file });
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const fm = (YAML.parse(match[1]) ?? {});
|
|
68
|
+
const domain = String(fm["domain"] ?? "");
|
|
69
|
+
for (const field of REQUIRED_FM_FIELDS) {
|
|
70
|
+
if (!(field in fm) || fm[field] === undefined || fm[field] === null) {
|
|
71
|
+
violations.push({
|
|
72
|
+
rule: "V-LS-01",
|
|
73
|
+
message: `${file}: missing required field "${field}"`,
|
|
74
|
+
domain,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (domain && file !== `${domain}.md`) {
|
|
79
|
+
violations.push({
|
|
80
|
+
rule: "V-LS-02",
|
|
81
|
+
message: `${file}: domain "${domain}" does not match filename`,
|
|
82
|
+
domain,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const lastMergedRfc = String(fm["lastMergedRfc"] ?? "");
|
|
86
|
+
if (lastMergedRfc && !archivedRfcIds.has(lastMergedRfc)) {
|
|
87
|
+
violations.push({
|
|
88
|
+
rule: "V-LS-03",
|
|
89
|
+
message: `${file}: lastMergedRfc "${lastMergedRfc}" is not an archived RFC`,
|
|
90
|
+
domain,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const history = Array.isArray(fm["history"]) ? fm["history"] : [];
|
|
94
|
+
for (const entry of history) {
|
|
95
|
+
if (entry.rfc && !archivedRfcIds.has(entry.rfc)) {
|
|
96
|
+
violations.push({
|
|
97
|
+
rule: "V-LS-04",
|
|
98
|
+
message: `${file}: history entry "${entry.rfc}" is not an archived RFC`,
|
|
99
|
+
domain,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (domain) {
|
|
104
|
+
if (domains.has(domain)) {
|
|
105
|
+
violations.push({
|
|
106
|
+
rule: "V-LS-05",
|
|
107
|
+
message: `duplicate domain "${domain}" found in multiple files`,
|
|
108
|
+
domain,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
domains.add(domain);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const hasFailures = violations.length > 0;
|
|
115
|
+
const result = {
|
|
116
|
+
command: "spec.live.validate",
|
|
117
|
+
status: hasFailures ? "fail" : "pass",
|
|
118
|
+
violations,
|
|
119
|
+
specsChecked,
|
|
120
|
+
};
|
|
121
|
+
if (outputFormat === "pretty") {
|
|
122
|
+
if (hasFailures) {
|
|
123
|
+
logger.error(`spec.live.validate: ${violations.length} violation(s) across ${specsChecked} spec(s)`);
|
|
124
|
+
for (const v of violations) {
|
|
125
|
+
logger.error(` ${v.rule}: ${v.message}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger.success(`spec.live.validate: all ${specsChecked} living spec(s) pass`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
data: result,
|
|
134
|
+
exitCode: hasFailures ? 1 : 0,
|
|
135
|
+
summary: hasFailures
|
|
136
|
+
? `spec.live.validate: ${violations.length} violation(s)`
|
|
137
|
+
: `spec.live.validate: ${specsChecked} spec(s) — pass`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=live-spec-validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-spec-validate.js","sourceRoot":"","sources":["../../../os/spec/live-spec-validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec.module.d.ts","sourceRoot":"","sources":["../../../os/spec/spec.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spec.module.d.ts","sourceRoot":"","sources":["../../../os/spec/spec.module.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,eAAO,MAAM,eAAe,EAAE,WAsH7B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
<MODULE_CONTRACT>
|
|
3
|
-
<purpose>Register the forge spec module — spec.validate (RFC-0394), spec.status + spec.materialize (RFC-0396).</purpose>
|
|
3
|
+
<purpose>Register the forge spec module — spec.validate (RFC-0394), spec.status + spec.materialize (RFC-0396), spec.live.merge/list/show/validate (RFC-0711).</purpose>
|
|
4
4
|
<non-goals>
|
|
5
5
|
<item>Do not implement skill logic — skills live in skills/.</item>
|
|
6
6
|
</non-goals>
|
|
@@ -8,15 +8,20 @@
|
|
|
8
8
|
<CHANGE_SUMMARY>
|
|
9
9
|
<item>RFC-0394: initial forgeSpecModule registering spec.validate.</item>
|
|
10
10
|
<item>RFC-0396: added spec.status and spec.materialize commands.</item>
|
|
11
|
+
<item>RFC-0711: added spec.live.merge, spec.live.list, spec.live.show, spec.live.validate commands.</item>
|
|
11
12
|
</CHANGE_SUMMARY>
|
|
12
13
|
*/
|
|
13
14
|
export const forgeSpecModule = {
|
|
14
15
|
name: "forge-spec",
|
|
15
|
-
version: "0.
|
|
16
|
+
version: "0.2.0",
|
|
16
17
|
async register(registry) {
|
|
17
18
|
const { runSpecValidate } = await import("./spec-validate.js");
|
|
18
19
|
const { runSpecStatus } = await import("./spec-status.js");
|
|
19
20
|
const { runSpecMaterialize } = await import("./spec-materialize.js");
|
|
21
|
+
const { runSpecLiveMerge } = await import("./live-spec-merge.js");
|
|
22
|
+
const { runSpecLiveList } = await import("./live-spec-list.js");
|
|
23
|
+
const { runSpecLiveShow } = await import("./live-spec-show.js");
|
|
24
|
+
const { runSpecLiveValidate } = await import("./live-spec-validate.js");
|
|
20
25
|
registry.registerCommand({
|
|
21
26
|
name: "spec.validate",
|
|
22
27
|
description: "Validate vendored spec packages under docs/specs/. " +
|
|
@@ -62,6 +67,53 @@ export const forgeSpecModule = {
|
|
|
62
67
|
},
|
|
63
68
|
execute: runSpecMaterialize,
|
|
64
69
|
});
|
|
70
|
+
registry.registerCommand({
|
|
71
|
+
name: "spec.live.merge",
|
|
72
|
+
description: "Merge deltas from an implemented RFC's ## Design section into a living feature spec " +
|
|
73
|
+
"under docs/specs/live/<domain>.md. Requires --id=<RFC-XXXX>. " +
|
|
74
|
+
"Domain is auto-derived from packagesImpacted[0] when liveSpec: true, or uses " +
|
|
75
|
+
"the string value when liveSpec: <domain>. " +
|
|
76
|
+
"All-or-nothing: aborts on any heading conflict without writing. " +
|
|
77
|
+
"Use --dry-run to preview deltas without writing.",
|
|
78
|
+
scope: "workspace",
|
|
79
|
+
mutatesState: true,
|
|
80
|
+
writes: ["docs/specs/live/*.md"],
|
|
81
|
+
reads: ["docs/rfcs/**/*.md", "docs/specs/live/*.md"],
|
|
82
|
+
flags: {
|
|
83
|
+
id: { kind: "string", required: true, description: "RFC id to merge (e.g. RFC-0711)." },
|
|
84
|
+
"dry-run": { kind: "boolean", description: "Preview deltas without writing files." },
|
|
85
|
+
},
|
|
86
|
+
execute: runSpecLiveMerge,
|
|
87
|
+
});
|
|
88
|
+
registry.registerCommand({
|
|
89
|
+
name: "spec.live.list",
|
|
90
|
+
description: "List all living feature specs in docs/specs/live/. " +
|
|
91
|
+
"Returns domain, title, lastMergedRfc, updatedAt, and historyCount for each spec.",
|
|
92
|
+
scope: "workspace",
|
|
93
|
+
reads: ["docs/specs/live/*.md"],
|
|
94
|
+
execute: runSpecLiveList,
|
|
95
|
+
});
|
|
96
|
+
registry.registerCommand({
|
|
97
|
+
name: "spec.live.show",
|
|
98
|
+
description: "Show a single living feature spec by domain. " +
|
|
99
|
+
"Requires --domain=<name>. Returns full frontmatter and body content.",
|
|
100
|
+
scope: "workspace",
|
|
101
|
+
reads: ["docs/specs/live/*.md"],
|
|
102
|
+
flags: {
|
|
103
|
+
domain: { kind: "string", required: true, description: "Domain name (filename without .md)." },
|
|
104
|
+
},
|
|
105
|
+
execute: runSpecLiveShow,
|
|
106
|
+
});
|
|
107
|
+
registry.registerCommand({
|
|
108
|
+
name: "spec.live.validate",
|
|
109
|
+
description: "Validate all living feature specs in docs/specs/live/. " +
|
|
110
|
+
"Checks V-LS-01 (frontmatter), V-LS-02 (domain/filename match), " +
|
|
111
|
+
"V-LS-03 (lastMergedRfc is archived), V-LS-04 (history entries are archived), " +
|
|
112
|
+
"V-LS-05 (no duplicate domains).",
|
|
113
|
+
scope: "workspace",
|
|
114
|
+
reads: ["docs/specs/live/*.md", "docs/rfcs/**/*.md"],
|
|
115
|
+
execute: runSpecLiveValidate,
|
|
116
|
+
});
|
|
65
117
|
},
|
|
66
118
|
};
|
|
67
119
|
//# sourceMappingURL=spec.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec.module.js","sourceRoot":"","sources":["../../../os/spec/spec.module.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"spec.module.js","sourceRoot":"","sources":["../../../os/spec/spec.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;EAYE;AAIF,MAAM,CAAC,MAAM,eAAe,GAAgB;IAC1C,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;IAChB,KAAK,CAAC,QAAQ,CAAC,QAAQ;QACrB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC/D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACrE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAClE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAChE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAChE,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAExE,QAAQ,CAAC,eAAe,CAAC;YACvB,IAAI,EAAE,eAAe;YACrB,WAAW,EACT,qDAAqD;gBACrD,kEAAkE;gBAClE,gFAAgF;gBAChF,4CAA4C;YAC9C,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE;gBACL,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;aACF;YACD,KAAK,EAAE,CAAC,iBAAiB,CAAC;YAC1B,OAAO,EAAE,eAAe;SACzB,CAAC,CAAC;QAEH,QAAQ,CAAC,eAAe,CAAC;YACvB,IAAI,EAAE,aAAa;YACnB,WAAW,EACT,4CAA4C;gBAC5C,sFAAsF;YACxF,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE;gBACL,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;aACF;YACD,KAAK,EAAE,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;YAC/C,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;QAEH,QAAQ,CAAC,eAAe,CAAC;YACvB,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACT,mEAAmE;gBACnE,qGAAqG;YACvG,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,CAAC,oBAAoB,EAAE,8BAA8B,CAAC;YAC9D,KAAK,EAAE,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;YAC/C,KAAK,EAAE;gBACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8BAA8B,EAAE;gBACrF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;gBAClG,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE;aAC5F;YACD,OAAO,EAAE,kBAAkB;SAC5B,CAAC,CAAC;QAEH,QAAQ,CAAC,eAAe,CAAC;YACvB,IAAI,EAAE,iBAAiB;YACvB,WAAW,EACT,sFAAsF;gBACtF,+DAA+D;gBAC/D,+EAA+E;gBAC/E,4CAA4C;gBAC5C,kEAAkE;gBAClE,kDAAkD;YACpD,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,CAAC,sBAAsB,CAAC;YAChC,KAAK,EAAE,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;YACpD,KAAK,EAAE;gBACL,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kCAAkC,EAAE;gBACvF,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uCAAuC,EAAE;aACrF;YACD,OAAO,EAAE,gBAAgB;SAC1B,CAAC,CAAC;QAEH,QAAQ,CAAC,eAAe,CAAC;YACvB,IAAI,EAAE,gBAAgB;YACtB,WAAW,EACT,qDAAqD;gBACrD,kFAAkF;YACpF,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,CAAC,sBAAsB,CAAC;YAC/B,OAAO,EAAE,eAAe;SACzB,CAAC,CAAC;QAEH,QAAQ,CAAC,eAAe,CAAC;YACvB,IAAI,EAAE,gBAAgB;YACtB,WAAW,EACT,+CAA+C;gBAC/C,sEAAsE;YACxE,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,CAAC,sBAAsB,CAAC;YAC/B,KAAK,EAAE;gBACL,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qCAAqC,EAAE;aAC/F;YACD,OAAO,EAAE,eAAe;SACzB,CAAC,CAAC;QAEH,QAAQ,CAAC,eAAe,CAAC;YACvB,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EACT,yDAAyD;gBACzD,iEAAiE;gBACjE,+EAA+E;gBAC/E,iCAAiC;YACnC,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,CAAC,sBAAsB,EAAE,mBAAmB,CAAC;YACpD,OAAO,EAAE,mBAAmB;SAC7B,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -29,4 +29,5 @@ export { forgeAdrModule } from "../os/adr/adr.module.ts";
|
|
|
29
29
|
export { forgePlanModule } from "../os/plan/plan.module.ts";
|
|
30
30
|
export { forgeAuditModule } from "../os/audit/audit.module.ts";
|
|
31
31
|
export { forgeMissionModule } from "../os/mission/mission.module.ts";
|
|
32
|
+
export { forgeExplorationModule } from "../os/exploration/exploration.module.ts";
|
|
32
33
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -49,4 +49,5 @@ export { forgeAdrModule } from "../os/adr/adr.module.js";
|
|
|
49
49
|
export { forgePlanModule } from "../os/plan/plan.module.js";
|
|
50
50
|
export { forgeAuditModule } from "../os/audit/audit.module.js";
|
|
51
51
|
export { forgeMissionModule } from "../os/mission/mission.module.js";
|
|
52
|
+
export { forgeExplorationModule } from "../os/exploration/exploration.module.js";
|
|
52
53
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AA6BF,sBAAsB;AACtB,OAAO,EACL,eAAe,EAEf,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,8BAA8B,EAG9B,WAAW,EACX,YAAY,EACZ,UAAU,EAEV,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAK1B,eAAe;AACf,OAAO,EAAE,sBAAsB,EAAyB,MAAM,mBAAmB,CAAC;AAElF,iBAAiB;AACjB,OAAO,EAAE,YAAY,EAAwB,MAAM,eAAe,CAAC;AAEnE,0BAA0B;AAC1B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,qBAAqB,GAMtB,MAAM,0BAA0B,CAAC;AAElC,sCAAsC;AACtC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,GAGZ,MAAM,6BAA6B,CAAC;AAErC,mCAAmC;AACnC,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,GAKrB,MAAM,8BAA8B,CAAC;AAEtC,8BAA8B;AAC9B,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,GAQzB,MAAM,sBAAsB,CAAC;AAE9B,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEzF,aAAa;AACb,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAStE,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AAEvC,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AA6BF,sBAAsB;AACtB,OAAO,EACL,eAAe,EAEf,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,8BAA8B,EAG9B,WAAW,EACX,YAAY,EACZ,UAAU,EAEV,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAK1B,eAAe;AACf,OAAO,EAAE,sBAAsB,EAAyB,MAAM,mBAAmB,CAAC;AAElF,iBAAiB;AACjB,OAAO,EAAE,YAAY,EAAwB,MAAM,eAAe,CAAC;AAEnE,0BAA0B;AAC1B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,qBAAqB,GAMtB,MAAM,0BAA0B,CAAC;AAElC,sCAAsC;AACtC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,GAGZ,MAAM,6BAA6B,CAAC;AAErC,mCAAmC;AACnC,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,GAKrB,MAAM,8BAA8B,CAAC;AAEtC,8BAA8B;AAC9B,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,GAQzB,MAAM,sBAAsB,CAAC;AAE9B,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEzF,aAAa;AACb,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAStE,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AAEvC,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC"}
|
|
@@ -40,6 +40,11 @@ satisfies: []
|
|
|
40
40
|
# Values: minor (Breaks-B, requires migrator), patch (safe), none (prose-only),
|
|
41
41
|
# major (architectural, manually reserved). Default: patch.
|
|
42
42
|
versionBump: patch
|
|
43
|
+
# RFC-0711: Declares that this RFC contributes to a living feature spec
|
|
44
|
+
# under docs/specs/live/<domain>.md. When true, domain is auto-derived from
|
|
45
|
+
# packagesImpacted[0]. When a string, used as explicit domain override.
|
|
46
|
+
# Absent or false means no living spec merge occurs.
|
|
47
|
+
# liveSpec: true
|
|
43
48
|
commands:
|
|
44
49
|
proposed: []
|
|
45
50
|
added: []
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@warpgogol/forge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -116,6 +116,14 @@
|
|
|
116
116
|
"./os/mission-module": {
|
|
117
117
|
"types": "./dist/os/mission/mission.module.d.ts",
|
|
118
118
|
"default": "./dist/os/mission/mission.module.js"
|
|
119
|
+
},
|
|
120
|
+
"./os/exploration": {
|
|
121
|
+
"types": "./dist/os/exploration/index.d.ts",
|
|
122
|
+
"default": "./dist/os/exploration/index.js"
|
|
123
|
+
},
|
|
124
|
+
"./os/exploration-module": {
|
|
125
|
+
"types": "./dist/os/exploration/exploration.module.d.ts",
|
|
126
|
+
"default": "./dist/os/exploration/exploration.module.js"
|
|
119
127
|
}
|
|
120
128
|
},
|
|
121
129
|
"files": [
|
|
@@ -27,6 +27,22 @@ Stage only the files this skill produces or modifies. Another agent may be worki
|
|
|
27
27
|
- **RFC pipeline**: create → audit → enhance → plan → implement (includes review → fix)
|
|
28
28
|
- **ADR pipeline**: create → implement (includes review → fix)
|
|
29
29
|
|
|
30
|
+
## Minimality ladder
|
|
31
|
+
|
|
32
|
+
Before writing implementation code, climb the minimality ladder. Stop at the first rung that holds — that is your implementation. The ladder runs after you understand the problem (read the code, trace the flow), not instead of it.
|
|
33
|
+
|
|
34
|
+
1. **Does this need to exist?** → no: skip it (YAGNI)
|
|
35
|
+
2. **Already in this codebase?** → reuse it, don't rewrite
|
|
36
|
+
3. **Stdlib does it?** → use it
|
|
37
|
+
4. **Native platform feature?** → use it (e.g. `<input type="date">` instead of a date picker library)
|
|
38
|
+
5. **Installed dependency?** → use it
|
|
39
|
+
6. **One line?** → one line
|
|
40
|
+
7. **Only then**: write the minimum that works
|
|
41
|
+
|
|
42
|
+
Lazy about the solution, never about reading. Lazy, not negligent: trust-boundary validation, data-loss handling, security, and accessibility are never on the chopping block — they are part of "the minimum that works."
|
|
43
|
+
|
|
44
|
+
The ladder is a pre-coding decision tool, not a post-hoc review checklist. It determines the implementation approach before the first edit. During `fo-review`, the reviewer checks whether the author climbed the ladder — flagging cases where a library was installed for something stdlib/native/existing-dep already provides.
|
|
45
|
+
|
|
30
46
|
## Forward-only discipline
|
|
31
47
|
|
|
32
48
|
The ecosystem is forward-only. No backward compatibility layers, no shims, no dual-paths. Legacy code paths are deleted, not maintained behind a flag. Deprecation means removal in the same change, not an indefinite grace period.
|
|
@@ -118,6 +134,14 @@ After completing implementation work, the operator may run a three-step session-
|
|
|
118
134
|
|
|
119
135
|
Most sessions need only `fo-doc-audit`. `fo-session-retro` is valuable after debugging sessions, exploratory work, or when non-obvious behaviors were discovered. `fo-handoff` is needed when work is incomplete and another agent will continue.
|
|
120
136
|
|
|
137
|
+
### Session-end trigger phrases (BLOCKED GATE — NON-NEGOTIABLE)
|
|
138
|
+
|
|
139
|
+
When the operator says any session-end trigger phrase (e.g. "Завершаем сессию", "Завершаем эту сессию", "Заканчиваем сессию", "Завершить сессию", "End session", "Wrap up", "Session end", "/session-end"), the agent's response is **BLOCKED** — no closing summary, no ad-hoc "session complete" message, no closing block is permitted until `fo-session-retro` is invoked via the `skill` tool and completes.
|
|
140
|
+
|
|
141
|
+
**The agent MUST NOT produce any session-end output (summary, closing block, "session complete" message) before `fo-session-retro` is invoked and its report is presented. Producing a closing summary without running `fo-session-retro` is a CONTRACT VIOLATION.**
|
|
142
|
+
|
|
143
|
+
The `fo-session-retro` skill IS the session-end protocol — it runs transcript save, temp cleanup, docs.archive, clean tree check, RFC verification, insight triage, and produces the closing block. Do not substitute it with a manual summary. The closing block comes from `fo-session-retro`, not from the agent directly.
|
|
144
|
+
|
|
121
145
|
## Context checkpoint between batch items
|
|
122
146
|
|
|
123
147
|
When the orchestrator skill processes multiple documents (>=2), perform a context checkpoint after completing one document and before starting the next:
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
Reference file for all `fo-*` skills. Every `fo-*` skill MUST end its session by presenting the closing block defined here. This is not optional — it is the mandatory final output before the skill stops.
|
|
4
4
|
|
|
5
|
+
## Session-end protocol (BLOCKED GATE — NON-NEGOTIABLE)
|
|
6
|
+
|
|
7
|
+
When the operator says any session-end trigger phrase (e.g. "Завершаем сессию", "End session", "Wrap up", "/session-end"), the agent MUST invoke `fo-session-retro` via the `skill` tool BEFORE producing any closing block or session-end output. The closing block defined below is produced by `fo-session-retro` as part of its report — the agent MUST NOT produce a closing block directly in response to a session-end trigger phrase. See `_shared/fo-pipeline-conventions.md` §Session-end trigger phrases for the full protocol.
|
|
8
|
+
|
|
9
|
+
**Producing a closing block without first invoking `fo-session-retro` is a CONTRACT VIOLATION.**
|
|
10
|
+
|
|
5
11
|
## When to emit
|
|
6
12
|
|
|
7
13
|
The closing block is emitted **once**, at the very end of the skill's execution — after all work is done, after all commits, after any batch summaries. It is the last thing the operator sees.
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fo-design-summit
|
|
3
|
+
description: Simulate a multi-persona design discussion for complex RFCs. Each persona reviews from its professional perspective and raises concerns. Optional, invoked for high-risk architectural RFCs.
|
|
4
|
+
invocation: user
|
|
5
|
+
category: fo
|
|
6
|
+
concerns: document-only
|
|
7
|
+
dependsOn: ['my-preferences', 'fo-idea-audit']
|
|
8
|
+
languagePolicy: ref(PREFERENCES.md)
|
|
9
|
+
bindings:
|
|
10
|
+
requires: [paths.invariantsFile]
|
|
11
|
+
optional: []
|
|
12
|
+
triggers: ["design summit", "multi-persona review", "party mode"]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Design Summit
|
|
16
|
+
|
|
17
|
+
Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
|
|
18
|
+
|
|
19
|
+
See `_shared/fo-pipeline-conventions.md` §Language policy.
|
|
20
|
+
|
|
21
|
+
A multi-persona design review for complex RFCs. The summit simulates five professional perspectives — Architect, Security Engineer, QA Engineer, Product Manager, and Developer Advocate — to surface issues that a single-perspective review misses. Each persona reviews the RFC from its professional lens and raises concerns. The operator sees all perspectives and makes the final decision.
|
|
22
|
+
|
|
23
|
+
The summit is **optional** — invoked manually by the operator or suggested by `fo-idea-plan` for RFCs that meet complexity criteria. It is not part of the default pipeline.
|
|
24
|
+
|
|
25
|
+
The summit is `concern: document-only` — it writes a summit report to `docs/summits/` and does not modify the RFC or any source code.
|
|
26
|
+
|
|
27
|
+
## Process
|
|
28
|
+
|
|
29
|
+
### 1. Identify the RFC
|
|
30
|
+
|
|
31
|
+
The user may provide:
|
|
32
|
+
|
|
33
|
+
- **A single RFC**: `RFC-XXXX`, a filename, or a path.
|
|
34
|
+
- **Nothing**: if an RFC file is open in the IDE, use it. Otherwise, ask.
|
|
35
|
+
|
|
36
|
+
### 2. Prerequisite checks
|
|
37
|
+
|
|
38
|
+
Before running the summit, perform these checks **in order**:
|
|
39
|
+
|
|
40
|
+
1. **Prefix check** — if the id starts with `ADR-`, stop with message: `ADR-XXXX is an ADR. Design summits are for RFCs only. ADRs use the accepted-decision fast path.`
|
|
41
|
+
2. **RFC file exists** — look for `docs/rfcs/rfc-XXXX-*.md`. If no file is found, stop with message: `RFC-XXXX not found in docs/rfcs/.`
|
|
42
|
+
3. **Terminal status check** — read the RFC's `status` frontmatter. If the status is `implemented`, `rejected`, or `superseded`, stop with message: `RFC-XXXX is <status> (terminal). Terminal RFCs cannot be reviewed in a summit.`
|
|
43
|
+
|
|
44
|
+
If all checks pass, proceed to step 3.
|
|
45
|
+
|
|
46
|
+
### 3. Read the RFC and related context
|
|
47
|
+
|
|
48
|
+
Read the target RFC file and its related context:
|
|
49
|
+
|
|
50
|
+
- `ref(forge.yaml bindings.paths.invariantsFile)` — all DNA invariants referenced in the RFC's `satisfies[]` or `related[]`.
|
|
51
|
+
- Each RFC listed in `amends[]`, `supersedes[]`, `related[]` — read enough to understand what this RFC builds on or changes.
|
|
52
|
+
- The closest `AGENTS.md` for the RFC's scope.
|
|
53
|
+
|
|
54
|
+
### 4. Read the audit report (if available)
|
|
55
|
+
|
|
56
|
+
Look for `docs/audits/audit-rfc-XXXX-*.md`. If an audit report exists, read it to avoid duplicating findings. The summit complements the audit — it does not repeat it.
|
|
57
|
+
|
|
58
|
+
If no audit report exists, proceed without it. Note this in the summit report: persona findings may overlap with future audit findings.
|
|
59
|
+
|
|
60
|
+
### 5. Run each persona
|
|
61
|
+
|
|
62
|
+
For each of the five personas, the agent:
|
|
63
|
+
|
|
64
|
+
1. Adopts the persona's perspective and review focus.
|
|
65
|
+
2. Reads the RFC from that perspective.
|
|
66
|
+
3. Produces a persona report with findings (concerns, questions, recommendations).
|
|
67
|
+
|
|
68
|
+
#### Persona: Architect
|
|
69
|
+
|
|
70
|
+
**Focus:** Structural integrity, DNA alignment, coupling.
|
|
71
|
+
|
|
72
|
+
**Key questions:**
|
|
73
|
+
|
|
74
|
+
- Does this create hidden dependencies between packages or services?
|
|
75
|
+
- Which DNA invariants are affected? Does the RFC explain how it enforces or protects each one?
|
|
76
|
+
- Will this decision be reversible? If not, is the irreversibility justified?
|
|
77
|
+
- Does the RFC propose a new package, command, or lifecycle that could be a flag on an existing one?
|
|
78
|
+
|
|
79
|
+
#### Persona: Security Engineer
|
|
80
|
+
|
|
81
|
+
**Focus:** Attack surface, data exposure, trust boundaries.
|
|
82
|
+
|
|
83
|
+
**Key questions:**
|
|
84
|
+
|
|
85
|
+
- What new trust boundaries does this create?
|
|
86
|
+
- Are there unauthenticated paths to sensitive data?
|
|
87
|
+
- Does this leak sensitive data in logs, error messages, or generated artifacts?
|
|
88
|
+
- If the RFC touches persistence, does it introduce cookies or client-side storage outside the established policy?
|
|
89
|
+
|
|
90
|
+
#### Persona: QA Engineer
|
|
91
|
+
|
|
92
|
+
**Focus:** Testability, failure modes, edge cases.
|
|
93
|
+
|
|
94
|
+
**Key questions:**
|
|
95
|
+
|
|
96
|
+
- How do we test this? What is the test seam — unit, integration, or both?
|
|
97
|
+
- What are the failure modes? What happens under partial failure?
|
|
98
|
+
- Does the RFC consider empty states (new app with no content, package with no manifests)?
|
|
99
|
+
- Are acceptance criteria checkable by an agent or human?
|
|
100
|
+
|
|
101
|
+
#### Persona: Product Manager
|
|
102
|
+
|
|
103
|
+
**Focus:** User impact, rollout risk, scope.
|
|
104
|
+
|
|
105
|
+
**Key questions:**
|
|
106
|
+
|
|
107
|
+
- Does this solve the stated problem? Is the problem statement grounded in a real user need?
|
|
108
|
+
- What is the rollout impact on existing users? Is there a migration path?
|
|
109
|
+
- Is the scope right — too broad, too narrow, or correctly bounded?
|
|
110
|
+
- Are `nonGoals` explicit and meaningful?
|
|
111
|
+
|
|
112
|
+
#### Persona: Developer Advocate
|
|
113
|
+
|
|
114
|
+
**Focus:** Agent clarity, onboarding, documentation.
|
|
115
|
+
|
|
116
|
+
**Key questions:**
|
|
117
|
+
|
|
118
|
+
- Can a new agent understand and implement this RFC without external context?
|
|
119
|
+
- Is the RFC self-contained, or does it reference implicit assumptions?
|
|
120
|
+
- Are there terms or concepts that need a glossary entry?
|
|
121
|
+
- Does the RFC's `Implementation notes for agents` section provide explicit behavioral rules?
|
|
122
|
+
|
|
123
|
+
### 6. Synthesize
|
|
124
|
+
|
|
125
|
+
Present all persona reports in a single summit document, highlighting:
|
|
126
|
+
|
|
127
|
+
- **Consensus findings** — concerns raised by 2+ personas (high priority).
|
|
128
|
+
- **Unique findings** — concerns raised by a single persona (medium priority).
|
|
129
|
+
- **No concerns** — personas that found no issues (confidence signal).
|
|
130
|
+
|
|
131
|
+
Deduplicate overlapping concerns. When two personas raise the same issue from different angles, merge them into a consensus finding.
|
|
132
|
+
|
|
133
|
+
### 7. Persist the summit report
|
|
134
|
+
|
|
135
|
+
Write `docs/summits/summit-<rfc-id>.md` with the full discussion.
|
|
136
|
+
|
|
137
|
+
#### Summit report format
|
|
138
|
+
|
|
139
|
+
```markdown
|
|
140
|
+
---
|
|
141
|
+
rfc: RFC-XXXX
|
|
142
|
+
createdAt: YYYY-MM-DD
|
|
143
|
+
personas: [architect, security, qa, pm, dev-advocate]
|
|
144
|
+
consensusFindings: <count>
|
|
145
|
+
uniqueFindings: <count>
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
# Design Summit: RFC-XXXX
|
|
149
|
+
|
|
150
|
+
## Architect
|
|
151
|
+
|
|
152
|
+
### Findings
|
|
153
|
+
- **A1 (concern):** <finding text>
|
|
154
|
+
- **A2 (question):** <finding text>
|
|
155
|
+
|
|
156
|
+
### No concerns
|
|
157
|
+
- <what the architect found well-designed>
|
|
158
|
+
|
|
159
|
+
## Security Engineer
|
|
160
|
+
|
|
161
|
+
### Findings
|
|
162
|
+
- **S1 (concern):** <finding text>
|
|
163
|
+
|
|
164
|
+
## QA Engineer
|
|
165
|
+
|
|
166
|
+
### Findings
|
|
167
|
+
- **Q1 (concern):** <finding text>
|
|
168
|
+
|
|
169
|
+
## Product Manager
|
|
170
|
+
|
|
171
|
+
### Findings
|
|
172
|
+
- **P1 (concern):** <finding text>
|
|
173
|
+
|
|
174
|
+
## Developer Advocate
|
|
175
|
+
|
|
176
|
+
### Findings
|
|
177
|
+
- **D1 (question):** <finding text>
|
|
178
|
+
|
|
179
|
+
## Consensus findings
|
|
180
|
+
|
|
181
|
+
- **A1 + D1 (2 personas):** <merged finding and recommendation>
|
|
182
|
+
|
|
183
|
+
## Recommendation
|
|
184
|
+
|
|
185
|
+
<proceed to acceptance | revise the RFC | run fo-explore for unresolved questions>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
The report must include the disclaimer: "No findings does not mean no issues — it means no issues were found from these five perspectives."
|
|
189
|
+
|
|
190
|
+
### 8. Suggest actions
|
|
191
|
+
|
|
192
|
+
Recommend whether to:
|
|
193
|
+
|
|
194
|
+
- **Proceed to acceptance** — if no consensus findings and unique findings are minor.
|
|
195
|
+
- **Revise the RFC** — if consensus findings or significant unique findings exist. Route through `fo-idea-enhance` as audit-style findings.
|
|
196
|
+
- **Run `fo-explore`** — if unresolved questions require deeper exploration before revision.
|
|
197
|
+
|
|
198
|
+
### 9. Commit
|
|
199
|
+
|
|
200
|
+
Commit the summit report. This is **mandatory** — the report must be committed, not left in the working tree.
|
|
201
|
+
|
|
202
|
+
Commit message format:
|
|
203
|
+
|
|
204
|
+
```txt
|
|
205
|
+
summit: RFC-XXXX <short description>
|
|
206
|
+
|
|
207
|
+
Multi-persona design summit for RFC-XXXX (<title>). <count> consensus findings, <count> unique findings.
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Stage only the summit report file — do not stage unrelated changes.
|
|
211
|
+
|
|
212
|
+
### 10. Stop
|
|
213
|
+
|
|
214
|
+
Do not modify the RFC or any other file. Do not run `/fo-idea-enhance` or `/fo-idea-plan` — those are separate skills. Present the summit report and stop. If the user asks to fix findings, suggest running `/fo-idea-enhance`.
|
|
215
|
+
|
|
216
|
+
## Invocation criteria
|
|
217
|
+
|
|
218
|
+
`fo-design-summit` is invoked explicitly by the operator or suggested by `fo-idea-plan` when the RFC meets **any** of these criteria:
|
|
219
|
+
|
|
220
|
+
- `kind: architecture` AND `scope: workspace`
|
|
221
|
+
- `satisfies[]` includes 2+ DNA invariants
|
|
222
|
+
- The RFC introduces a new package, new command family, or new lifecycle
|
|
223
|
+
- The RFC supersedes an implemented RFC
|
|
224
|
+
- The operator explicitly requests it
|
|
225
|
+
|
|
226
|
+
## Failure modes
|
|
227
|
+
|
|
228
|
+
- **RFC not found:** The skill errors if the target RFC does not exist.
|
|
229
|
+
- **Audit not run yet:** The skill proceeds without the audit report — persona findings may overlap with future audit findings. The skill notes this in the report.
|
|
230
|
+
- **RFC is too small for a summit:** If the RFC body is less than 500 words, the skill warns that a summit may be overkill and proceeds only if the operator confirms.
|
|
231
|
+
- **Persona findings overlap:** Multiple personas may raise the same concern. The synthesis step deduplicates and marks consensus findings.
|
|
232
|
+
|
|
233
|
+
## Constraints
|
|
234
|
+
|
|
235
|
+
- The summit is `concern: document-only` — it must not modify the RFC, source code, or any file except the summit report in `docs/summits/`.
|
|
236
|
+
- **Commit only your own files.** Stage only the summit report. Do not stage unrelated changes. `git add -A` or `git add .` is forbidden.
|
|
237
|
+
- Personas are **simulated** by a single agent in one session. This is not multi-agent infrastructure. Each persona is a perspective shift, not a separate process.
|
|
238
|
+
- The summit report is an informational artifact, not a governance document. It does not block RFC acceptance — the operator decides whether to act on its findings.
|
|
239
|
+
- Summit findings that warrant RFC changes should be routed through `fo-idea-enhance` as audit-style findings, not applied directly by the summit skill.
|
|
240
|
+
- **No pauses for recoverable tool errors.** If a tool call fails with a recoverable error, recover autonomously: split content into smaller writes, use `edit`/`multi_edit`, and retry immediately.
|