@warpgogol/forge 0.28.0 → 1.0.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.
Files changed (64) hide show
  1. package/AGENTS.md +16 -0
  2. package/README.md +4 -4
  3. package/README.uk.md +4 -4
  4. package/dist/os/core/core.module.d.ts.map +1 -1
  5. package/dist/os/core/core.module.js +34 -0
  6. package/dist/os/core/core.module.js.map +1 -1
  7. package/dist/os/program/discovery.d.ts +61 -0
  8. package/dist/os/program/discovery.d.ts.map +1 -0
  9. package/dist/os/program/discovery.js +236 -0
  10. package/dist/os/program/discovery.js.map +1 -0
  11. package/dist/os/program/handlers/complete.d.ts +12 -0
  12. package/dist/os/program/handlers/complete.d.ts.map +1 -0
  13. package/dist/os/program/handlers/complete.js +344 -0
  14. package/dist/os/program/handlers/complete.js.map +1 -0
  15. package/dist/os/program/handlers/lease.d.ts +13 -0
  16. package/dist/os/program/handlers/lease.d.ts.map +1 -0
  17. package/dist/os/program/handlers/lease.js +322 -0
  18. package/dist/os/program/handlers/lease.js.map +1 -0
  19. package/dist/os/program/handlers/seal.d.ts +12 -0
  20. package/dist/os/program/handlers/seal.d.ts.map +1 -0
  21. package/dist/os/program/handlers/seal.js +265 -0
  22. package/dist/os/program/handlers/seal.js.map +1 -0
  23. package/dist/os/program/handlers/validate.d.ts +14 -0
  24. package/dist/os/program/handlers/validate.d.ts.map +1 -0
  25. package/dist/os/program/handlers/validate.js +164 -0
  26. package/dist/os/program/handlers/validate.js.map +1 -0
  27. package/dist/os/program/lease.d.ts +39 -0
  28. package/dist/os/program/lease.d.ts.map +1 -0
  29. package/dist/os/program/lease.js +129 -0
  30. package/dist/os/program/lease.js.map +1 -0
  31. package/dist/os/program/program.module.d.ts +3 -0
  32. package/dist/os/program/program.module.d.ts.map +1 -0
  33. package/dist/os/program/program.module.js +201 -0
  34. package/dist/os/program/program.module.js.map +1 -0
  35. package/dist/os/program/schemas.d.ts +225 -0
  36. package/dist/os/program/schemas.d.ts.map +1 -0
  37. package/dist/os/program/schemas.js +174 -0
  38. package/dist/os/program/schemas.js.map +1 -0
  39. package/dist/os/program/state.d.ts +38 -0
  40. package/dist/os/program/state.d.ts.map +1 -0
  41. package/dist/os/program/state.js +189 -0
  42. package/dist/os/program/state.js.map +1 -0
  43. package/dist/os/rfc/handlers/archive.d.ts +1 -0
  44. package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
  45. package/dist/os/rfc/handlers/archive.js +54 -0
  46. package/dist/os/rfc/handlers/archive.js.map +1 -1
  47. package/dist/src/index.d.ts +1 -0
  48. package/dist/src/index.d.ts.map +1 -1
  49. package/dist/src/index.js +1 -0
  50. package/dist/src/index.js.map +1 -1
  51. package/package.json +15 -15
  52. package/profiles/astro-typescript-turborepo.yaml +1 -1
  53. package/profiles/editframe.yaml +2 -2
  54. package/profiles/forge-shell.yaml +1 -1
  55. package/profiles/godot-csharp.yaml +388 -0
  56. package/profiles/phaser-turborepo.yaml +1 -1
  57. package/skills/fo/ef-onboard/SKILL.md +1 -1
  58. package/skills/fo/fo-idea/SKILL.md +2 -2
  59. package/skills/fo/fo-idea-implement/SKILL.md +1 -1
  60. package/skills/fo/fo-step-commit/SKILL.md +7 -5
  61. package/skills/shared/grilling/learned-principles.archive.md +212 -0
  62. package/skills/shared/grilling/learned-principles.md +0 -13
  63. package/skills/shared/grilling/qa-log.md +624 -0
  64. package/skills/shared/knowledge/learned-principles.md +99 -0
