@sentropic/track 0.2.1 → 0.3.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/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +47 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/events/lock.d.ts +42 -0
- package/dist/events/lock.d.ts.map +1 -0
- package/dist/events/lock.js +91 -0
- package/dist/events/lock.js.map +1 -0
- package/dist/events/store.d.ts.map +1 -1
- package/dist/events/store.js +47 -41
- package/dist/events/store.js.map +1 -1
- package/dist/ingest/contract.d.ts +48 -0
- package/dist/ingest/contract.d.ts.map +1 -0
- package/dist/ingest/contract.js +154 -0
- package/dist/ingest/contract.js.map +1 -0
- package/dist/ingest/ingest.d.ts +34 -0
- package/dist/ingest/ingest.d.ts.map +1 -0
- package/dist/ingest/ingest.js +187 -0
- package/dist/ingest/ingest.js.map +1 -0
- package/dist/ingest/map.d.ts +18 -0
- package/dist/ingest/map.d.ts.map +1 -0
- package/dist/ingest/map.js +149 -0
- package/dist/ingest/map.js.map +1 -0
- package/package.json +1 -1
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACxB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACzB;AAsID,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,MAAM,CA0CxD"}
|
package/dist/cli/index.js
CHANGED
|
@@ -7,6 +7,8 @@ import { validate } from '../events/validate.js';
|
|
|
7
7
|
import { DomainError } from '../model/item.js';
|
|
8
8
|
import { formatRows } from '../report/format.js';
|
|
9
9
|
import { Track } from '../track.js';
|
|
10
|
+
import { BLOCKER_KINDS, DECISION_KINDS, DISPOSITIONS, EVIDENCE_KINDS, GATES, ITEM_KINDS, OUTCOMES, REALIZE_TARGETS, RESOLUTION_RULES, RESULTS, SPEC_TARGETS, } from '../ingest/contract.js';
|
|
11
|
+
import { ingest } from '../ingest/ingest.js';
|
|
10
12
|
import { TrackReader } from '../read/contract.js';
|
|
11
13
|
import { queryText, reportText } from '../read/commands.js';
|
|
12
14
|
import { VERSION } from '../version.js';
|
|
@@ -35,21 +37,14 @@ const USAGE = `usage: track <command>
|
|
|
35
37
|
query [--kind <k>] [--workspace <w>] [--bucket <AWAITED|DROPPED|DONE|TO-DO>] [--realization <r>] [--acceptance <a>] [--format json|text|md] [--commit <sha>]
|
|
36
38
|
validate [--commit <sha>]
|
|
37
39
|
branch import <BRANCH.md> [--commit <sha>]
|
|
40
|
+
ingest <file.jsonl> --workspace <w>
|
|
38
41
|
`;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
// Write enums (ITEM_KINDS, SPEC_TARGETS, REALIZE_TARGETS, DECISION_KINDS, OUTCOMES, GATES, DISPOSITIONS,
|
|
43
|
+
// BLOCKER_KINDS, RESOLUTION_RULES, EVIDENCE_KINDS, RESULTS) are sourced from the ingest contract — the
|
|
44
|
+
// SINGLE source, so the CLI's `oneOf` checks and the WorkEvent mapper cannot diverge on accepted values.
|
|
45
|
+
// (`linked-accepted` openness is DERIVED at report/query time vs `--commit`, v2.2a hybrid-A; see
|
|
46
|
+
// src/report/blocker-status.ts.) Only CLI/read-projection enums stay local:
|
|
42
47
|
const REALIZATIONS = ['to-do', 'in-progress', 'done', 'cancelled', 'rejected'];
|
|
43
|
-
const DECISION_KINDS = ['orientation', 'commitment'];
|
|
44
|
-
const OUTCOMES = ['go', 'no-go', 'deferred'];
|
|
45
|
-
const GATES = ['orientation', 'commitment'];
|
|
46
|
-
const DISPOSITIONS = ['required', 'skipped', 'not-applicable'];
|
|
47
|
-
const BLOCKER_KINDS = ['decision', 'dependency'];
|
|
48
|
-
// `linked-accepted` openness is DERIVED at report/query time vs `--commit` (v2.2a hybrid-A):
|
|
49
|
-
// the gate re-opens when the ref regresses. See src/report/blocker-status.ts.
|
|
50
|
-
const RESOLUTION_RULES = ['linked-done', 'linked-accepted', 'manual'];
|
|
51
|
-
const EVIDENCE_KINDS = ['unit', 'integration', 'e2e', 'manual'];
|
|
52
|
-
const RESULTS = ['pass', 'fail'];
|
|
53
48
|
const FROM_FORMATS = ['junit', 'json'];
|
|
54
49
|
const BUCKETS_ARG = ['AWAITED', 'DROPPED', 'DONE', 'TO-DO'];
|
|
55
50
|
// `n/a` is decision-only; `query` projects non-decision rows, so it would never match.
|
|
@@ -179,6 +174,8 @@ export function runCli(argv, io) {
|
|
|
179
174
|
return cmdValidate(rest, io);
|
|
180
175
|
case 'branch':
|
|
181
176
|
return cmdBranch(rest, io);
|
|
177
|
+
case 'ingest':
|
|
178
|
+
return cmdIngest(rest, io);
|
|
182
179
|
default:
|
|
183
180
|
io.err(USAGE);
|
|
184
181
|
return 2;
|
|
@@ -422,4 +419,41 @@ function cmdBranch(args, io) {
|
|
|
422
419
|
io.out(`Imported ${result.branchSlug}: ${result.created} created, ${result.updated} updated\n`);
|
|
423
420
|
return 0;
|
|
424
421
|
}
|
|
422
|
+
/**
|
|
423
|
+
* `track ingest <file.jsonl> --workspace <w>` — apply a neutral WorkEvent stream (M2b channel ①). A
|
|
424
|
+
* local-user channel pinned to one workspace; provenance is `transport:'import'` to keep batch ingest
|
|
425
|
+
* distinguishable from interactive CLI writes in the audit log. Same shape as `branch import` /
|
|
426
|
+
* `accept run --from`: a local-file adapter, not a network transport.
|
|
427
|
+
*/
|
|
428
|
+
function cmdIngest(args, io) {
|
|
429
|
+
const { positional, flags } = parseFlags(args);
|
|
430
|
+
const file = positional[0];
|
|
431
|
+
if (file === undefined) {
|
|
432
|
+
io.err('usage: track ingest <file.jsonl> --workspace <w>\n');
|
|
433
|
+
return 2;
|
|
434
|
+
}
|
|
435
|
+
const workspace = req(flags, 'workspace');
|
|
436
|
+
const raw = readFileSync(isAbsolute(file) ? file : join(io.cwd, file), 'utf8');
|
|
437
|
+
const events = [];
|
|
438
|
+
raw.split('\n').forEach((line, i) => {
|
|
439
|
+
const trimmed = line.trim();
|
|
440
|
+
if (trimmed.length === 0)
|
|
441
|
+
return;
|
|
442
|
+
try {
|
|
443
|
+
events.push(JSON.parse(trimmed));
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
throw new DomainError(`ingest: malformed JSON on line ${i + 1}`);
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
const ctx = {
|
|
450
|
+
by: cliActor(io.cwd),
|
|
451
|
+
workspace,
|
|
452
|
+
prov: { transport: 'import', proposed: false, auth: 'local-user' },
|
|
453
|
+
};
|
|
454
|
+
const result = ingest(events, ctx, store(io.cwd));
|
|
455
|
+
for (const id of result.ids)
|
|
456
|
+
io.out(`${id ?? '-'}\n`);
|
|
457
|
+
return 0;
|
|
458
|
+
}
|
|
425
459
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-process write serialization for the single-stream event log.
|
|
3
|
+
*
|
|
4
|
+
* `EventStore.appendCommand` runs read → validate → compute (prevHash/seq) → append → writeHead as a
|
|
5
|
+
* critical section with NO mutual exclusion. Two writers on the same `events.jsonl` (a CLI run while an
|
|
6
|
+
* MCP server is live, two `track-mcp` instances, an h2a sidecar) both read the same N-event prefix,
|
|
7
|
+
* compute the SAME `prevHash`/`seq`, and append — producing a broken `prevHash` chain + duplicate `seq`
|
|
8
|
+
* + a stale `head.json`. The fail-closed guard then refuses EVERY future append (a permanent, human-only
|
|
9
|
+
* repair): an integrity-DoS triggerable by any concurrent writer. `withFileLock` serializes that section
|
|
10
|
+
* across processes so the single-writer contract holds in practice, not just in intent.
|
|
11
|
+
*
|
|
12
|
+
* DELIBERATELY NO automatic stale-lock stealing (review verdict, Lot v2.3b-0): pathname-based stealing
|
|
13
|
+
* is intrinsically racy — two waiters can both judge a lock abandoned, the slower `unlink` then deletes
|
|
14
|
+
* the WINNER's fresh lock and mutual exclusion is broken; and an age-based steal can preempt a merely
|
|
15
|
+
* SLOW live holder (large log, slow disk, SIGSTOP/suspend), putting two writers in the critical section.
|
|
16
|
+
* Both failure modes recreate the exact corruption this lock exists to prevent. Posture instead:
|
|
17
|
+
* fail-closed with a DIAGNOSED timeout — the error reports the holder PID and whether it is still
|
|
18
|
+
* running, so a human can safely remove an orphaned lock (the only way one arises is a writer dying
|
|
19
|
+
* mid-append, e.g. SIGKILL/power loss; appends take milliseconds). This matches the store's existing
|
|
20
|
+
* fail-closed stance (a torn trailing line is also detected, never silently repaired).
|
|
21
|
+
*
|
|
22
|
+
* Scope: same-host writers only (advisory `O_EXCL` lockfile + local PID diagnosis). Shared/networked
|
|
23
|
+
* filesystems (NFS) are out of scope, as is the store itself (single host, single writer — SPEC).
|
|
24
|
+
* Operational only — it does NOT touch the frozen event contract (stream/seq/prevHash/hash).
|
|
25
|
+
* Upgrade path: `flock(2)` on a held fd would auto-release on process death (no orphan, no manual rm),
|
|
26
|
+
* but Node's stdlib does not expose it — adopt only if a native dep ever becomes acceptable.
|
|
27
|
+
*/
|
|
28
|
+
export interface LockOptions {
|
|
29
|
+
/** Max time to wait to acquire before throwing (never hang). */
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
/** Poll interval while contended. */
|
|
32
|
+
retryMs?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Run `fn` while holding an exclusive cross-process lock on `<targetPath>.lock`. Released in `finally`
|
|
36
|
+
* (only its own generation — a token mismatch means the lock is no longer ours and is left alone).
|
|
37
|
+
* Throws a diagnosed error after `timeoutMs` rather than hanging or stealing. NOT reentrant (the store
|
|
38
|
+
* never nests appends). NOTE: the store is synchronous, so a contended acquire blocks the whole event
|
|
39
|
+
* loop for up to `timeoutMs` — acceptable for the CLI and the (serial) stdio MCP server.
|
|
40
|
+
*/
|
|
41
|
+
export declare function withFileLock<T>(targetPath: string, fn: () => T, options?: LockOptions): T;
|
|
42
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/events/lock.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAgDD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAE,WAAgB,GAAG,CAAC,CAyC7F"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { closeSync, mkdirSync, openSync, readFileSync, unlinkSync, writeSync } from 'node:fs';
|
|
2
|
+
import { randomBytes } from 'node:crypto';
|
|
3
|
+
import { hostname } from 'node:os';
|
|
4
|
+
import { dirname } from 'node:path';
|
|
5
|
+
const DEFAULTS = { timeoutMs: 10_000, retryMs: 20 };
|
|
6
|
+
/** Synchronous sleep — the store is fully synchronous. Blocks the thread without burning CPU. */
|
|
7
|
+
function sleepSync(ms) {
|
|
8
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, Math.max(1, ms));
|
|
9
|
+
}
|
|
10
|
+
/** Is `pid` a live process on THIS host? ESRCH ⇒ dead; EPERM ⇒ alive but not ours to signal. */
|
|
11
|
+
function isAlive(pid) {
|
|
12
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
13
|
+
return false;
|
|
14
|
+
try {
|
|
15
|
+
process.kill(pid, 0);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return err.code === 'EPERM';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function readHolder(lockPath) {
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(readFileSync(lockPath, 'utf8'));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return undefined; // missing, torn, or empty — caller decides what that means
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Human-actionable diagnosis for a timeout: who holds it, and is removing it safe? */
|
|
31
|
+
function diagnose(lockPath) {
|
|
32
|
+
const holder = readHolder(lockPath);
|
|
33
|
+
if (holder === undefined) {
|
|
34
|
+
return 'holder record unreadable (lock vanished or torn)';
|
|
35
|
+
}
|
|
36
|
+
const liveness = isAlive(holder.pid)
|
|
37
|
+
? 'still RUNNING — another track writer is active, do not remove'
|
|
38
|
+
: 'NOT running — orphaned (writer died mid-append); safe to delete the lock file to recover';
|
|
39
|
+
return `held by pid ${holder.pid}@${holder.host} since ${new Date(holder.time).toISOString()}, ${liveness}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Run `fn` while holding an exclusive cross-process lock on `<targetPath>.lock`. Released in `finally`
|
|
43
|
+
* (only its own generation — a token mismatch means the lock is no longer ours and is left alone).
|
|
44
|
+
* Throws a diagnosed error after `timeoutMs` rather than hanging or stealing. NOT reentrant (the store
|
|
45
|
+
* never nests appends). NOTE: the store is synchronous, so a contended acquire blocks the whole event
|
|
46
|
+
* loop for up to `timeoutMs` — acceptable for the CLI and the (serial) stdio MCP server.
|
|
47
|
+
*/
|
|
48
|
+
export function withFileLock(targetPath, fn, options = {}) {
|
|
49
|
+
const { timeoutMs, retryMs } = { ...DEFAULTS, ...options };
|
|
50
|
+
const lockPath = `${targetPath}.lock`;
|
|
51
|
+
mkdirSync(dirname(lockPath), { recursive: true });
|
|
52
|
+
const token = randomBytes(12).toString('hex');
|
|
53
|
+
const deadline = Date.now() + timeoutMs;
|
|
54
|
+
for (;;) {
|
|
55
|
+
try {
|
|
56
|
+
const fd = openSync(lockPath, 'wx'); // O_CREAT|O_EXCL|O_WRONLY — fails with EEXIST if held
|
|
57
|
+
try {
|
|
58
|
+
const holder = { pid: process.pid, host: hostname(), time: Date.now(), token };
|
|
59
|
+
writeSync(fd, JSON.stringify(holder));
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
closeSync(fd);
|
|
63
|
+
}
|
|
64
|
+
break; // acquired
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (err.code !== 'EEXIST')
|
|
68
|
+
throw err;
|
|
69
|
+
if (Date.now() >= deadline) {
|
|
70
|
+
throw new Error(`withFileLock: timed out after ${timeoutMs}ms waiting for ${lockPath} — ${diagnose(lockPath)}.`);
|
|
71
|
+
}
|
|
72
|
+
sleepSync(retryMs);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
return fn();
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
// Release ONLY our own generation. If the file no longer carries our token (e.g. a human removed an
|
|
80
|
+
// orphan and another writer acquired), deleting it would break THEIR mutual exclusion — leave it.
|
|
81
|
+
if (readHolder(lockPath)?.token === token) {
|
|
82
|
+
try {
|
|
83
|
+
unlinkSync(lockPath);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// already gone — nothing to release
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/events/lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoCnC,MAAM,QAAQ,GAA0B,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;AAU1E,iGAAiG;AACjG,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAC/E,CAAC;AAED,gGAAgG;AAChG,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IACpD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAQ,GAA6B,CAAC,IAAI,KAAK,OAAO,CAAA;IACxD,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IAClC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAW,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA,CAAC,2DAA2D;IAC9E,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,SAAS,QAAQ,CAAC,QAAgB;IAChC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,kDAAkD,CAAA;IAC3D,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;QAClC,CAAC,CAAC,+DAA+D;QACjE,CAAC,CAAC,0FAA0F,CAAA;IAC9F,OAAO,eAAe,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAA;AAC7G,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAI,UAAkB,EAAE,EAAW,EAAE,UAAuB,EAAE;IACxF,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAA;IAC1D,MAAM,QAAQ,GAAG,GAAG,UAAU,OAAO,CAAA;IACrC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IAEvC,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA,CAAC,sDAAsD;YAC1F,IAAI,CAAC;gBACH,MAAM,MAAM,GAAW,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAA;gBACtF,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;YACvC,CAAC;oBAAS,CAAC;gBACT,SAAS,CAAC,EAAE,CAAC,CAAA;YACf,CAAC;YACD,MAAK,CAAC,WAAW;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAA;YAC/D,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,iCAAiC,SAAS,kBAAkB,QAAQ,MAAM,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAChG,CAAA;YACH,CAAC;YACD,SAAS,CAAC,OAAO,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;YAAS,CAAC;QACT,oGAAoG;QACpG,kGAAkG;QAClG,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,UAAU,CAAC,QAAQ,CAAC,CAAA;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAqB,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAGnF;;;;;;;GAOG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE7C,mFAAmF;IACnF,OAAO,IAAI,UAAU,EAAE;IAiBvB;;;;OAIG;IACH,aAAa,CACX,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,EACnC,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,IAAI,CAAA;KAAO,GAC1B,UAAU,EAAE;IAqEf;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;CAcrB"}
|
package/dist/events/store.js
CHANGED
|
@@ -3,6 +3,7 @@ import { dirname } from 'node:path';
|
|
|
3
3
|
import { canonicalize, materialize } from './canonical.js';
|
|
4
4
|
import { contentHashOf } from './frame.js';
|
|
5
5
|
import { readHead, writeHead } from './head.js';
|
|
6
|
+
import { withFileLock } from './lock.js';
|
|
6
7
|
import { validate } from './validate.js';
|
|
7
8
|
/**
|
|
8
9
|
* Append-only single-writer event store over `.track/events.jsonl` (SPEC §3, §4).
|
|
@@ -51,48 +52,53 @@ export class EventStore {
|
|
|
51
52
|
if (isBatch && opts.cmdId === undefined) {
|
|
52
53
|
throw new Error('EventStore.appendCommand: a multi-event command requires a cmdId');
|
|
53
54
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
55
|
+
// Serialize the read→validate→compute→append→writeHead critical section ACROSS processes. Without
|
|
56
|
+
// it, two concurrent writers compute the same prevHash/seq and corrupt the single stream, which the
|
|
57
|
+
// fail-closed guard below then turns into a permanent write-DoS for every future writer (see lock.ts).
|
|
58
|
+
return withFileLock(this.filePath, () => {
|
|
59
|
+
const existing = this.readAll();
|
|
60
|
+
const integrity = validate(existing, readHead(this.filePath));
|
|
61
|
+
if (!integrity.ok) {
|
|
62
|
+
const kinds = integrity.findings.map((f) => f.kind).join(', ');
|
|
63
|
+
throw new Error(`EventStore.appendCommand: refusing to extend an invalid log ` +
|
|
64
|
+
`(${integrity.findings.length} finding(s): ${kinds})`);
|
|
65
|
+
}
|
|
66
|
+
let prevHash = existing.length > 0 ? existing[existing.length - 1].contentHash : null;
|
|
67
|
+
// Next per-aggregate seq = max(seq) + 1, aligned with validate's authority.
|
|
68
|
+
const lastSeqByAggregate = new Map();
|
|
69
|
+
for (const e of existing) {
|
|
70
|
+
lastSeqByAggregate.set(e.aggregateId, e.seq);
|
|
71
|
+
}
|
|
72
|
+
const events = [];
|
|
73
|
+
inputs.forEach((input, i) => {
|
|
74
|
+
const seq = (lastSeqByAggregate.get(input.aggregateId) ?? 0) + 1;
|
|
75
|
+
lastSeqByAggregate.set(input.aggregateId, seq);
|
|
76
|
+
const core = isBatch
|
|
77
|
+
? { ...input, cmdId: opts.cmdId, cmd: { i, n } }
|
|
78
|
+
: { ...input };
|
|
79
|
+
// Materialize ONCE to an inert plain-data snapshot, then hash AND persist that same
|
|
80
|
+
// snapshot — so a live payload (Proxy / getter / toJSON) cannot diverge between the two.
|
|
81
|
+
const materialized = materialize(core);
|
|
82
|
+
const contentHash = contentHashOf(materialized);
|
|
83
|
+
const event = { ...materialized, seq, prevHash, contentHash };
|
|
84
|
+
events.push(event);
|
|
85
|
+
prevHash = contentHash;
|
|
86
|
+
});
|
|
87
|
+
// Validate the FULL candidate stream (not just the existing prefix): the command itself
|
|
88
|
+
// could introduce a cross-event violation (e.g. an aggregate-mismatch, a malformed batch).
|
|
89
|
+
const candidate = validate([...existing, ...events]);
|
|
90
|
+
if (!candidate.ok) {
|
|
91
|
+
const kinds = candidate.findings.map((f) => f.kind).join(', ');
|
|
92
|
+
throw new Error(`EventStore.appendCommand: command would produce an invalid log ` +
|
|
93
|
+
`(${candidate.findings.length} finding(s): ${kinds})`);
|
|
94
|
+
}
|
|
95
|
+
this.appendAtomic(events);
|
|
96
|
+
writeHead(this.filePath, {
|
|
97
|
+
streamLength: existing.length + events.length,
|
|
98
|
+
lastContentHash: events[events.length - 1].contentHash,
|
|
99
|
+
});
|
|
100
|
+
return events;
|
|
94
101
|
});
|
|
95
|
-
return events;
|
|
96
102
|
}
|
|
97
103
|
/**
|
|
98
104
|
* Append all of a command's lines in one fsync'd write. Each line is the event's `canonicalize`
|
package/dist/events/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export declare const INGEST_CONTRACT_VERSION = "1.0.0";
|
|
2
|
+
export declare const ITEM_KINDS: readonly ["feature", "bug", "chore"];
|
|
3
|
+
export declare const SPEC_TARGETS: readonly ["to-specify", "specified"];
|
|
4
|
+
export declare const REALIZE_TARGETS: readonly ["in-progress", "done", "cancelled"];
|
|
5
|
+
export declare const DECISION_KINDS: readonly ["orientation", "commitment"];
|
|
6
|
+
export declare const OUTCOMES: readonly ["go", "no-go", "deferred"];
|
|
7
|
+
export declare const GATES: readonly ["orientation", "commitment"];
|
|
8
|
+
export declare const DISPOSITIONS: readonly ["required", "skipped", "not-applicable"];
|
|
9
|
+
export declare const BLOCKER_KINDS: readonly ["decision", "dependency"];
|
|
10
|
+
export declare const RESOLUTION_RULES: readonly ["linked-done", "linked-accepted", "manual"];
|
|
11
|
+
export declare const EVIDENCE_KINDS: readonly ["unit", "integration", "e2e", "manual"];
|
|
12
|
+
export declare const RESULTS: readonly ["pass", "fail"];
|
|
13
|
+
export declare const WORK_EVENT_KINDS: readonly ["item.create", "item.spec", "item.realize", "decision.create", "decision.dossier", "decision.outcome", "decision.disposition", "acceptance.criterion", "acceptance.link", "acceptance.run", "acceptance.waive", "priority.assess", "blocker.raise", "blocker.resolve"];
|
|
14
|
+
export type WorkEventKind = (typeof WORK_EVENT_KINDS)[number];
|
|
15
|
+
export interface WorkEvent {
|
|
16
|
+
/** Contract major. Unknown major ⇒ fail-closed reject; unknown minor degrades to "unknown kind". */
|
|
17
|
+
v: 1;
|
|
18
|
+
kind: WorkEventKind;
|
|
19
|
+
/** Validated per-kind by WORK_EVENT_SCHEMA (required + type + enum + NO unknown fields). */
|
|
20
|
+
payload: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
/** The only allowed envelope keys — any other (actor/sponsor/proposed/…) is rejected fail-closed: the
|
|
23
|
+
* WHO and the trust level come from the ingest CONTEXT (channel), never per-event (v2.3b-DESIGN.md §2). */
|
|
24
|
+
export declare const WORK_EVENT_ENVELOPE_KEYS: readonly ["v", "kind", "payload"];
|
|
25
|
+
export type FieldType = 'string' | 'number' | 'string[]' | 'object';
|
|
26
|
+
export interface FieldSpec {
|
|
27
|
+
type: FieldType;
|
|
28
|
+
required: boolean;
|
|
29
|
+
/** Allowed values for a string field (else any string). */
|
|
30
|
+
enum?: readonly string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* How a kind settles state — drives the binding gate in `ingest` (v2.3b-2):
|
|
34
|
+
* - `never` non-binding (creation/preparation)
|
|
35
|
+
* - `always` binding — requires `auth ∈ {local-user, signed}`
|
|
36
|
+
* - `realize-terminal` binding iff `payload.to ∈ {done, cancelled}` (a false `done` is a false-green)
|
|
37
|
+
* - `evidence` machine evidence (a CI run) — gated like binding on an unauthenticated channel
|
|
38
|
+
* (which denies all settling writes), allowed on local-user/signed
|
|
39
|
+
*/
|
|
40
|
+
export type Settles = 'never' | 'always' | 'realize-terminal' | 'evidence';
|
|
41
|
+
export interface KindSchema {
|
|
42
|
+
/** The Track facade method this kind maps to (1:1). */
|
|
43
|
+
method: string;
|
|
44
|
+
settles: Settles;
|
|
45
|
+
fields: Record<string, FieldSpec>;
|
|
46
|
+
}
|
|
47
|
+
export declare const WORK_EVENT_SCHEMA: Record<WorkEventKind, KindSchema>;
|
|
48
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/ingest/contract.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,uBAAuB,UAAU,CAAA;AAG9C,eAAO,MAAM,UAAU,sCAAuC,CAAA;AAC9D,eAAO,MAAM,YAAY,sCAAuC,CAAA;AAChE,eAAO,MAAM,eAAe,+CAAgD,CAAA;AAC5E,eAAO,MAAM,cAAc,wCAAyC,CAAA;AACpE,eAAO,MAAM,QAAQ,sCAAuC,CAAA;AAC5D,eAAO,MAAM,KAAK,wCAAyC,CAAA;AAC3D,eAAO,MAAM,YAAY,oDAAqD,CAAA;AAC9E,eAAO,MAAM,aAAa,qCAAsC,CAAA;AAChE,eAAO,MAAM,gBAAgB,uDAAwD,CAAA;AACrF,eAAO,MAAM,cAAc,mDAAoD,CAAA;AAC/E,eAAO,MAAM,OAAO,2BAA4B,CAAA;AAGhD,eAAO,MAAM,gBAAgB,kRAenB,CAAA;AACV,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7D,MAAM,WAAW,SAAS;IACxB,oGAAoG;IACpG,CAAC,EAAE,CAAC,CAAA;IACJ,IAAI,EAAE,aAAa,CAAA;IACnB,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED;4GAC4G;AAC5G,eAAO,MAAM,wBAAwB,mCAAoC,CAAA;AAGzE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEnE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,kBAAkB,GAAG,UAAU,CAAA;AAE1E,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAClC;AAMD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,UAAU,CA+G/D,CAAA"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Lot v2.3b-1 — the neutral `WorkEvent` ingest contract (M2b write seam, channel ①).
|
|
2
|
+
//
|
|
3
|
+
// A WorkEvent is a transport-agnostic envelope: it carries the WHAT (kind + payload); the WHO
|
|
4
|
+
// (by/workspace/prov/capability) comes from the ingest CONTEXT, never the event (see v2.3b-DESIGN.md §2).
|
|
5
|
+
// One WorkEvent ⇒ one Track command. This module is the SINGLE SOURCE of the write enums (so the CLI's
|
|
6
|
+
// `oneOf` checks and the mapper cannot diverge on accepted values) and of the per-kind payload schema.
|
|
7
|
+
export const INGEST_CONTRACT_VERSION = '1.0.0';
|
|
8
|
+
// --- write enums (shared with src/cli/index.ts) ------------------------------------------------------
|
|
9
|
+
export const ITEM_KINDS = ['feature', 'bug', 'chore'];
|
|
10
|
+
export const SPEC_TARGETS = ['to-specify', 'specified'];
|
|
11
|
+
export const REALIZE_TARGETS = ['in-progress', 'done', 'cancelled'];
|
|
12
|
+
export const DECISION_KINDS = ['orientation', 'commitment'];
|
|
13
|
+
export const OUTCOMES = ['go', 'no-go', 'deferred'];
|
|
14
|
+
export const GATES = ['orientation', 'commitment'];
|
|
15
|
+
export const DISPOSITIONS = ['required', 'skipped', 'not-applicable'];
|
|
16
|
+
export const BLOCKER_KINDS = ['decision', 'dependency'];
|
|
17
|
+
export const RESOLUTION_RULES = ['linked-done', 'linked-accepted', 'manual'];
|
|
18
|
+
export const EVIDENCE_KINDS = ['unit', 'integration', 'e2e', 'manual'];
|
|
19
|
+
export const RESULTS = ['pass', 'fail'];
|
|
20
|
+
// --- kinds -------------------------------------------------------------------------------------------
|
|
21
|
+
export const WORK_EVENT_KINDS = [
|
|
22
|
+
'item.create',
|
|
23
|
+
'item.spec',
|
|
24
|
+
'item.realize',
|
|
25
|
+
'decision.create',
|
|
26
|
+
'decision.dossier',
|
|
27
|
+
'decision.outcome',
|
|
28
|
+
'decision.disposition',
|
|
29
|
+
'acceptance.criterion',
|
|
30
|
+
'acceptance.link',
|
|
31
|
+
'acceptance.run',
|
|
32
|
+
'acceptance.waive',
|
|
33
|
+
'priority.assess',
|
|
34
|
+
'blocker.raise',
|
|
35
|
+
'blocker.resolve',
|
|
36
|
+
];
|
|
37
|
+
/** The only allowed envelope keys — any other (actor/sponsor/proposed/…) is rejected fail-closed: the
|
|
38
|
+
* WHO and the trust level come from the ingest CONTEXT (channel), never per-event (v2.3b-DESIGN.md §2). */
|
|
39
|
+
export const WORK_EVENT_ENVELOPE_KEYS = ['v', 'kind', 'payload'];
|
|
40
|
+
const str = (required, e) => e ? { type: 'string', required, enum: e } : { type: 'string', required };
|
|
41
|
+
const num = (required) => ({ type: 'number', required });
|
|
42
|
+
export const WORK_EVENT_SCHEMA = {
|
|
43
|
+
'item.create': {
|
|
44
|
+
method: 'createItem',
|
|
45
|
+
settles: 'never',
|
|
46
|
+
fields: {
|
|
47
|
+
kind: str(true, ITEM_KINDS),
|
|
48
|
+
title: str(true),
|
|
49
|
+
workspace: str(true),
|
|
50
|
+
parentId: str(false),
|
|
51
|
+
body: str(false),
|
|
52
|
+
sourceKey: str(false),
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
'item.spec': {
|
|
56
|
+
method: 'setSpec',
|
|
57
|
+
settles: 'never',
|
|
58
|
+
fields: { itemId: str(true), to: str(true, SPEC_TARGETS) },
|
|
59
|
+
},
|
|
60
|
+
'item.realize': {
|
|
61
|
+
method: 'setRealization',
|
|
62
|
+
settles: 'realize-terminal',
|
|
63
|
+
fields: { itemId: str(true), to: str(true, REALIZE_TARGETS) },
|
|
64
|
+
},
|
|
65
|
+
'decision.create': {
|
|
66
|
+
method: 'createDecision',
|
|
67
|
+
settles: 'never',
|
|
68
|
+
fields: {
|
|
69
|
+
decisionKind: str(true, DECISION_KINDS),
|
|
70
|
+
title: str(true),
|
|
71
|
+
workspace: str(true),
|
|
72
|
+
targets: { type: 'string[]', required: true },
|
|
73
|
+
dossier: { type: 'object', required: true },
|
|
74
|
+
parentId: str(false),
|
|
75
|
+
body: str(false),
|
|
76
|
+
sourceKey: str(false),
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
'decision.dossier': {
|
|
80
|
+
method: 'reviseDossier',
|
|
81
|
+
settles: 'never',
|
|
82
|
+
fields: { decisionId: str(true), dossier: { type: 'object', required: true } },
|
|
83
|
+
},
|
|
84
|
+
'decision.outcome': {
|
|
85
|
+
method: 'setOutcome',
|
|
86
|
+
settles: 'always',
|
|
87
|
+
fields: { decisionId: str(true), to: str(true, OUTCOMES) },
|
|
88
|
+
},
|
|
89
|
+
'decision.disposition': {
|
|
90
|
+
method: 'setDisposition',
|
|
91
|
+
settles: 'never',
|
|
92
|
+
fields: {
|
|
93
|
+
itemId: str(true),
|
|
94
|
+
gate: str(true, GATES),
|
|
95
|
+
disposition: str(true, DISPOSITIONS),
|
|
96
|
+
reason: str(false),
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
'acceptance.criterion': {
|
|
100
|
+
method: 'addCriterion',
|
|
101
|
+
settles: 'never',
|
|
102
|
+
fields: { itemId: str(true), statement: str(true) },
|
|
103
|
+
},
|
|
104
|
+
'acceptance.link': {
|
|
105
|
+
method: 'linkEvidence',
|
|
106
|
+
settles: 'never',
|
|
107
|
+
fields: { criterionId: str(true), kind: str(true, EVIDENCE_KINDS), locator: str(true) },
|
|
108
|
+
},
|
|
109
|
+
'acceptance.run': {
|
|
110
|
+
method: 'recordRun',
|
|
111
|
+
settles: 'evidence',
|
|
112
|
+
fields: {
|
|
113
|
+
evidenceId: str(true),
|
|
114
|
+
commit: str(true),
|
|
115
|
+
env: str(true),
|
|
116
|
+
runner: str(true),
|
|
117
|
+
result: str(true, RESULTS),
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
'acceptance.waive': {
|
|
121
|
+
method: 'waive',
|
|
122
|
+
settles: 'always',
|
|
123
|
+
fields: { criterionId: str(true), reason: str(true) },
|
|
124
|
+
},
|
|
125
|
+
'priority.assess': {
|
|
126
|
+
method: 'assessPriority',
|
|
127
|
+
settles: 'never',
|
|
128
|
+
fields: {
|
|
129
|
+
itemId: str(true),
|
|
130
|
+
userBusinessValue: num(true),
|
|
131
|
+
timeCriticality: num(true),
|
|
132
|
+
riskReductionOpportunityEnablement: num(true),
|
|
133
|
+
jobSize: num(true),
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
'blocker.raise': {
|
|
137
|
+
method: 'openBlocker',
|
|
138
|
+
settles: 'never',
|
|
139
|
+
fields: {
|
|
140
|
+
targetId: str(true),
|
|
141
|
+
kind: str(true, BLOCKER_KINDS),
|
|
142
|
+
ref: str(true),
|
|
143
|
+
reason: str(false),
|
|
144
|
+
resolutionRule: str(false, RESOLUTION_RULES),
|
|
145
|
+
owner: str(false),
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
'blocker.resolve': {
|
|
149
|
+
method: 'resolveBlocker',
|
|
150
|
+
settles: 'always',
|
|
151
|
+
fields: { blockerId: str(true) },
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/ingest/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ActorId, Provenance, Ulid } from '../events/types.js';
|
|
2
|
+
import type { EventStore } from '../events/store.js';
|
|
3
|
+
import type { WorkEvent, WorkEventKind } from './contract.js';
|
|
4
|
+
export interface IngestContext {
|
|
5
|
+
/** Actor recorded as `by`, fixed for the channel (CLI: cliActor; M3 HTTP: verified principal). */
|
|
6
|
+
by: ActorId;
|
|
7
|
+
/** The pinned workspace — containment is verified against folded state. */
|
|
8
|
+
workspace: string;
|
|
9
|
+
/** Provenance stamped on every write (its `auth` gates binding kinds). */
|
|
10
|
+
prov: Provenance;
|
|
11
|
+
/** Capability allowlist of permitted kinds; default = all. */
|
|
12
|
+
allowedKinds?: ReadonlySet<WorkEventKind>;
|
|
13
|
+
now?: () => string;
|
|
14
|
+
newId?: () => Ulid;
|
|
15
|
+
}
|
|
16
|
+
export interface IngestResult {
|
|
17
|
+
/** Assigned id per event (null for a non-creating kind), in input order. */
|
|
18
|
+
ids: Array<string | null>;
|
|
19
|
+
count: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Apply a WorkEvent stream to the store under channel authorization. Each event maps 1:1 to a Track
|
|
23
|
+
* command (its own locked, atomic append).
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ AT-LEAST-ONCE, NON-ATOMIC (M2b). The loop has no batch transaction: if event k throws
|
|
26
|
+
* (Ingest/DomainError), events 1..k-1 are already committed. And re-ingesting re-applies create kinds
|
|
27
|
+
* (no `sourceKey` dedup — only `importBranch` dedups), so a retry after a partial/timed-out batch
|
|
28
|
+
* DUPLICATES every already-applied create. Safe for a human running `track ingest` and reviewing the
|
|
29
|
+
* result; a RETRYING consumer (CI/harness) MUST dedup upstream. Do NOT wire an automated-retry M3
|
|
30
|
+
* channel onto this without first implementing idempotency (the reserved envelope key, or sourceKey-based
|
|
31
|
+
* create dedup).
|
|
32
|
+
*/
|
|
33
|
+
export declare function ingest(events: readonly WorkEvent[], ctx: IngestContext, store: EventStore): IngestResult;
|
|
34
|
+
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/ingest/ingest.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAG7D,MAAM,WAAW,aAAa;IAC5B,kGAAkG;IAClG,EAAE,EAAE,OAAO,CAAA;IACX,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAA;IACjB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,CAAA;IAChB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAA;IACzC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd;AAgKD;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY,CAcxG"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// Lot v2.3b-2 — apply a neutral WorkEvent stream through the Track facade, under channel-bound
|
|
2
|
+
// authorization. The WHO/trust come from the IngestContext (fixed when the channel opens), never the
|
|
3
|
+
// event. Two gates run before every apply, against FRESHLY FOLDED state:
|
|
4
|
+
// 1. workspace containment — the affected aggregate's workspace must equal ctx.workspace. For existing
|
|
5
|
+
// aggregates this is resolved from folded state (payload carries no workspace for them); a channel
|
|
6
|
+
// pinned to W can therefore never mutate workspace V. This is the load-bearing security property.
|
|
7
|
+
// 2. binding gate — a settling write (decision.outcome, waive, realize→done/cancelled, blocker.resolve,
|
|
8
|
+
// acceptance.run) is allowed only on an authenticated channel (auth ∈ {local-user, signed}); an
|
|
9
|
+
// unauthenticated channel may only create/prepare.
|
|
10
|
+
// State is re-folded each iteration, so an id created earlier in the same batch resolves to ctx.workspace.
|
|
11
|
+
import { Track } from '../track.js';
|
|
12
|
+
import { IngestError, mapWorkEvent } from './map.js';
|
|
13
|
+
// Allowlist (not `!== 'unauthenticated'`, which would admit any future enum value). `'signed'` is
|
|
14
|
+
// pre-listed so M3 adding it to Provenance['auth'] unlocks binding with no change here; today the only
|
|
15
|
+
// valid authenticated value is 'local-user'.
|
|
16
|
+
const BINDING_AUTH = new Set(['local-user', 'signed']);
|
|
17
|
+
/** Does this command settle state (⇒ requires an authenticated channel)? */
|
|
18
|
+
function isBinding(cmd) {
|
|
19
|
+
switch (cmd.settles) {
|
|
20
|
+
case 'never':
|
|
21
|
+
return false;
|
|
22
|
+
case 'always':
|
|
23
|
+
case 'evidence':
|
|
24
|
+
return true;
|
|
25
|
+
case 'realize-terminal': {
|
|
26
|
+
const to = cmd.payload['to'];
|
|
27
|
+
return to === 'done' || to === 'cancelled';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The workspace of the aggregate this command affects. `create` kinds carry it in the payload; all
|
|
33
|
+
* others address a pre-existing aggregate whose workspace is resolved from folded state (undefined if the
|
|
34
|
+
* aggregate does not exist — the Track method will then throw its own domain error, so no write happens).
|
|
35
|
+
*/
|
|
36
|
+
function resolveWorkspace(cmd, state) {
|
|
37
|
+
const p = cmd.payload;
|
|
38
|
+
const item = (id) => state.items.get(id)?.workspace;
|
|
39
|
+
switch (cmd.kind) {
|
|
40
|
+
case 'item.create':
|
|
41
|
+
case 'decision.create':
|
|
42
|
+
return { create: true, workspace: p['workspace'] };
|
|
43
|
+
case 'item.realize':
|
|
44
|
+
// setRealization resolves items ∪ decisions (a decision has a prep/realization axis); resolving
|
|
45
|
+
// only against items would leave a foreign-workspace DECISION reachable — a containment bypass.
|
|
46
|
+
return { create: false, workspace: item(p['itemId']) ?? state.decisions.get(p['itemId'])?.workspace };
|
|
47
|
+
case 'item.spec':
|
|
48
|
+
case 'acceptance.criterion':
|
|
49
|
+
case 'priority.assess':
|
|
50
|
+
case 'decision.disposition':
|
|
51
|
+
return { create: false, workspace: item(p['itemId']) };
|
|
52
|
+
case 'decision.outcome':
|
|
53
|
+
case 'decision.dossier':
|
|
54
|
+
return { create: false, workspace: state.decisions.get(p['decisionId'])?.workspace };
|
|
55
|
+
case 'acceptance.link':
|
|
56
|
+
case 'acceptance.waive': {
|
|
57
|
+
const crit = state.criteria.get(p['criterionId']);
|
|
58
|
+
return { create: false, workspace: crit ? item(crit.itemId) : undefined };
|
|
59
|
+
}
|
|
60
|
+
case 'acceptance.run': {
|
|
61
|
+
const ev = state.evidence.get(p['evidenceId']);
|
|
62
|
+
const crit = ev ? state.criteria.get(ev.criterionId) : undefined;
|
|
63
|
+
return { create: false, workspace: crit ? item(crit.itemId) : undefined };
|
|
64
|
+
}
|
|
65
|
+
case 'blocker.raise':
|
|
66
|
+
return { create: false, workspace: item(p['targetId']) };
|
|
67
|
+
case 'blocker.resolve': {
|
|
68
|
+
const b = state.blockers.get(p['blockerId']);
|
|
69
|
+
return { create: false, workspace: b ? item(b.targetId) : undefined };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Workspaces of the OTHER aggregates a command affects beyond its primary target. A decision opens a
|
|
75
|
+
* blocker on each of its targets (at create) and resolves/`rejected`-flips them (at outcome), so those
|
|
76
|
+
* target items are mutated too — each must be in the channel's workspace, or a W-pinned channel could
|
|
77
|
+
* reach a V-item by targeting it.
|
|
78
|
+
*/
|
|
79
|
+
function affectedTargetWorkspaces(cmd, state) {
|
|
80
|
+
const wsOf = (id) => state.items.get(id)?.workspace;
|
|
81
|
+
switch (cmd.kind) {
|
|
82
|
+
case 'decision.create':
|
|
83
|
+
return cmd.payload['targets'].map((t) => wsOf(t));
|
|
84
|
+
case 'decision.outcome': {
|
|
85
|
+
const dec = state.decisions.get(cmd.payload['decisionId']);
|
|
86
|
+
return dec ? dec.targets.map((t) => wsOf(t)) : [];
|
|
87
|
+
}
|
|
88
|
+
default:
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Channel authorization: capability allowlist, workspace containment, binding-trust. Throws IngestError. */
|
|
93
|
+
function authorize(cmd, ctx, state) {
|
|
94
|
+
if (ctx.allowedKinds && !ctx.allowedKinds.has(cmd.kind)) {
|
|
95
|
+
throw new IngestError(`kind "${cmd.kind}" is not permitted by this channel's capability`);
|
|
96
|
+
}
|
|
97
|
+
const ws = resolveWorkspace(cmd, state);
|
|
98
|
+
if (ws.create) {
|
|
99
|
+
if (ws.workspace !== ctx.workspace) {
|
|
100
|
+
throw new IngestError(`${cmd.kind}: payload.workspace "${String(ws.workspace)}" must equal the channel workspace "${ctx.workspace}"`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else if (ws.workspace !== undefined && ws.workspace !== ctx.workspace) {
|
|
104
|
+
throw new IngestError(`${cmd.kind}: target belongs to workspace "${ws.workspace}", not the channel workspace "${ctx.workspace}"`);
|
|
105
|
+
}
|
|
106
|
+
// Every additionally-affected target (a decision's targets) must also be contained.
|
|
107
|
+
for (const tw of affectedTargetWorkspaces(cmd, state)) {
|
|
108
|
+
if (tw !== undefined && tw !== ctx.workspace) {
|
|
109
|
+
throw new IngestError(`${cmd.kind}: affects an aggregate in workspace "${tw}", not the channel workspace "${ctx.workspace}"`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (isBinding(cmd) && !BINDING_AUTH.has(ctx.prov.auth)) {
|
|
113
|
+
throw new IngestError(`${cmd.kind} is a binding write and requires an authenticated channel (auth="${ctx.prov.auth}")`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Typed dispatch to the Track facade. Args were validated/normalized by `mapWorkEvent`. Returns an
|
|
117
|
+
* assigned id for the creating kinds, else undefined. */
|
|
118
|
+
function applyCommand(track, cmd) {
|
|
119
|
+
const a = cmd.args;
|
|
120
|
+
switch (cmd.kind) {
|
|
121
|
+
case 'item.create':
|
|
122
|
+
return track.createItem(a[0]);
|
|
123
|
+
case 'item.spec':
|
|
124
|
+
track.setSpec(a[0], a[1]);
|
|
125
|
+
return undefined;
|
|
126
|
+
case 'item.realize':
|
|
127
|
+
track.setRealization(a[0], a[1]);
|
|
128
|
+
return undefined;
|
|
129
|
+
case 'decision.create':
|
|
130
|
+
return track.createDecision(a[0]);
|
|
131
|
+
case 'decision.dossier':
|
|
132
|
+
track.reviseDossier(a[0], a[1]);
|
|
133
|
+
return undefined;
|
|
134
|
+
case 'decision.outcome':
|
|
135
|
+
track.setOutcome(a[0], a[1]);
|
|
136
|
+
return undefined;
|
|
137
|
+
case 'decision.disposition':
|
|
138
|
+
track.setDisposition(a[0], a[1], a[2], a[3]);
|
|
139
|
+
return undefined;
|
|
140
|
+
case 'acceptance.criterion':
|
|
141
|
+
return track.addCriterion(a[0], a[1]);
|
|
142
|
+
case 'acceptance.link':
|
|
143
|
+
return track.linkEvidence(a[0], a[1], a[2]);
|
|
144
|
+
case 'acceptance.run':
|
|
145
|
+
track.recordRun(a[0], a[1]);
|
|
146
|
+
return undefined;
|
|
147
|
+
case 'acceptance.waive':
|
|
148
|
+
track.waive(a[0], a[1]);
|
|
149
|
+
return undefined;
|
|
150
|
+
case 'priority.assess':
|
|
151
|
+
track.assessPriority(a[0], a[1]);
|
|
152
|
+
return undefined;
|
|
153
|
+
case 'blocker.raise':
|
|
154
|
+
return track.openBlocker(a[0]);
|
|
155
|
+
case 'blocker.resolve':
|
|
156
|
+
track.resolveBlocker(a[0]);
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Apply a WorkEvent stream to the store under channel authorization. Each event maps 1:1 to a Track
|
|
162
|
+
* command (its own locked, atomic append).
|
|
163
|
+
*
|
|
164
|
+
* ⚠️ AT-LEAST-ONCE, NON-ATOMIC (M2b). The loop has no batch transaction: if event k throws
|
|
165
|
+
* (Ingest/DomainError), events 1..k-1 are already committed. And re-ingesting re-applies create kinds
|
|
166
|
+
* (no `sourceKey` dedup — only `importBranch` dedups), so a retry after a partial/timed-out batch
|
|
167
|
+
* DUPLICATES every already-applied create. Safe for a human running `track ingest` and reviewing the
|
|
168
|
+
* result; a RETRYING consumer (CI/harness) MUST dedup upstream. Do NOT wire an automated-retry M3
|
|
169
|
+
* channel onto this without first implementing idempotency (the reserved envelope key, or sourceKey-based
|
|
170
|
+
* create dedup).
|
|
171
|
+
*/
|
|
172
|
+
export function ingest(events, ctx, store) {
|
|
173
|
+
const track = new Track(store, {
|
|
174
|
+
by: ctx.by,
|
|
175
|
+
prov: ctx.prov,
|
|
176
|
+
...(ctx.now !== undefined ? { now: ctx.now } : {}),
|
|
177
|
+
...(ctx.newId !== undefined ? { newId: ctx.newId } : {}),
|
|
178
|
+
});
|
|
179
|
+
const ids = [];
|
|
180
|
+
for (const ev of events) {
|
|
181
|
+
const cmd = mapWorkEvent(ev);
|
|
182
|
+
authorize(cmd, ctx, track.state()); // fresh fold each iteration (re-fold after each apply)
|
|
183
|
+
ids.push(applyCommand(track, cmd) ?? null);
|
|
184
|
+
}
|
|
185
|
+
return { ids, count: events.length };
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/ingest/ingest.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,qGAAqG;AACrG,yEAAyE;AACzE,yGAAyG;AACzG,wGAAwG;AACxG,uGAAuG;AACvG,0GAA0G;AAC1G,qGAAqG;AACrG,wDAAwD;AACxD,2GAA2G;AAW3G,OAAO,EAAE,KAAK,EAAyB,MAAM,aAAa,CAAA;AAE1D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAsB,MAAM,UAAU,CAAA;AAqBxE,kGAAkG;AAClG,uGAAuG;AACvG,6CAA6C;AAC7C,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAA;AAE3E,4EAA4E;AAC5E,SAAS,SAAS,CAAC,GAAkB;IACnC,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,KAAK,CAAA;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU;YACb,OAAO,IAAI,CAAA;QACb,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC5B,OAAO,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,WAAW,CAAA;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,GAAkB,EAAE,KAAY;IACxD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAA;IACrB,MAAM,IAAI,GAAG,CAAC,EAAW,EAAsB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAY,CAAC,EAAE,SAAS,CAAA;IAC1F,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC;QACnB,KAAK,iBAAiB;YACpB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,CAAW,EAAE,CAAA;QAC9D,KAAK,cAAc;YACjB,gGAAgG;YAChG,gGAAgG;YAChG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAW,CAAC,EAAE,SAAS,EAAE,CAAA;QACjH,KAAK,WAAW,CAAC;QACjB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,iBAAiB,CAAC;QACvB,KAAK,sBAAsB;YACzB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAA;QACxD,KAAK,kBAAkB,CAAC;QACxB,KAAK,kBAAkB;YACrB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAW,CAAC,EAAE,SAAS,EAAE,CAAA;QAChG,KAAK,iBAAiB,CAAC;QACvB,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAW,CAAC,CAAA;YAC3D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;QAC3E,CAAC;QACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAW,CAAC,CAAA;YACxD,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAChE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;QAC3E,CAAC;QACD,KAAK,eAAe;YAClB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAA;QAC1D,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAW,CAAC,CAAA;YACtD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,wBAAwB,CAAC,GAAkB,EAAE,KAAY;IAChE,MAAM,IAAI,GAAG,CAAC,EAAU,EAAsB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAA;IAC/E,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,iBAAiB;YACpB,OAAQ,GAAG,CAAC,OAAO,CAAC,SAAS,CAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAW,CAAC,CAAC,CAAA;QAC3E,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAW,CAAC,CAAA;YACpE,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACnD,CAAC;QACD;YACE,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED,6GAA6G;AAC7G,SAAS,SAAS,CAAC,GAAkB,EAAE,GAAkB,EAAE,KAAY;IACrE,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,WAAW,CAAC,SAAS,GAAG,CAAC,IAAI,iDAAiD,CAAC,CAAA;IAC3F,CAAC;IACD,MAAM,EAAE,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACvC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,WAAW,CACnB,GAAG,GAAG,CAAC,IAAI,wBAAwB,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,uCAAuC,GAAG,CAAC,SAAS,GAAG,CAC/G,CAAA;QACH,CAAC;IACH,CAAC;SAAM,IAAI,EAAE,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;QACxE,MAAM,IAAI,WAAW,CACnB,GAAG,GAAG,CAAC,IAAI,kCAAkC,EAAE,CAAC,SAAS,iCAAiC,GAAG,CAAC,SAAS,GAAG,CAC3G,CAAA;IACH,CAAC;IACD,oFAAoF;IACpF,KAAK,MAAM,EAAE,IAAI,wBAAwB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;YAC7C,MAAM,IAAI,WAAW,CAAC,GAAG,GAAG,CAAC,IAAI,wCAAwC,EAAE,iCAAiC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAA;QAC/H,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,WAAW,CACnB,GAAG,GAAG,CAAC,IAAI,oEAAoE,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CACjG,CAAA;IACH,CAAC;AACH,CAAC;AAED;0DAC0D;AAC1D,SAAS,YAAY,CAAC,KAAY,EAAE,GAAkB;IACpD,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAA;IAClB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAuB,CAAC,CAAA;QACrD,KAAK,WAAW;YACd,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAe,CAAC,CAAA;YACjD,OAAO,SAAS,CAAA;QAClB,KAAK,cAAc;YACjB,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAgB,CAAC,CAAA;YACzD,OAAO,SAAS,CAAA;QAClB,KAAK,iBAAiB;YACpB,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAA2B,CAAC,CAAA;QAC7D,KAAK,kBAAkB;YACrB,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAY,CAAC,CAAA;YACpD,OAAO,SAAS,CAAA;QAClB,KAAK,kBAAkB;YACrB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAY,CAAC,CAAA;YACjD,OAAO,SAAS,CAAA;QAClB,KAAK,sBAAsB;YACzB,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAS,EAAE,CAAC,CAAC,CAAC,CAAgB,EAAE,CAAC,CAAC,CAAC,CAAuB,CAAC,CAAA;YACnG,OAAO,SAAS,CAAA;QAClB,KAAK,sBAAsB;YACzB,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC,CAAA;QAC3D,KAAK,iBAAiB;YACpB,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAyC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC,CAAA;QACzG,KAAK,gBAAgB;YACnB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAuE,CAAC,CAAA;YAC3G,OAAO,SAAS,CAAA;QAClB,KAAK,kBAAkB;YACrB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC,CAAA;YAC3C,OAAO,SAAS,CAAA;QAClB,KAAK,iBAAiB;YACpB,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAe,CAAC,CAAA;YACxD,OAAO,SAAS,CAAA;QAClB,KAAK,eAAe;YAClB,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAqB,CAAC,CAAA;QACpD,KAAK,iBAAiB;YACpB,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAA;YACpC,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,MAAM,CAAC,MAA4B,EAAE,GAAkB,EAAE,KAAiB;IACxF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;QAC7B,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC,CAAA;IACF,MAAM,GAAG,GAAyB,EAAE,CAAA;IACpC,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;QAC5B,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA,CAAC,uDAAuD;QAC1F,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAA;IAC5C,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Settles, type WorkEvent, type WorkEventKind } from './contract.js';
|
|
2
|
+
/** A validated, normalized command ready for `ingest` to authorize and apply. */
|
|
3
|
+
export interface MappedCommand {
|
|
4
|
+
kind: WorkEventKind;
|
|
5
|
+
method: string;
|
|
6
|
+
settles: Settles;
|
|
7
|
+
/** The validated payload (only schema-allowed fields, correct types). */
|
|
8
|
+
payload: Readonly<Record<string, unknown>>;
|
|
9
|
+
/** Positional arguments to spread into the Track method. */
|
|
10
|
+
args: readonly unknown[];
|
|
11
|
+
}
|
|
12
|
+
/** A fail-closed rejection of a malformed/illegal WorkEvent (distinct from a domain error). */
|
|
13
|
+
export declare class IngestError extends Error {
|
|
14
|
+
readonly name = "IngestError";
|
|
15
|
+
}
|
|
16
|
+
/** Validate a WorkEvent and produce its mapped Track command. Pure; throws IngestError on any violation. */
|
|
17
|
+
export declare function mapWorkEvent(ev: WorkEvent): MappedCommand;
|
|
18
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/ingest/map.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,eAAe,CAAA;AAEtB,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,yEAAyE;IACzE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC1C,4DAA4D;IAC5D,IAAI,EAAE,SAAS,OAAO,EAAE,CAAA;CACzB;AAED,+FAA+F;AAC/F,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAkB,IAAI,iBAAgB;CACvC;AAgED,4GAA4G;AAC5G,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,aAAa,CAwEzD"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Lot v2.3b-1 — pure `WorkEvent` → Track-command mapper. Validates an envelope against the shared
|
|
2
|
+
// schema (fail-closed: unknown major / kind / field, missing required, wrong type, bad enum) and builds
|
|
3
|
+
// the positional argument tuple for the Track method. Pure and total: no I/O, no state, no append. The
|
|
4
|
+
// application + workspace/binding authorization (which need folded state) live in `ingest` (v2.3b-2).
|
|
5
|
+
import { WORK_EVENT_ENVELOPE_KEYS, WORK_EVENT_SCHEMA, } from './contract.js';
|
|
6
|
+
/** A fail-closed rejection of a malformed/illegal WorkEvent (distinct from a domain error). */
|
|
7
|
+
export class IngestError extends Error {
|
|
8
|
+
name = 'IngestError';
|
|
9
|
+
}
|
|
10
|
+
function isPlainObject(v) {
|
|
11
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
12
|
+
}
|
|
13
|
+
function checkType(kind, field, spec, v) {
|
|
14
|
+
const bad = (want) => {
|
|
15
|
+
throw new IngestError(`${kind}.${field}: expected ${want}`);
|
|
16
|
+
};
|
|
17
|
+
switch (spec.type) {
|
|
18
|
+
case 'string':
|
|
19
|
+
if (typeof v !== 'string')
|
|
20
|
+
bad('a string');
|
|
21
|
+
if (spec.enum && !spec.enum.includes(v)) {
|
|
22
|
+
throw new IngestError(`${kind}.${field}: must be one of ${spec.enum.join('|')} (got "${String(v)}")`);
|
|
23
|
+
}
|
|
24
|
+
return;
|
|
25
|
+
case 'number':
|
|
26
|
+
if (typeof v !== 'number' || !Number.isFinite(v))
|
|
27
|
+
bad('a finite number');
|
|
28
|
+
return;
|
|
29
|
+
case 'string[]':
|
|
30
|
+
if (!Array.isArray(v) || !v.every((x) => typeof x === 'string'))
|
|
31
|
+
bad('a string[]');
|
|
32
|
+
return;
|
|
33
|
+
case 'object':
|
|
34
|
+
if (!isPlainObject(v))
|
|
35
|
+
bad('an object');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Validate envelope + payload against the schema. Throws IngestError on any violation. */
|
|
40
|
+
function validate(ev) {
|
|
41
|
+
if (!isPlainObject(ev))
|
|
42
|
+
throw new IngestError('WorkEvent must be an object');
|
|
43
|
+
// Reject unknown envelope keys (fail-closed): no per-event actor/sponsor/proposed — the WHO/trust come
|
|
44
|
+
// from the channel context, not the event.
|
|
45
|
+
for (const key of Object.keys(ev)) {
|
|
46
|
+
if (!WORK_EVENT_ENVELOPE_KEYS.includes(key)) {
|
|
47
|
+
throw new IngestError(`unknown WorkEvent envelope key "${key}" (allowed: ${WORK_EVENT_ENVELOPE_KEYS.join(', ')})`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (ev.v !== 1) {
|
|
51
|
+
throw new IngestError(`unsupported WorkEvent contract major (expected v:1, got ${String(ev.v)})`);
|
|
52
|
+
}
|
|
53
|
+
const kind = ev.kind;
|
|
54
|
+
const schema = WORK_EVENT_SCHEMA[kind];
|
|
55
|
+
if (schema === undefined)
|
|
56
|
+
throw new IngestError(`unknown WorkEvent kind "${String(kind)}"`);
|
|
57
|
+
const payload = ev.payload;
|
|
58
|
+
if (!isPlainObject(payload))
|
|
59
|
+
throw new IngestError(`${kind}: payload must be an object`);
|
|
60
|
+
// Reject unknown fields (fail-closed — never silently forward).
|
|
61
|
+
for (const key of Object.keys(payload)) {
|
|
62
|
+
if (!(key in schema.fields))
|
|
63
|
+
throw new IngestError(`${kind}: unknown payload field "${key}"`);
|
|
64
|
+
}
|
|
65
|
+
// Required presence + type + enum.
|
|
66
|
+
for (const [field, spec] of Object.entries(schema.fields)) {
|
|
67
|
+
const v = payload[field];
|
|
68
|
+
if (v === undefined) {
|
|
69
|
+
if (spec.required)
|
|
70
|
+
throw new IngestError(`${kind}: missing required field "${field}"`);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
checkType(kind, field, spec, v);
|
|
74
|
+
}
|
|
75
|
+
return { kind, payload };
|
|
76
|
+
}
|
|
77
|
+
/** Validate a WorkEvent and produce its mapped Track command. Pure; throws IngestError on any violation. */
|
|
78
|
+
export function mapWorkEvent(ev) {
|
|
79
|
+
const { kind, payload: p } = validate(ev);
|
|
80
|
+
const { method, settles } = WORK_EVENT_SCHEMA[kind];
|
|
81
|
+
const opt = (k) => (p[k] !== undefined ? { [k]: p[k] } : {});
|
|
82
|
+
let args;
|
|
83
|
+
switch (kind) {
|
|
84
|
+
case 'item.create':
|
|
85
|
+
// createItem(ItemCreatedPayload) — validated payload already IS the (links-free) shape.
|
|
86
|
+
args = [{ ...p }];
|
|
87
|
+
break;
|
|
88
|
+
case 'item.spec':
|
|
89
|
+
args = [p['itemId'], p['to']];
|
|
90
|
+
break;
|
|
91
|
+
case 'item.realize':
|
|
92
|
+
args = [p['itemId'], p['to']];
|
|
93
|
+
break;
|
|
94
|
+
case 'decision.create':
|
|
95
|
+
args = [{ ...p }];
|
|
96
|
+
break;
|
|
97
|
+
case 'decision.dossier':
|
|
98
|
+
args = [p['decisionId'], p['dossier']];
|
|
99
|
+
break;
|
|
100
|
+
case 'decision.outcome':
|
|
101
|
+
args = [p['decisionId'], p['to']];
|
|
102
|
+
break;
|
|
103
|
+
case 'decision.disposition':
|
|
104
|
+
// setDisposition(itemId, gate, disposition, reason?) — pass reason as-is (undefined if absent).
|
|
105
|
+
args = [p['itemId'], p['gate'], p['disposition'], p['reason']];
|
|
106
|
+
break;
|
|
107
|
+
case 'acceptance.criterion':
|
|
108
|
+
args = [p['itemId'], p['statement']];
|
|
109
|
+
break;
|
|
110
|
+
case 'acceptance.link':
|
|
111
|
+
args = [p['criterionId'], p['kind'], p['locator']];
|
|
112
|
+
break;
|
|
113
|
+
case 'acceptance.run':
|
|
114
|
+
args = [p['evidenceId'], { commit: p['commit'], env: p['env'], runner: p['runner'], result: p['result'] }];
|
|
115
|
+
break;
|
|
116
|
+
case 'acceptance.waive':
|
|
117
|
+
args = [p['criterionId'], p['reason']];
|
|
118
|
+
break;
|
|
119
|
+
case 'priority.assess':
|
|
120
|
+
args = [
|
|
121
|
+
p['itemId'],
|
|
122
|
+
{
|
|
123
|
+
userBusinessValue: p['userBusinessValue'],
|
|
124
|
+
timeCriticality: p['timeCriticality'],
|
|
125
|
+
riskReductionOpportunityEnablement: p['riskReductionOpportunityEnablement'],
|
|
126
|
+
jobSize: p['jobSize'],
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
break;
|
|
130
|
+
case 'blocker.raise':
|
|
131
|
+
// openBlocker(OpenBlockerInput) — reason defaults to '' to match the CLI (`opt(reason) ?? ''`).
|
|
132
|
+
args = [
|
|
133
|
+
{
|
|
134
|
+
targetId: p['targetId'],
|
|
135
|
+
kind: p['kind'],
|
|
136
|
+
ref: p['ref'],
|
|
137
|
+
reason: p['reason'] ?? '',
|
|
138
|
+
...opt('resolutionRule'),
|
|
139
|
+
...opt('owner'),
|
|
140
|
+
},
|
|
141
|
+
];
|
|
142
|
+
break;
|
|
143
|
+
case 'blocker.resolve':
|
|
144
|
+
args = [p['blockerId']];
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
return { kind, method, settles, payload: p, args };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/ingest/map.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED