@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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAoBA,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;AA6ID,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,MAAM,CAwCxD"}
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
- const ITEM_KINDS = ['feature', 'bug', 'chore'];
40
- const SPEC_TARGETS = ['to-specify', 'specified'];
41
- const REALIZE_TARGETS = ['in-progress', 'done', 'cancelled'];
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
@@ -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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"AAcA,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;IAgEf;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;CAcrB"}
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"}
@@ -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
- const existing = this.readAll();
55
- const integrity = validate(existing, readHead(this.filePath));
56
- if (!integrity.ok) {
57
- const kinds = integrity.findings.map((f) => f.kind).join(', ');
58
- throw new Error(`EventStore.appendCommand: refusing to extend an invalid log ` +
59
- `(${integrity.findings.length} finding(s): ${kinds})`);
60
- }
61
- let prevHash = existing.length > 0 ? existing[existing.length - 1].contentHash : null;
62
- // Next per-aggregate seq = max(seq) + 1, aligned with validate's authority.
63
- const lastSeqByAggregate = new Map();
64
- for (const e of existing) {
65
- lastSeqByAggregate.set(e.aggregateId, e.seq);
66
- }
67
- const events = [];
68
- inputs.forEach((input, i) => {
69
- const seq = (lastSeqByAggregate.get(input.aggregateId) ?? 0) + 1;
70
- lastSeqByAggregate.set(input.aggregateId, seq);
71
- const core = isBatch
72
- ? { ...input, cmdId: opts.cmdId, cmd: { i, n } }
73
- : { ...input };
74
- // Materialize ONCE to an inert plain-data snapshot, then hash AND persist that same
75
- // snapshot so a live payload (Proxy / getter / toJSON) cannot diverge between the two.
76
- const materialized = materialize(core);
77
- const contentHash = contentHashOf(materialized);
78
- const event = { ...materialized, seq, prevHash, contentHash };
79
- events.push(event);
80
- prevHash = contentHash;
81
- });
82
- // Validate the FULL candidate stream (not just the existing prefix): the command itself
83
- // could introduce a cross-event violation (e.g. an aggregate-mismatch, a malformed batch).
84
- const candidate = validate([...existing, ...events]);
85
- if (!candidate.ok) {
86
- const kinds = candidate.findings.map((f) => f.kind).join(', ');
87
- throw new Error(`EventStore.appendCommand: command would produce an invalid log ` +
88
- `(${candidate.findings.length} finding(s): ${kinds})`);
89
- }
90
- this.appendAtomic(events);
91
- writeHead(this.filePath, {
92
- streamLength: existing.length + events.length,
93
- lastContentHash: events[events.length - 1].contentHash,
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`
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"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"}
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":"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"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/track",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Typed product-backlog and spec/plan/UAT system of record for the sentropic ecosystem (record-only MVP).",
5
5
  "license": "MIT",
6
6
  "author": "Fabien Antoine",