@sentropic/track 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/cli/bin.js +6 -2
  2. package/dist/cli/bin.js.map +1 -1
  3. package/dist/cli/index.d.ts +1 -1
  4. package/dist/cli/index.d.ts.map +1 -1
  5. package/dist/cli/index.js +108 -0
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/events/store.d.ts +11 -0
  8. package/dist/events/store.d.ts.map +1 -1
  9. package/dist/events/store.js +7 -0
  10. package/dist/events/store.js.map +1 -1
  11. package/dist/events/types.d.ts +2 -2
  12. package/dist/events/types.d.ts.map +1 -1
  13. package/dist/events/types.js +15 -1
  14. package/dist/events/types.js.map +1 -1
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +3 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/ingest/contract.d.ts +4 -2
  20. package/dist/ingest/contract.d.ts.map +1 -1
  21. package/dist/ingest/contract.js +82 -1
  22. package/dist/ingest/contract.js.map +1 -1
  23. package/dist/ingest/ingest.d.ts.map +1 -1
  24. package/dist/ingest/ingest.js +40 -0
  25. package/dist/ingest/ingest.js.map +1 -1
  26. package/dist/ingest/map.d.ts.map +1 -1
  27. package/dist/ingest/map.js +29 -0
  28. package/dist/ingest/map.js.map +1 -1
  29. package/dist/lease/index.d.ts +2 -0
  30. package/dist/lease/index.d.ts.map +1 -0
  31. package/dist/lease/index.js +5 -0
  32. package/dist/lease/index.js.map +1 -0
  33. package/dist/lease/store.d.ts +91 -0
  34. package/dist/lease/store.d.ts.map +1 -0
  35. package/dist/lease/store.js +168 -0
  36. package/dist/lease/store.js.map +1 -0
  37. package/dist/model/demand.d.ts +70 -0
  38. package/dist/model/demand.d.ts.map +1 -0
  39. package/dist/model/demand.js +131 -0
  40. package/dist/model/demand.js.map +1 -0
  41. package/dist/model/index.d.ts +2 -0
  42. package/dist/model/index.d.ts.map +1 -1
  43. package/dist/model/index.js +3 -0
  44. package/dist/model/index.js.map +1 -1
  45. package/dist/model/item.d.ts +24 -1
  46. package/dist/model/item.d.ts.map +1 -1
  47. package/dist/model/item.js.map +1 -1
  48. package/dist/read/contract.d.ts +119 -5
  49. package/dist/read/contract.d.ts.map +1 -1
  50. package/dist/read/contract.js +195 -1
  51. package/dist/read/contract.js.map +1 -1
  52. package/dist/read/index.d.ts +4 -1
  53. package/dist/read/index.d.ts.map +1 -1
  54. package/dist/read/index.js +10 -0
  55. package/dist/read/index.js.map +1 -1
  56. package/dist/state/fold.d.ts +9 -0
  57. package/dist/state/fold.d.ts.map +1 -1
  58. package/dist/state/fold.js +60 -0
  59. package/dist/state/fold.js.map +1 -1
  60. package/dist/state/snapshot.d.ts +2 -0
  61. package/dist/state/snapshot.d.ts.map +1 -1
  62. package/dist/state/snapshot.js +2 -0
  63. package/dist/state/snapshot.js.map +1 -1
  64. package/dist/track.d.ts +140 -1
  65. package/dist/track.d.ts.map +1 -1
  66. package/dist/track.js +275 -2
  67. package/dist/track.js.map +1 -1
  68. package/package.json +5 -1