@@ -0,0 +1,322 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Command handler for program.packet.lease — manages the exclusive
4
+ local executor lease for a sealed packet. Supports start, heartbeat, release,
5
+ and recover actions (RFC-0856).</purpose>
6
+ <non-goals>
7
+ <item>Do not store raw lease tokens — only the hash is persisted.</item>
8
+ <item>Do not commit — lease files are untracked.</item>
9
+ <item>Do not import from @warpgogol/* — forge must remain dependency-free.</item>
10
+ </non-goals>
11
+ </MODULE_CONTRACT>
12
+ <CHANGE_SUMMARY>
13
+ <item>RFC-0856: initial lease command handler.</item>
14
+ </CHANGE_SUMMARY>
15
+ */
16
+ import fs from "node:fs";
17
+ import path from "node:path";
18
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
19
+ import { writeFileAtomic } from "../../../src/utils/fs-atomic.js";
20
+ import { discoverProgram, findPacketEntry, resolvePacketPath, parsePacketFile, gitHead, } from "../discovery.js";
21
+ import { generateLeaseToken, hashLeaseToken, readLease, writeLease, deleteLease, findActiveLeases, isLeaseStale, updateHeartbeat, } from "../lease.js";
22
+ import { validateLeaseStartTransition } from "../state.js";
23
+ const DEFAULT_TIMEOUT_SECONDS = 3600; // 1 hour
24
+ export async function runLease(input, context) {
25
+ const program = input.flags.program;
26
+ const packetId = input.flags.packet;
27
+ const action = input.flags.action;
28
+ if (!program || !packetId || !action) {
29
+ return leaseFail(program ?? "<missing>", packetId ?? "<missing>", action ?? "<missing>", [
30
+ { rule: "PROGRAM-PACKET-01", message: "--program, --packet, and --action are required" },
31
+ ]);
32
+ }
33
+ switch (action) {
34
+ case "start":
35
+ return leaseStart(input, context, program, packetId);
36
+ case "heartbeat":
37
+ return leaseHeartbeat(context, program, packetId, input);
38
+ case "release":
39
+ return leaseRelease(context, program, packetId, input);
40
+ case "recover":
41
+ return leaseRecover(input, context, program, packetId);
42
+ default:
43
+ return leaseFail(program, packetId, action, [
44
+ { rule: "PROGRAM-PACKET-01", message: `unknown action: ${action}` },
45
+ ]);
46
+ }
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // start
50
+ // ---------------------------------------------------------------------------
51
+ async function leaseStart(input, context, program, packetId) {
52
+ const executor = input.flags.executor;
53
+ if (!executor) {
54
+ return leaseFail(program, packetId, "start", [
55
+ { rule: "PROGRAM-PACKET-01", message: "--executor is required for --action=start" },
56
+ ]);
57
+ }
58
+ const phase = input.flags.phase ?? "execution";
59
+ const { workspaceRoot } = context;
60
+ // Discover program
61
+ let programLocation;
62
+ try {
63
+ programLocation = discoverProgram(workspaceRoot, program);
64
+ }
65
+ catch (err) {
66
+ return leaseFail(program, packetId, "start", [
67
+ { rule: "PROGRAM-PACKET-01", message: String(err.message) },
68
+ ]);
69
+ }
70
+ if (!programLocation) {
71
+ return leaseFail(program, packetId, "start", [
72
+ { rule: "PROGRAM-PACKET-01", message: `program ${program} not found` },
73
+ ]);
74
+ }
75
+ const { manifest, programDir } = programLocation;
76
+ const entry = findPacketEntry(manifest, packetId);
77
+ if (!entry) {
78
+ return leaseFail(program, packetId, "start", [
79
+ { rule: "PROGRAM-PACKET-01", message: `packet ${packetId} not found` },
80
+ ]);
81
+ }
82
+ let packet;
83
+ try {
84
+ packet = parsePacketFile(resolvePacketPath(programDir, entry));
85
+ }
86
+ catch (err) {
87
+ return leaseFail(program, packetId, "start", [
88
+ { rule: "PROGRAM-PACKET-01", message: String(err.message) },
89
+ ]);
90
+ }
91
+ // Check for existing leases
92
+ const activeLeases = findActiveLeases(workspaceRoot, program);
93
+ const hasActiveLease = activeLeases.some((l) => l.packetId === packetId && !isLeaseStale(l.lease));
94
+ let head = "";
95
+ try {
96
+ head = gitHead(workspaceRoot);
97
+ }
98
+ catch {
99
+ return leaseFail(program, packetId, "start", [
100
+ { rule: "PROGRAM-PACKET-02", message: "failed to read git HEAD" },
101
+ ]);
102
+ }
103
+ const violations = validateLeaseStartTransition(manifest, entry, packet, {
104
+ head,
105
+ steward: packet.steward,
106
+ actor: executor,
107
+ hasActiveLease,
108
+ });
109
+ if (violations.length > 0) {
110
+ return leaseFail(program, packetId, "start", violations);
111
+ }
112
+ // Generate lease
113
+ const rawToken = generateLeaseToken();
114
+ const tokenHash = hashLeaseToken(rawToken);
115
+ const now = new Date().toISOString();
116
+ const lease = {
117
+ schema: "forge/program-packet-lease@1",
118
+ program,
119
+ packetId,
120
+ phase: phase,
121
+ actor: executor,
122
+ baseCommit: head,
123
+ sealCommit: entry.sealCommit ?? null,
124
+ tokenHash,
125
+ startedAt: now,
126
+ heartbeatAt: now,
127
+ timeoutSeconds: DEFAULT_TIMEOUT_SECONDS,
128
+ };
129
+ writeLease(workspaceRoot, program, lease);
130
+ // Return raw token ONLY in data.leaseToken — never in logs.
131
+ return {
132
+ data: {
133
+ command: "program.packet.lease",
134
+ status: "pass",
135
+ program,
136
+ packetId,
137
+ action: "start",
138
+ leaseToken: rawToken,
139
+ violations: [],
140
+ },
141
+ exitCode: 0,
142
+ summary: `program.packet.lease: ${packetId} lease started for ${executor}`,
143
+ };
144
+ }
145
+ // ---------------------------------------------------------------------------
146
+ // heartbeat
147
+ // ---------------------------------------------------------------------------
148
+ async function leaseHeartbeat(context, program, packetId, input) {
149
+ const leaseToken = input.flags["lease-token"];
150
+ if (!leaseToken) {
151
+ return leaseFail(program, packetId, "heartbeat", [
152
+ { rule: "PROGRAM-PACKET-01", message: "--lease-token is required for --action=heartbeat" },
153
+ ]);
154
+ }
155
+ const { workspaceRoot } = context;
156
+ const existing = readLease(workspaceRoot, program, packetId);
157
+ if (!existing) {
158
+ return leaseFail(program, packetId, "heartbeat", [
159
+ { rule: "PROGRAM-PACKET-05", message: "no lease found" },
160
+ ]);
161
+ }
162
+ const tokenHash = hashLeaseToken(leaseToken);
163
+ if (tokenHash !== existing.tokenHash) {
164
+ return leaseFail(program, packetId, "heartbeat", [
165
+ { rule: "PROGRAM-PACKET-11", message: "token mismatch" },
166
+ ]);
167
+ }
168
+ updateHeartbeat(workspaceRoot, program, packetId);
169
+ return {
170
+ data: {
171
+ command: "program.packet.lease",
172
+ status: "pass",
173
+ program,
174
+ packetId,
175
+ action: "heartbeat",
176
+ violations: [],
177
+ },
178
+ exitCode: 0,
179
+ summary: `program.packet.lease: ${packetId} heartbeat updated`,
180
+ };
181
+ }
182
+ // ---------------------------------------------------------------------------
183
+ // release
184
+ // ---------------------------------------------------------------------------
185
+ async function leaseRelease(context, program, packetId, input) {
186
+ const leaseToken = input.flags["lease-token"];
187
+ if (!leaseToken) {
188
+ return leaseFail(program, packetId, "release", [
189
+ { rule: "PROGRAM-PACKET-01", message: "--lease-token is required for --action=release" },
190
+ ]);
191
+ }
192
+ const { workspaceRoot } = context;
193
+ const existing = readLease(workspaceRoot, program, packetId);
194
+ if (!existing) {
195
+ return leaseFail(program, packetId, "release", [
196
+ { rule: "PROGRAM-PACKET-05", message: "no lease found" },
197
+ ]);
198
+ }
199
+ const tokenHash = hashLeaseToken(leaseToken);
200
+ if (tokenHash !== existing.tokenHash) {
201
+ return leaseFail(program, packetId, "release", [
202
+ { rule: "PROGRAM-PACKET-11", message: "token mismatch" },
203
+ ]);
204
+ }
205
+ deleteLease(workspaceRoot, program, packetId);
206
+ return {
207
+ data: {
208
+ command: "program.packet.lease",
209
+ status: "pass",
210
+ program,
211
+ packetId,
212
+ action: "release",
213
+ violations: [],
214
+ },
215
+ exitCode: 0,
216
+ summary: `program.packet.lease: ${packetId} lease released`,
217
+ };
218
+ }
219
+ // ---------------------------------------------------------------------------
220
+ // recover
221
+ // ---------------------------------------------------------------------------
222
+ async function leaseRecover(input, context, program, packetId) {
223
+ const steward = input.flags.steward;
224
+ const reason = input.flags.reason;
225
+ if (!steward || !reason) {
226
+ return leaseFail(program, packetId, "recover", [
227
+ {
228
+ rule: "PROGRAM-PACKET-01",
229
+ message: "--steward and --reason are required for --action=recover",
230
+ },
231
+ ]);
232
+ }
233
+ const { workspaceRoot } = context;
234
+ const existing = readLease(workspaceRoot, program, packetId);
235
+ if (!existing) {
236
+ return leaseFail(program, packetId, "recover", [
237
+ { rule: "PROGRAM-PACKET-05", message: "no lease to recover" },
238
+ ]);
239
+ }
240
+ // Only recover stale leases
241
+ if (!isLeaseStale(existing)) {
242
+ return leaseFail(program, packetId, "recover", [
243
+ { rule: "PROGRAM-PACKET-05", message: "lease is not stale — cannot recover active lease" },
244
+ ]);
245
+ }
246
+ // Write recovery record
247
+ const recoveryDir = path.join(workspaceRoot, "docs", "plans", programLocationDir(workspaceRoot, program), "recoveries");
248
+ fs.mkdirSync(recoveryDir, { recursive: true });
249
+ const head = gitHead(workspaceRoot);
250
+ const recovery = {
251
+ schema: "forge/program-packet-recovery@1",
252
+ program,
253
+ packetId,
254
+ previousLeaseDigest: existing.tokenHash,
255
+ reason,
256
+ actor: steward,
257
+ observedHead: head,
258
+ target: "blocked",
259
+ recoveredAt: new Date().toISOString(),
260
+ };
261
+ const recoveryPath = path.join(recoveryDir, `${packetId}-${Date.now()}.json`);
262
+ writeFileAtomic(recoveryPath, JSON.stringify(recovery, null, 2) + "\n");
263
+ // Delete the stale lease
264
+ deleteLease(workspaceRoot, program, packetId);
265
+ // Update manifest: packet state → blocked
266
+ const manifestPath = path.join(workspaceRoot, "docs", "plans", programLocationDir(workspaceRoot, program), "program.yaml");
267
+ const manifestRaw = fs.readFileSync(manifestPath, "utf8");
268
+ const manifestParsed = parseYaml(manifestRaw);
269
+ const idx = manifestParsed.packets.findIndex((p) => p.packetId === packetId);
270
+ if (idx !== -1) {
271
+ manifestParsed.packets[idx].state = "blocked";
272
+ writeFileAtomic(manifestPath, stringifyYaml(manifestParsed));
273
+ }
274
+ return {
275
+ data: {
276
+ command: "program.packet.lease",
277
+ status: "pass",
278
+ program,
279
+ packetId,
280
+ action: "recover",
281
+ violations: [],
282
+ },
283
+ exitCode: 0,
284
+ summary: `program.packet.lease: ${packetId} recovered (stale lease cleared, recovery record written)`,
285
+ };
286
+ }
287
+ // ---------------------------------------------------------------------------
288
+ // Helpers
289
+ // ---------------------------------------------------------------------------
290
+ function programLocationDir(workspaceRoot, program) {
291
+ // Find the directory name under docs/plans/ that contains this program
292
+ const plansDir = path.join(workspaceRoot, "docs", "plans");
293
+ if (!fs.existsSync(plansDir))
294
+ return program;
295
+ for (const entry of fs.readdirSync(plansDir, { withFileTypes: true })) {
296
+ if (!entry.isDirectory())
297
+ continue;
298
+ const manifestPath = path.join(plansDir, entry.name, "program.yaml");
299
+ if (!fs.existsSync(manifestPath))
300
+ continue;
301
+ const raw = fs.readFileSync(manifestPath, "utf8");
302
+ const parsed = parseYaml(raw);
303
+ if (parsed.program === program)
304
+ return entry.name;
305
+ }
306
+ return program;
307
+ }
308
+ function leaseFail(program, packetId, action, violations) {
309
+ return {
310
+ data: {
311
+ command: "program.packet.lease",
312
+ status: "fail",
313
+ program,
314
+ packetId,
315
+ action,
316
+ violations,
317
+ },
318
+ exitCode: 1,
319
+ summary: `program.packet.lease: ${packetId} ${action} failed with ${violations.length} violation(s)`,
320
+ };
321
+ }
322
+ //# sourceMappingURL=lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lease.js","sourceRoot":"","sources":["../../../../os/program/handlers/lease.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext } from "../../../src/types.ts";
2
+ import { type PacketViolation } from "../state.ts";
3
+ export interface SealResultData {
4
+ command: string;
5
+ status: "pass" | "fail";
6
+ program: string;
7
+ packetId: string;
8
+ filesModified: string[];
9
+ violations: PacketViolation[];
10
+ }
11
+ export declare function runSeal(input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<SealResultData>>;
12
+ //# sourceMappingURL=seal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal.d.ts","sourceRoot":"","sources":["../../../../os/program/handlers/seal.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAa/B,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAG3E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,wBAAsB,OAAO,CAC3B,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAgL7C"}
@@ -0,0 +1,265 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Command handler for program.packet.seal — Steward finalizes a packet
4
+ against the predecessor's completion commit, updates packet state from draft
5
+ to sealed, and records the seal in the program manifest (RFC-0856).</purpose>
6
+ <non-goals>
7
+ <item>Do not commit — seal writes files only; canonical commit is separate.</item>
8
+ <item>Do not import from @warpgogol/* — forge must remain dependency-free.</item>
9
+ </non-goals>
10
+ </MODULE_CONTRACT>
11
+ <CHANGE_SUMMARY>
12
+ <item>RFC-0856: initial seal command handler.</item>
13
+ <item>RFC-0857: reciprocal specRef/materializedAs mapping verification for spec-node packets (AC-7).</item>
14
+ </CHANGE_SUMMARY>
15
+ */
16
+ import fs from "node:fs";
17
+ import path from "node:path";
18
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
19
+ import { writeFileAtomic } from "../../../src/utils/fs-atomic.js";
20
+ import { discoverProgram, findPacketEntry, resolvePacketPath, parsePacketFile, verifyNormativeSources, gitBranch, gitHead, gitIsClean, } from "../discovery.js";
21
+ import { findActiveLeases, isLeaseStale } from "../lease.js";
22
+ import { validateSealTransition } from "../state.js";
23
+ export async function runSeal(input, context) {
24
+ const program = input.flags.program;
25
+ const packetId = input.flags.packet;
26
+ const steward = input.flags.steward;
27
+ const idempotencyKey = input.flags["idempotency-key"];
28
+ if (!program || !packetId || !steward) {
29
+ return {
30
+ data: {
31
+ command: "program.packet.seal",
32
+ status: "fail",
33
+ program: program ?? "<missing>",
34
+ packetId: packetId ?? "<missing>",
35
+ filesModified: [],
36
+ violations: [
37
+ {
38
+ rule: "PROGRAM-PACKET-01",
39
+ message: "--program, --packet, and --steward are required",
40
+ },
41
+ ],
42
+ },
43
+ exitCode: 1,
44
+ summary: "program.packet.seal: missing required flags",
45
+ };
46
+ }
47
+ const { workspaceRoot } = context;
48
+ // Discover program
49
+ let programLocation;
50
+ try {
51
+ programLocation = discoverProgram(workspaceRoot, program);
52
+ }
53
+ catch (err) {
54
+ return sealFail(program, packetId, [
55
+ { rule: "PROGRAM-PACKET-01", message: String(err.message) },
56
+ ]);
57
+ }
58
+ if (!programLocation) {
59
+ return sealFail(program, packetId, [
60
+ { rule: "PROGRAM-PACKET-01", message: `program ${program} not found` },
61
+ ]);
62
+ }
63
+ const { manifest, manifestPath, programDir } = programLocation;
64
+ // Find packet entry
65
+ const entry = findPacketEntry(manifest, packetId);
66
+ if (!entry) {
67
+ return sealFail(program, packetId, [
68
+ { rule: "PROGRAM-PACKET-01", message: `packet ${packetId} not found` },
69
+ ]);
70
+ }
71
+ // Parse packet file
72
+ let packet;
73
+ try {
74
+ packet = parsePacketFile(resolvePacketPath(programDir, entry));
75
+ }
76
+ catch (err) {
77
+ return sealFail(program, packetId, [
78
+ { rule: "PROGRAM-PACKET-01", message: String(err.message) },
79
+ ]);
80
+ }
81
+ // Verify normative source hashes
82
+ const hashViolations = verifyNormativeSources(workspaceRoot, packet);
83
+ if (hashViolations.length > 0) {
84
+ return sealFail(program, packetId, hashViolations.map((v) => ({
85
+ rule: "PROGRAM-PACKET-07",
86
+ path: v.path,
87
+ message: `normative source hash mismatch: expected ${v.expected}, got ${v.actual}`,
88
+ })));
89
+ }
90
+ // Git state
91
+ let branch = "";
92
+ let head = "";
93
+ try {
94
+ branch = gitBranch(workspaceRoot);
95
+ head = gitHead(workspaceRoot);
96
+ }
97
+ catch {
98
+ return sealFail(program, packetId, [
99
+ { rule: "PROGRAM-PACKET-02", message: "failed to read git state" },
100
+ ]);
101
+ }
102
+ // Check for active leases
103
+ const activeLeases = findActiveLeases(workspaceRoot, program);
104
+ const hasActiveLease = activeLeases.some((l) => l.packetId === packetId && !isLeaseStale(l.lease));
105
+ let isClean = false;
106
+ try {
107
+ isClean = gitIsClean(workspaceRoot);
108
+ }
109
+ catch {
110
+ // ignore
111
+ }
112
+ // Validate transition
113
+ const violations = validateSealTransition(manifest, entry, packet, {
114
+ branch,
115
+ head,
116
+ isClean,
117
+ hasActiveLease,
118
+ });
119
+ if (violations.length > 0) {
120
+ return sealFail(program, packetId, violations);
121
+ }
122
+ // RFC-0857 AC-7: For spec-node packets, verify reciprocal specRef/materializedAs mapping
123
+ if (entry.decisionKind === "spec-node" && entry.resolvedRfc) {
124
+ const specViolation = verifySpecNodeMapping(workspaceRoot, entry);
125
+ if (specViolation) {
126
+ return sealFail(program, packetId, [specViolation]);
127
+ }
128
+ }
129
+ // --- Perform seal ---
130
+ const filesModified = [];
131
+ // 1. Update packet file: state → sealed, baseCommit → head (for non-bootstrap)
132
+ const packetPath = resolvePacketPath(programDir, entry);
133
+ const packetRaw = fs.readFileSync(packetPath, "utf8");
134
+ const packetFmMatch = packetRaw.match(/^---\n([\s\S]*?)\n---/);
135
+ if (!packetFmMatch) {
136
+ return sealFail(program, packetId, [
137
+ { rule: "PROGRAM-PACKET-01", message: "missing frontmatter in packet file" },
138
+ ]);
139
+ }
140
+ const packetFm = parseYaml(packetFmMatch[1]);
141
+ packetFm.state = "sealed";
142
+ if (entry.dependsOnPacket === null) {
143
+ // Bootstrap packet: baseCommit stays null (set by completion)
144
+ }
145
+ else {
146
+ packetFm.baseCommit = head;
147
+ }
148
+ const newPacketFm = stringifyYaml(packetFm);
149
+ const newPacketRaw = `---\n${newPacketFm}---\n${packetRaw.slice(packetFmMatch[0].length)}`;
150
+ writeFileAtomic(packetPath, newPacketRaw);
151
+ filesModified.push(path.relative(workspaceRoot, packetPath));
152
+ // 2. Update program manifest: packet state → sealed
153
+ const manifestRaw = fs.readFileSync(manifestPath, "utf8");
154
+ const manifestParsed = parseYaml(manifestRaw);
155
+ const packetIdx = manifestParsed.packets.findIndex((p) => p.packetId === packetId);
156
+ if (packetIdx === -1) {
157
+ return sealFail(program, packetId, [
158
+ { rule: "PROGRAM-PACKET-01", message: "packet not found in manifest" },
159
+ ]);
160
+ }
161
+ manifestParsed.packets[packetIdx].state = "sealed";
162
+ if (entry.dependsOnPacket !== null) {
163
+ manifestParsed.packets[packetIdx].baseCommit = head;
164
+ }
165
+ const newManifestRaw = stringifyYaml(manifestParsed);
166
+ writeFileAtomic(manifestPath, newManifestRaw);
167
+ filesModified.push(path.relative(workspaceRoot, manifestPath));
168
+ return {
169
+ data: {
170
+ command: "program.packet.seal",
171
+ status: "pass",
172
+ program,
173
+ packetId,
174
+ filesModified,
175
+ violations: [],
176
+ },
177
+ exitCode: 0,
178
+ summary: `program.packet.seal: ${packetId} sealed on ${branch}@${head.slice(0, 8)}`,
179
+ };
180
+ }
181
+ function sealFail(program, packetId, violations) {
182
+ return {
183
+ data: {
184
+ command: "program.packet.seal",
185
+ status: "fail",
186
+ program,
187
+ packetId,
188
+ filesModified: [],
189
+ violations,
190
+ },
191
+ exitCode: 1,
192
+ summary: `program.packet.seal: ${packetId} failed with ${violations.length} violation(s)`,
193
+ };
194
+ }
195
+ // ---------------------------------------------------------------------------
196
+ // RFC-0857 AC-7: Reciprocal specRef/materializedAs mapping verification
197
+ // ---------------------------------------------------------------------------
198
+ function verifySpecNodeMapping(workspaceRoot, entry) {
199
+ const governingDecision = entry.governingDecision;
200
+ const slashIdx = governingDecision.indexOf("/");
201
+ if (slashIdx === -1) {
202
+ return {
203
+ rule: "PROGRAM-PACKET-12",
204
+ message: `spec-node governingDecision "${governingDecision}" is not in <spec-id>/<node-id> format`,
205
+ };
206
+ }
207
+ const specId = governingDecision.slice(0, slashIdx);
208
+ const nodeId = governingDecision.slice(slashIdx + 1);
209
+ // Check forge-spec.yaml for materializedAs matching resolvedRfc
210
+ const specPath = path.join(workspaceRoot, "docs", "specs", specId, "forge-spec.yaml");
211
+ if (!fs.existsSync(specPath)) {
212
+ return {
213
+ rule: "PROGRAM-PACKET-12",
214
+ message: `spec file not found: docs/specs/${specId}/forge-spec.yaml`,
215
+ };
216
+ }
217
+ const specRaw = fs.readFileSync(specPath, "utf8");
218
+ const specParsed = parseYaml(specRaw);
219
+ const specNode = specParsed.rfcs?.find((r) => r.id === nodeId);
220
+ if (!specNode) {
221
+ return {
222
+ rule: "PROGRAM-PACKET-12",
223
+ message: `spec node ${nodeId} not found in docs/specs/${specId}/forge-spec.yaml`,
224
+ };
225
+ }
226
+ if (specNode.materializedAs !== entry.resolvedRfc) {
227
+ return {
228
+ rule: "PROGRAM-PACKET-12",
229
+ message: `materializedAs (${specNode.materializedAs ?? "null"}) does not match resolvedRfc (${entry.resolvedRfc}) for ${nodeId}`,
230
+ };
231
+ }
232
+ // Check RFC file for reciprocal specRef
233
+ const rfcPath = path.join(workspaceRoot, "docs", "rfcs", `${entry.resolvedRfc.toLowerCase()}.md`);
234
+ if (!fs.existsSync(rfcPath)) {
235
+ return {
236
+ rule: "PROGRAM-PACKET-12",
237
+ message: `RFC file not found: docs/rfcs/${entry.resolvedRfc.toLowerCase()}.md`,
238
+ };
239
+ }
240
+ const rfcRaw = fs.readFileSync(rfcPath, "utf8");
241
+ const rfcFmMatch = rfcRaw.match(/^---\n([\s\S]*?)\n---/);
242
+ if (!rfcFmMatch) {
243
+ return {
244
+ rule: "PROGRAM-PACKET-12",
245
+ message: `missing frontmatter in ${entry.resolvedRfc}`,
246
+ };
247
+ }
248
+ const rfcFm = parseYaml(rfcFmMatch[1]);
249
+ const expectedSpecRef = `${specId}/${nodeId}`;
250
+ if (rfcFm.specRef !== expectedSpecRef) {
251
+ return {
252
+ rule: "PROGRAM-PACKET-12",
253
+ message: `specRef (${rfcFm.specRef ?? "null"}) does not match expected ${expectedSpecRef} in ${entry.resolvedRfc}`,
254
+ };
255
+ }
256
+ // RFC must be accepted or implemented
257
+ if (rfcFm.status !== "accepted" && rfcFm.status !== "implemented") {
258
+ return {
259
+ rule: "PROGRAM-PACKET-12",
260
+ message: `${entry.resolvedRfc} status is "${rfcFm.status}", expected "accepted" or "implemented"`,
261
+ };
262
+ }
263
+ return null;
264
+ }
265
+ //# sourceMappingURL=seal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal.js","sourceRoot":"","sources":["../../../../os/program/handlers/seal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext } from "../../../src/types.ts";
2
+ import { type PacketViolation } from "../state.ts";
3
+ export interface ValidateResultData {
4
+ command: string;
5
+ status: "pass" | "fail";
6
+ program: string;
7
+ packetId: string;
8
+ phase: string;
9
+ branch: string;
10
+ head: string;
11
+ violations: PacketViolation[];
12
+ }
13
+ export declare function runValidate(input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<ValidateResultData>>;
14
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../os/program/handlers/validate.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAY/B,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CA+IjD"}