@@ -0,0 +1,168 @@
1
+ // Demand lifecycle (Mode A) — the EPHEMERAL lease side-store (DESIGN demand-lifecycle-modeA §Lease).
2
+ //
3
+ // A `Lease` is an ADVISORY, mutable claim on a subject (a demand or an item) by a handler. It is NOT a
4
+ // durable fact: it lives in `.track/leases.json` (a mutable, gitignored side-store — NOT the append-only
5
+ // event log; heartbeats must never be events). It NEVER gates an event append (Build 1's appends stand
6
+ // alone); it only records WHO is currently handling a subject so reads can surface a `currentHandler`.
7
+ //
8
+ // One ACTIVE lease per subject. Steal-safety mirrors `withFileLock`'s generation discipline: each
9
+ // acquisition mints a fresh, unguessable `token`; only the holder presenting the matching token may
10
+ // heartbeat or release (a wrong token is rejected). The store is serialized under its OWN file-lock
11
+ // (reuse `withFileLock` on the leases path) so two processes never corrupt the JSON.
12
+ //
13
+ // ABANDONMENT IS CLOCKLESS, COMPUTED BY THE READER (the caller injects `now`): a lease is abandoned iff
14
+ // `now − heartbeatAt > ttlMs`. The store itself holds NO clock for abandonment decisions — it only stamps
15
+ // `acquiredAt`/`heartbeatAt`/`expiresAt` from the caller-injected clock at write time (so tests are
16
+ // deterministic and the store stays pure/host-portable, like the rest of track).
17
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
18
+ import { randomBytes } from 'node:crypto';
19
+ import { dirname, join } from 'node:path';
20
+ import { withFileLock } from '../events/lock.js';
21
+ import { DomainError } from '../model/item.js';
22
+ /** Default lease TTL (owner-tunable). 30 min — long enough for a real spec/qualify attempt, short enough
23
+ * that a dead agent's claim frees the subject within one working bout (DESIGN §Owner micro-decisions). */
24
+ export const DEFAULT_LEASE_TTL_MS = 30 * 60_000; // 30 minutes
25
+ /** Stable per-subject key (kind + id) — one ACTIVE lease per subject is keyed on this. */
26
+ function subjectKey(subject) {
27
+ return `${subject.kind}:${subject.id}`;
28
+ }
29
+ /**
30
+ * Is `lease` abandoned at `now`? PURE/CLOCKLESS: the caller injects `now`; abandoned iff
31
+ * `now − heartbeatAt > ttlMs`. The single abandonment predicate — reused by the store's acquire guard
32
+ * (a stale lease does NOT block a fresh acquire) AND by the reader's `leaseState`/stalled projection.
33
+ */
34
+ export function isLeaseAbandoned(lease, now) {
35
+ return Date.parse(now) - Date.parse(lease.heartbeatAt) > lease.ttlMs;
36
+ }
37
+ /**
38
+ * The ephemeral lease side-store. Reads/writes `.track/leases.json` under `withFileLock` (its OWN lock,
39
+ * never the event-log lock — the two are independent). `now`/`newId` are injectable (deterministic tests;
40
+ * the store stamps `acquiredAt`/`heartbeatAt`/`expiresAt` from the injected clock, but holds NO clock for
41
+ * abandonment — that is the reader's call).
42
+ */
43
+ export class LeaseStore {
44
+ leasesPath;
45
+ clock;
46
+ newId;
47
+ constructor(leasesPath, opts = {}) {
48
+ this.leasesPath = leasesPath;
49
+ this.clock = opts.now ?? (() => new Date().toISOString());
50
+ this.newId = opts.newId ?? (() => randomBytes(12).toString('hex'));
51
+ }
52
+ /** Read all leases (every recorded lease, abandoned or live — the reader decides liveness vs `now`). */
53
+ readAll() {
54
+ return readLeasesFile(this.leasesPath);
55
+ }
56
+ /** The lease (if any) currently RECORDED for a subject (live OR abandoned — caller decides vs `now`). */
57
+ forSubject(subject) {
58
+ const key = subjectKey(subject);
59
+ return this.readAll().find((l) => subjectKey(l.subject) === key);
60
+ }
61
+ /**
62
+ * Acquire a lease on a subject. Rejects (DomainError) if a LIVE lease already covers it — one active
63
+ * lease per subject. An ABANDONED prior lease (per `now − heartbeatAt > ttlMs`) does NOT block: the new
64
+ * acquisition replaces it (steal-safe — the new holder mints a FRESH token, so the dead holder's stale
65
+ * token can never heartbeat/release the new lease). Mints `leaseId` + a fresh `token`. Returns the lease.
66
+ */
67
+ acquire(input) {
68
+ return withFileLock(this.leasesPath, () => {
69
+ const all = readLeasesFile(this.leasesPath);
70
+ const key = subjectKey(input.subject);
71
+ const now = this.clock();
72
+ const existing = all.find((l) => subjectKey(l.subject) === key);
73
+ if (existing !== undefined && !isLeaseAbandoned(existing, now)) {
74
+ throw new DomainError(`lease: subject ${key} is already held by ${existing.holder} (one active lease per subject)`);
75
+ }
76
+ const ttlMs = input.ttlMs ?? DEFAULT_LEASE_TTL_MS;
77
+ const lease = {
78
+ leaseId: this.newId(),
79
+ workspace: input.workspace,
80
+ subject: input.subject,
81
+ phase: input.phase,
82
+ holder: input.holder,
83
+ acquiredAt: now,
84
+ heartbeatAt: now,
85
+ expiresAt: new Date(Date.parse(now) + ttlMs).toISOString(),
86
+ ttlMs,
87
+ token: this.newId(),
88
+ ...(input.eventHeadAtAcquire !== undefined ? { eventHeadAtAcquire: input.eventHeadAtAcquire } : {}),
89
+ };
90
+ // Replace any prior (abandoned) lease for this subject; keep all OTHER subjects' leases.
91
+ const next = all.filter((l) => subjectKey(l.subject) !== key);
92
+ next.push(lease);
93
+ writeLeasesFile(this.leasesPath, next);
94
+ return lease;
95
+ });
96
+ }
97
+ /**
98
+ * Heartbeat (renew) a lease — ONLY the holder may, and ONLY with the matching `token` (steal-safe). The
99
+ * token must match the recorded acquisition; a wrong/stale token is rejected (DomainError). Renews
100
+ * `heartbeatAt` (and re-derives `expiresAt`) from the injected clock; the reader's abandonment window
101
+ * resets. Rejects if no lease is recorded for the subject. Returns the renewed lease.
102
+ */
103
+ heartbeat(input) {
104
+ return withFileLock(this.leasesPath, () => {
105
+ const all = readLeasesFile(this.leasesPath);
106
+ const key = subjectKey(input.subject);
107
+ const idx = all.findIndex((l) => subjectKey(l.subject) === key);
108
+ if (idx === -1)
109
+ throw new DomainError(`lease: no lease to heartbeat for subject ${key}`);
110
+ const lease = all[idx];
111
+ if (lease.token !== input.token) {
112
+ throw new DomainError(`lease: heartbeat token mismatch for subject ${key} — only the holder may renew`);
113
+ }
114
+ const now = this.clock();
115
+ const renewed = {
116
+ ...lease,
117
+ heartbeatAt: now,
118
+ expiresAt: new Date(Date.parse(now) + lease.ttlMs).toISOString(),
119
+ };
120
+ all[idx] = renewed;
121
+ writeLeasesFile(this.leasesPath, all);
122
+ return renewed;
123
+ });
124
+ }
125
+ /**
126
+ * Release a lease — ONLY the holder may, and ONLY with the matching `token` (steal-safe). The token must
127
+ * match; a wrong/stale token is rejected (DomainError). Removes the lease entirely (the subject is now
128
+ * unheld). Rejects if no lease is recorded for the subject.
129
+ */
130
+ release(input) {
131
+ withFileLock(this.leasesPath, () => {
132
+ const all = readLeasesFile(this.leasesPath);
133
+ const key = subjectKey(input.subject);
134
+ const idx = all.findIndex((l) => subjectKey(l.subject) === key);
135
+ if (idx === -1)
136
+ throw new DomainError(`lease: no lease to release for subject ${key}`);
137
+ if (all[idx].token !== input.token) {
138
+ throw new DomainError(`lease: release token mismatch for subject ${key} — only the holder may release`);
139
+ }
140
+ all.splice(idx, 1);
141
+ writeLeasesFile(this.leasesPath, all);
142
+ });
143
+ }
144
+ }
145
+ /** Resolve the leases side-store path that sits beside an `events.jsonl` (`.track/leases.json`). */
146
+ export function leasesPathFor(eventsPath) {
147
+ return join(dirname(eventsPath), 'leases.json');
148
+ }
149
+ /** Read + parse the leases file. A missing/empty/torn file fails CLOSED to `[]` (no leases ⇒ no holder). */
150
+ function readLeasesFile(leasesPath) {
151
+ if (!existsSync(leasesPath))
152
+ return [];
153
+ try {
154
+ const raw = readFileSync(leasesPath, 'utf8').trim();
155
+ if (raw === '')
156
+ return [];
157
+ const parsed = JSON.parse(raw);
158
+ return Array.isArray(parsed) ? parsed : [];
159
+ }
160
+ catch {
161
+ return []; // a torn/garbled side-store is advisory-only — degrade to "no leases", never throw a read
162
+ }
163
+ }
164
+ /** Serialize the leases file (pretty for human/audit grep; the side-store is small + mutable). */
165
+ function writeLeasesFile(leasesPath, leases) {
166
+ writeFileSync(leasesPath, `${JSON.stringify(leases, null, 2)}\n`);
167
+ }
168
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/lease/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { type ItemId, type Link } from './item.js';
2
+ import type { ActorId, Ulid } from '../events/types.js';
3
+ export type DemandId = Ulid;
4
+ export type DemandType = 'feature' | 'defect' | 'chore';
5
+ export type DemandStatus = 'raised' | 'qualifying' | 'agreed' | 'rejected' | 'duplicate' | 'parked';
6
+ /** The t=0 capture of a demand — immutable raw input (DESIGN §D1). */
7
+ export interface DemandRaw {
8
+ text: string;
9
+ title?: string;
10
+ format?: 'plain' | 'markdown';
11
+ }
12
+ /** WHO/WHAT raised the demand — recorded immutably on `demand.raised` (DESIGN §D1). */
13
+ export interface DemandSource {
14
+ kind: 'human' | 'agent' | 'h2a' | 'import' | 'external';
15
+ actor?: ActorId;
16
+ ref?: string;
17
+ locator?: string;
18
+ }
19
+ /** A back-reference to a survivor (a `duplicate` demand points at the demand/item it duplicates). */
20
+ export interface DemandRef {
21
+ kind: 'demand' | 'item';
22
+ id: string;
23
+ }
24
+ export interface DemandState {
25
+ id: DemandId;
26
+ workspace: string;
27
+ type: DemandType;
28
+ raw: DemandRaw;
29
+ source: DemandSource;
30
+ status: DemandStatus;
31
+ itemIds?: ItemId[];
32
+ duplicateOf?: DemandRef;
33
+ rejectReason?: string;
34
+ parkReason?: string;
35
+ concerns?: {
36
+ kind: 'item';
37
+ id: ItemId;
38
+ };
39
+ sourceKey?: string;
40
+ links?: Link[];
41
+ }
42
+ export declare const DEMAND_TRANSITIONS: Record<DemandStatus, ReadonlyArray<DemandStatus>>;
43
+ export declare function assertDemandTransition(current: DemandStatus, to: DemandStatus): void;
44
+ /** A demand status from which no further lifecycle transition is legal (agreed/rejected/duplicate). */
45
+ export declare function isDemandTerminal(status: DemandStatus): boolean;
46
+ /** The off-ramp outcomes a `demand.disposition` may record (a subset of DemandStatus). */
47
+ export type DispositionOutcome = 'rejected' | 'duplicate' | 'parked';
48
+ /** Fail-closed: a disposition outcome must be rejected|duplicate|parked (NOT agreed — agree is its own command). */
49
+ export declare function assertDispositionOutcome(outcome: unknown): DispositionOutcome;
50
+ /** The `demand.raise` → `demand.raised` payload — the immutable t=0 capture + the handler. */
51
+ export interface DemandRaisedPayload {
52
+ type: DemandType;
53
+ raw: DemandRaw;
54
+ source: DemandSource;
55
+ handler: ActorId;
56
+ sourceKey?: string;
57
+ concerns?: {
58
+ kind: 'item';
59
+ id: ItemId;
60
+ };
61
+ links?: Link[];
62
+ }
63
+ /**
64
+ * Fail-closed validation + normalization of a `DemandRaisedPayload` (mirrors `assertDossierArtifact` /
65
+ * `assertSpecAmend`). Requires `type`/`raw.text`/`source.kind`/`handler`; drops absent optionals so the
66
+ * recorded shape is minimal + hash-stable (canonicalize drops undefined ⇒ the additive invariant). The
67
+ * `handler` (who is handling — the h2a instance id) is MANDATORY: every lifecycle step names its handler.
68
+ */
69
+ export declare function assertDemandRaised(input: unknown): DemandRaisedPayload;
70
+ //# sourceMappingURL=demand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demand.d.ts","sourceRoot":"","sources":["../../src/model/demand.ts"],"names":[],"mappings":"AAUA,OAAO,EAAe,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAA;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAEvD,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAA;AAC3B,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AACvD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAA;AAEnG,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;CAC9B;AAED,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAA;IACvD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qGAAqG;AACrG,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAA;IACvB,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,QAAQ,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,SAAS,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CACf;AAQD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,CAOhF,CAAA;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,GAAG,IAAI,CAIpF;AAED,uGAAuG;AACvG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE9D;AAED,0FAA0F;AAC1F,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAA;AAGpE,oHAAoH;AACpH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,kBAAkB,CAO7E;AAMD,8FAA8F;AAC9F,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,SAAS,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CACf;AAoDD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CA6BtE"}
@@ -0,0 +1,131 @@
1
+ // Demand lifecycle (Mode A) — the `demand` aggregate model (DESIGN demand-lifecycle-modeA §D1).
2
+ //
3
+ // A `demand` is a new first-class aggregate that tracks work from `raised` (issue) through `agreed`,
4
+ // where it PROMOTES into one or more `item`s. The backlog stays honest (only agreed work is an item);
5
+ // rejected/duplicate/parked demands never pollute item reads. Mirrors the `decision`-aggregate pattern.
6
+ //
7
+ // ADDITIVE to the FROZEN event contract: every new payload field is drop-when-absent (canonicalize drops
8
+ // undefined), so old logs replay byte-identical. The lifecycle machine here mirrors OUTCOME_TRANSITIONS /
9
+ // REALIZATION_TRANSITIONS — legality is checked AT APPEND in the facade; the fold stays pure.
10
+ import { DomainError } from './item.js';
11
+ // Lifecycle machine (DESIGN state machine §):
12
+ // none ─► raised ─► qualifying ─► agreed (terminal on the demand axis = the PIVOT)
13
+ // ├─► rejected (terminal)
14
+ // ├─► duplicate (terminal → survivor)
15
+ // └─► parked ─► qualifying (re-entrant)
16
+ // `raised → qualifying` is mandatory before any off-ramp (every outcome is attributable to a handler).
17
+ export const DEMAND_TRANSITIONS = {
18
+ raised: ['qualifying'],
19
+ qualifying: ['agreed', 'rejected', 'duplicate', 'parked'],
20
+ agreed: [],
21
+ rejected: [],
22
+ duplicate: [],
23
+ parked: ['qualifying'],
24
+ };
25
+ export function assertDemandTransition(current, to) {
26
+ if (!DEMAND_TRANSITIONS[current].includes(to)) {
27
+ throw new DomainError(`illegal demand transition ${current} -> ${to}`);
28
+ }
29
+ }
30
+ /** A demand status from which no further lifecycle transition is legal (agreed/rejected/duplicate). */
31
+ export function isDemandTerminal(status) {
32
+ return DEMAND_TRANSITIONS[status].length === 0;
33
+ }
34
+ const DISPOSITION_OUTCOMES = ['rejected', 'duplicate', 'parked'];
35
+ /** Fail-closed: a disposition outcome must be rejected|duplicate|parked (NOT agreed — agree is its own command). */
36
+ export function assertDispositionOutcome(outcome) {
37
+ if (typeof outcome !== 'string' || !DISPOSITION_OUTCOMES.includes(outcome)) {
38
+ throw new DomainError(`demand.disposition: outcome must be one of ${DISPOSITION_OUTCOMES.join('|')} (got "${String(outcome)}")`);
39
+ }
40
+ return outcome;
41
+ }
42
+ const nonEmptyString = (v) => typeof v === 'string' && v.length > 0;
43
+ const DEMAND_TYPES = ['feature', 'defect', 'chore'];
44
+ const SOURCE_KINDS = ['human', 'agent', 'h2a', 'import', 'external'];
45
+ function assertRaw(input) {
46
+ if (typeof input !== 'object' || input === null || Array.isArray(input)) {
47
+ throw new DomainError('demand.raise: raw must be an object');
48
+ }
49
+ const r = input;
50
+ if (!nonEmptyString(r['text']))
51
+ throw new DomainError('demand.raise: raw.text is required (the t=0 capture)');
52
+ if (r['title'] !== undefined && typeof r['title'] !== 'string') {
53
+ throw new DomainError('demand.raise: raw.title must be a string');
54
+ }
55
+ if (r['format'] !== undefined && r['format'] !== 'plain' && r['format'] !== 'markdown') {
56
+ throw new DomainError('demand.raise: raw.format must be "plain" or "markdown"');
57
+ }
58
+ return {
59
+ text: r['text'],
60
+ ...(r['title'] !== undefined ? { title: r['title'] } : {}),
61
+ ...(r['format'] !== undefined ? { format: r['format'] } : {}),
62
+ };
63
+ }
64
+ function assertSource(input) {
65
+ if (typeof input !== 'object' || input === null || Array.isArray(input)) {
66
+ throw new DomainError('demand.raise: source must be an object');
67
+ }
68
+ const s = input;
69
+ if (!SOURCE_KINDS.includes(s['kind'])) {
70
+ throw new DomainError(`demand.raise: source.kind must be one of ${SOURCE_KINDS.join('|')} (got "${String(s['kind'])}")`);
71
+ }
72
+ for (const key of ['actor', 'ref', 'locator']) {
73
+ if (s[key] !== undefined && typeof s[key] !== 'string') {
74
+ throw new DomainError(`demand.raise: source.${key} must be a string`);
75
+ }
76
+ }
77
+ return {
78
+ kind: s['kind'],
79
+ ...(s['actor'] !== undefined ? { actor: s['actor'] } : {}),
80
+ ...(s['ref'] !== undefined ? { ref: s['ref'] } : {}),
81
+ ...(s['locator'] !== undefined ? { locator: s['locator'] } : {}),
82
+ };
83
+ }
84
+ function assertConcerns(input) {
85
+ if (typeof input !== 'object' || input === null || Array.isArray(input)) {
86
+ throw new DomainError('demand.raise: concerns must be an object');
87
+ }
88
+ const c = input;
89
+ if (c['kind'] !== 'item')
90
+ throw new DomainError('demand.raise: concerns.kind must be "item"');
91
+ if (!nonEmptyString(c['id']))
92
+ throw new DomainError('demand.raise: concerns.id is required');
93
+ return { kind: 'item', id: c['id'] };
94
+ }
95
+ /**
96
+ * Fail-closed validation + normalization of a `DemandRaisedPayload` (mirrors `assertDossierArtifact` /
97
+ * `assertSpecAmend`). Requires `type`/`raw.text`/`source.kind`/`handler`; drops absent optionals so the
98
+ * recorded shape is minimal + hash-stable (canonicalize drops undefined ⇒ the additive invariant). The
99
+ * `handler` (who is handling — the h2a instance id) is MANDATORY: every lifecycle step names its handler.
100
+ */
101
+ export function assertDemandRaised(input) {
102
+ if (typeof input !== 'object' || input === null || Array.isArray(input)) {
103
+ throw new DomainError('demand.raise: a demand must be an object');
104
+ }
105
+ const a = input;
106
+ if (!DEMAND_TYPES.includes(a['type'])) {
107
+ throw new DomainError(`demand.raise: type must be one of ${DEMAND_TYPES.join('|')} (got "${String(a['type'])}")`);
108
+ }
109
+ if (!nonEmptyString(a['handler'])) {
110
+ throw new DomainError('demand.raise: a handler is required (who is handling must be logged on every step)');
111
+ }
112
+ const raw = assertRaw(a['raw']);
113
+ const source = assertSource(a['source']);
114
+ if (a['sourceKey'] !== undefined && typeof a['sourceKey'] !== 'string') {
115
+ throw new DomainError('demand.raise: sourceKey must be a string');
116
+ }
117
+ const concerns = a['concerns'] !== undefined ? assertConcerns(a['concerns']) : undefined;
118
+ if (a['links'] !== undefined && !Array.isArray(a['links'])) {
119
+ throw new DomainError('demand.raise: links must be an array');
120
+ }
121
+ return {
122
+ type: a['type'],
123
+ raw,
124
+ source,
125
+ handler: a['handler'],
126
+ ...(a['sourceKey'] !== undefined ? { sourceKey: a['sourceKey'] } : {}),
127
+ ...(concerns !== undefined ? { concerns } : {}),
128
+ ...(a['links'] !== undefined ? { links: a['links'] } : {}),
129
+ };
130
+ }
131
+ //# sourceMappingURL=demand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demand.js","sourceRoot":"","sources":["../../src/model/demand.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,6 @@ export { type AcceptanceStatus, type CriterionState, type CriterionStatus, type
5
5
  export { WSJF_SCHEME_VERSION, wsjfScore, type PriorityAssessment, type SchemeId, type WsjfInputs, } from './priority.js';
6
6
  export { assertVerificationRun, VERDICTS, type VerificationRecordedPayload, type VerificationRun, type Verdict, } from './verification.js';
7
7
  export { assertSpecAmend, type JsonPatch, type JsonPatchOp, type SpecAmendment, type SpecAmendPayload, } from './spec-amend.js';
8
+ export { assertDemandRaised, assertDemandTransition, assertDispositionOutcome, DEMAND_TRANSITIONS, isDemandTerminal, type DemandId, type DemandRaisedPayload, type DemandRaw, type DemandRef, type DemandSource, type DemandState, type DemandStatus, type DemandType, type DispositionOutcome, } from './demand.js';
9
+ export { type TransitionHandlerFields } from './item.js';
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,kBAAkB,EACvB,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,SAAS,EACT,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,OAAO,GACb,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,MAAM,GACZ,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,UAAU,GAChB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,qBAAqB,EACrB,QAAQ,EACR,KAAK,2BAA2B,EAChC,KAAK,eAAe,EACpB,KAAK,OAAO,GACb,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,eAAe,EACf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,kBAAkB,EACvB,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,SAAS,EACT,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,OAAO,GACb,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,MAAM,GACZ,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,UAAU,GAChB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,qBAAqB,EACrB,QAAQ,EACR,KAAK,2BAA2B,EAChC,KAAK,eAAe,EACpB,KAAK,OAAO,GACb,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,eAAe,EACf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,WAAW,CAAA"}
@@ -8,4 +8,7 @@ export { WSJF_SCHEME_VERSION, wsjfScore, } from './priority.js';
8
8
  export { assertVerificationRun, VERDICTS, } from './verification.js';
9
9
  // M5 (canevas) — the live spec-amendment write kind (item.spec-amend → spec.amended).
10
10
  export { assertSpecAmend, } from './spec-amend.js';
11
+ // Demand lifecycle (Mode A) — the `demand` aggregate model + its lifecycle machine.
12
+ export { assertDemandRaised, assertDemandTransition, assertDispositionOutcome, DEMAND_TRANSITIONS, isDemandTerminal, } from './demand.js';
13
+ export {} from './item.js';
11
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,eAAe,GAchB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,mBAAmB,GAMpB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,SAAS,GAWV,MAAM,eAAe,CAAA;AACtB,OAAO,EASN,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mBAAmB,EACnB,SAAS,GAIV,MAAM,eAAe,CAAA;AACtB,2EAA2E;AAC3E,OAAO,EACL,qBAAqB,EACrB,QAAQ,GAIT,MAAM,mBAAmB,CAAA;AAC1B,sFAAsF;AACtF,OAAO,EACL,eAAe,GAKhB,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,eAAe,GAchB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,mBAAmB,GAMpB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,SAAS,GAWV,MAAM,eAAe,CAAA;AACtB,OAAO,EASN,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mBAAmB,EACnB,SAAS,GAIV,MAAM,eAAe,CAAA;AACtB,2EAA2E;AAC3E,OAAO,EACL,qBAAqB,EACrB,QAAQ,GAIT,MAAM,mBAAmB,CAAA;AAC1B,sFAAsF;AACtF,OAAO,EACL,eAAe,GAKhB,MAAM,iBAAiB,CAAA;AACxB,oFAAoF;AACpF,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,GAUjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAgC,MAAM,WAAW,CAAA"}
@@ -2,7 +2,7 @@ import type { ActorId, Ulid } from '../events/types.js';
2
2
  import type { PriorityAssessment } from './priority.js';
3
3
  export type ItemId = Ulid;
4
4
  export type BlockerId = Ulid;
5
- export type ItemKind = 'feature' | 'bug' | 'chore' | 'decision';
5
+ export type ItemKind = 'feature' | 'bug' | 'chore' | 'decision' | 'defect';
6
6
  /**
7
7
  * An optional, additive container marker (Workpackages design §2; Scope §B(a)). A workpackage is
8
8
  * `kind:'chore'` + `role:'workpackage'` — WP-ness comes ONLY from this field, never inferred from kind,
@@ -59,6 +59,13 @@ export interface ItemState {
59
59
  * Set by the `realization.anchored` event (LAST-write-wins); absent ⇒ no anchor (fall back to baseline).
60
60
  */
61
61
  realizedCommit?: string;
62
+ /**
63
+ * Demand lifecycle (Mode A, additive) — the parent `demand` this item was PROMOTED from at `agreed`.
64
+ * Set by `item.created{demandId}` (the atomic promotion batch); absent on every directly-created item
65
+ * (canonicalize drops undefined ⇒ a pre-demand item.created hashes byte-identical). A stable back-link
66
+ * for the demand→item read trace.
67
+ */
68
+ demandId?: Ulid;
62
69
  }
63
70
  /**
64
71
  * Scope §B(a) — is this item a CONTAINER node (a `workpackage` or `spec-phase`), i.e. not a flat leaf?
@@ -81,6 +88,22 @@ export interface ItemCreatedPayload {
81
88
  accountable?: ActorId;
82
89
  responsible?: ActorId[];
83
90
  engagementRef?: string;
91
+ /**
92
+ * Demand lifecycle (Mode A, additive) — the parent `demand` this item is promoted from (set ONLY by the
93
+ * atomic `agreeDemand` batch). Absent on a directly-created item ⇒ canonicalize drops it ⇒ byte-identical.
94
+ */
95
+ demandId?: Ulid;
96
+ }
97
+ /**
98
+ * Demand lifecycle (Mode A, additive) — the optional WHO-is-handling fields carried on a spec/realization
99
+ * transition payload. `handler` = the h2a instance id (DISTINCT from the channel `by`/`prov.principal`);
100
+ * `leaseId` correlates to the ephemeral lease (Build 2). Both drop-when-absent ⇒ a pre-demand transition
101
+ * hashes byte-identical (the additive invariant). Folded into NO new state field in Build 1 (handler logging
102
+ * is reconstructed from the raw log by the read surface — the demand sibling of amendmentTrace).
103
+ */
104
+ export interface TransitionHandlerFields {
105
+ handler?: ActorId;
106
+ leaseId?: string;
84
107
  }
85
108
  /** A rejected domain command (illegal transition, unknown aggregate, …). */
86
109
  export declare class DomainError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../src/model/item.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../src/model/item.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"item.js","sourceRoot":"","sources":["../../src/model/item.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"item.js","sourceRoot":"","sources":["../../src/model/item.ts"],"names":[],"mappings":"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"}