mister-wolf 2.18.2 → 2.18.4

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/README.md CHANGED
@@ -168,16 +168,16 @@ Memory scoped to a linked worktree (`worktree:<id>`) is filtered on exactly one
168
168
 
169
169
  Self-checking scenarios: `bash scripts/demo/scenario-N.sh`.
170
170
 
171
- | # | Scenario |
172
- | --- | ---------------------------------------------------------------------------------------------------------------- |
173
- | 1 | Connecting Wolf to a new project (self-checking, PASS/FAIL points) |
174
- | 2 | The life of a knowledge item: birth, aging (supersede), reading the current one |
175
- | 3 | A new agent = one command (scaffold: playbook + frame + relation) |
176
- | 4 | An owner complaint — a hot-signal into the self-learning loop |
177
- | 5 | A script becomes a resource — the Librarian's tool cycle |
178
- | 6 | Signal log: repeated tool errors land in session metrics (self-learning pipeline removed) |
179
- | 7 | Loop hygiene: memory integrity, attribution, and noise audit |
180
- | 8 | Routing: model from a routing memory object, spend written to the signal log (**one real LLM call, ~30–60 sec**) |
171
+ | # | Scenario |
172
+ | --- | ------------------------------------------------------------------------------------------------------------------- |
173
+ | 1 | Connecting Wolf to a new project (self-checking, PASS/FAIL points) |
174
+ | 2 | The life of a knowledge item: birth, aging (supersede), reading the current one |
175
+ | 3 | A new agent = one command (scaffold: playbook + frame + relation) |
176
+ | 4 | An owner complaint — a hot-signal into the self-learning loop |
177
+ | 5 | A script becomes a resource — the Librarian's tool cycle |
178
+ | 6 | Signal log: repeated tool errors land in session metrics (self-learning pipeline removed) |
179
+ | 7 | Loop hygiene: memory integrity, attribution, and noise audit |
180
+ | 8 | Routing: model from a routing memory object, session wrap-up recorded in memory (**one real LLM call, ~30–60 sec**) |
181
181
 
182
182
  ## Integrations
183
183
 
package/README.ru.md CHANGED
@@ -197,7 +197,7 @@ wolf tool revive check # deprecated → active
197
197
  | 5 | Скрипт становится ресурсом — tool-цикл Библиотекаря |
198
198
  | 6 | Сигнальный лог: повторяющиеся тул-ошибки попадают в метрики сессий (конвейер самообучения удалён) |
199
199
  | 7 | Гигиена контура: целостность памяти, атрибуция, аудит шума |
200
- | 8 | Роутинг: модель из routing-объекта памяти, расход в сигнальный лог (**один реальный LLM-вызов, ~30–60 сек**) |
200
+ | 8 | Роутинг: модель из routing-объекта памяти, итоги сессии в памяти проекта (**один реальный LLM-вызов, ~30–60 сек**) |
201
201
 
202
202
  ## Интеграции
203
203
 
@@ -1 +1 @@
1
- {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/claim.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;mEAEmE;AAEnE,wBAAgB,YAAY,CAAC,OAAO,GAAE,MAAkB,GAAG,OAAO,CAqEjE"}
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/claim.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;mEAEmE;AAEnE,wBAAgB,YAAY,CAAC,OAAO,GAAE,MAAkB,GAAG,OAAO,CAoFjE"}
@@ -37,10 +37,21 @@ export function claimCommand(baseDir = safeCwd()) {
37
37
  .command('heartbeat')
38
38
  .description('Refresh the claim heartbeat (keeps a long-running claim fresh within the 10-minute window)')
39
39
  .argument('<artifact>', 'Artifact id whose claim heartbeat to refresh')
40
- .action((artifact) => {
41
- const hb = heartbeatArtifactClaim({ baseDir }, artifact);
40
+ .option('--session <id>', 'Assert the claim session (2.18.4): refuse on mismatch')
41
+ .option('--pid <n>', 'Record writer pid in the heartbeat (debug, not auth)', parseInt)
42
+ .option('--claim-token <t>', 'Assert the claim token (2.18.4): refuse after re-acquire')
43
+ .action((artifact, options) => {
44
+ // 2.18.4: флаги включают строгую идентификацию; без них — legacy (только writer)
45
+ const hasFlags = options.session !== undefined || options.pid !== undefined || options.claimToken !== undefined;
46
+ const hb = heartbeatArtifactClaim({ baseDir }, artifact, hasFlags
47
+ ? {
48
+ ...(options.session !== undefined ? { sessionId: options.session } : {}),
49
+ ...(options.pid !== undefined ? { pid: options.pid } : {}),
50
+ ...(options.claimToken !== undefined ? { claimToken: options.claimToken } : {}),
51
+ }
52
+ : undefined);
42
53
  console.log(`Heartbeat written: ${artifact} at ${hb.written_at} (writer ${hb.writer})`);
43
- console.log(`heartbeat file: ${heartbeatFilePath(resolveMemoryRoot(baseDir).root, artifact)}`);
54
+ console.log(`heartbeat file: ${heartbeatFilePath(resolveMemoryRoot(baseDir).root, artifact, hb.claim_token)}`);
44
55
  });
45
56
  cmd
46
57
  .command('release')
@@ -1 +1 @@
1
- {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/claim.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/claim.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;mEAEmE;AAEnE,MAAM,UAAU,YAAY,CAAC,UAAkB,OAAO,EAAE;IACtD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAC1C,mFAAmF,CACpF,CAAC;IAEF,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,8EAA8E,CAAC;SAC3F,QAAQ,CAAC,YAAY,EAAE,+DAA+D,CAAC;SACvF,MAAM,CAAC,CAAC,QAAgB,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,wEAAwE;YACxE,oEAAoE;YACpE,qEAAqE;YACrE,mEAAmE;YACnE,sEAAsE;YACtE,MAAM,GAAG,GAAG,oBAAoB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,KAAK,aAAa,GAAG,CAAC,UAAU,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;gBAClC,MAAM,IAAI,eAAe,CAAC,yBAAyB,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACrG,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,4FAA4F,CAAC;SACzG,QAAQ,CAAC,YAAY,EAAE,8CAA8C,CAAC;SACtE,MAAM,CAAC,gBAAgB,EAAE,uDAAuD,CAAC;SACjF,MAAM,CAAC,WAAW,EAAE,sDAAsD,EAAE,QAAQ,CAAC;SACrF,MAAM,CAAC,mBAAmB,EAAE,0DAA0D,CAAC;SACvF,MAAM,CAAC,CAAC,QAAgB,EAAE,OAAgE,EAAE,EAAE;QAC7F,iFAAiF;QACjF,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC;QAChH,MAAM,EAAE,GAAG,sBAAsB,CAC/B,EAAE,OAAO,EAAE,EACX,QAAQ,EACR,QAAQ;YACN,CAAC,CAAC;gBACE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChF;YACH,CAAC,CAAC,SAAS,CACd,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,OAAO,EAAE,CAAC,UAAU,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,mBAAmB,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,mEAAmE,CAAC;SAChF,QAAQ,CAAC,YAAY,EAAE,wBAAwB,CAAC;SAChD,MAAM,CAAC,uBAAuB,EAAE,oEAAoE,CAAC;SACrG,MAAM,CAAC,CAAC,QAAgB,EAAE,OAAgC,EAAE,EAAE;QAC7D,MAAM,GAAG,GAAG,oBAAoB,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5E,IAAI,GAAG,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,mBAAmB,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,UAAU,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,WAAW,OAAO,CAAC,CAAC,GAAG,EAAE,CAClH,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"face.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/face.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AA8E5C,wBAAgB,WAAW,CAAC,OAAO,GAAE,MAAkB,GAAG,OAAO,CA0NhE"}
1
+ {"version":3,"file":"face.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/face.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AA+E5C,wBAAgB,WAAW,CAAC,OAAO,GAAE,MAAkB,GAAG,OAAO,CA0OhE"}
@@ -5,6 +5,7 @@ import { safeCwd } from '../cli-entry.js';
5
5
  import { createFaceVersion } from '../../../app/use-cases/create-face-version.js';
6
6
  import { abortFaceOperation, resumeFaceOperation } from '../../../app/use-cases/face-operation.js';
7
7
  import { migrateFaces } from '../../../app/use-cases/migrate-faces.js';
8
+ import { resolveFace } from '../../../app/use-cases/resolve-face.js';
8
9
  import { createCliContainer } from '../../../bootstrap/container.js';
9
10
  import { UserFacingError } from '../../../domain/errors.js';
10
11
  /** Волна 2.17 T-04 (design §«CLI: проектируемые команды», REQ-03/04/05/07/10):
@@ -222,6 +223,20 @@ export function faceCommand(baseDir = safeCwd()) {
222
223
  console.log('---');
223
224
  console.log(active.body ?? '');
224
225
  });
226
+ // 2.18.4: канонический резолвер лица — машинный канал доставки (wolf-router
227
+ // плагин). Строгий отказ (exit 1) при нуле/конфликте активных лиц — плагин
228
+ // переходит на legacy-путь, диагностику конфликта ловит wolf doctor.
229
+ createdByTrap(cmd
230
+ .command('resolve')
231
+ .description('Resolve the canonical active face for an agent (JSON: {ok, face|error}; exit 1 on miss/conflict)')
232
+ .argument('<owner_skill>', 'Agent id or skill (owner_skill)')).action(async (ownerSkill, options) => {
233
+ denyCreatedBy(options);
234
+ const { store } = createCliContainer(baseDir);
235
+ const result = await resolveFace(store, ownerSkill);
236
+ if (!result.ok)
237
+ process.exitCode = 1;
238
+ console.log(JSON.stringify(result));
239
+ });
225
240
  return cmd;
226
241
  }
227
242
  //# sourceMappingURL=face.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"face.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/face.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"face.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/face.ts"],"names":[],"mappings":"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"}
@@ -22,10 +22,12 @@ export interface ClaimRecord {
22
22
  cwd: string;
23
23
  /** ISO-время захвата. */
24
24
  acquired_at: string;
25
+ /** 2.18.3: уникальный токен владения claim'ом для per-token изоляции heartbeat. */
26
+ claim_token?: string;
25
27
  }
26
- /** Heartbeat-запись (2.18.0 REQ-03, design §3.3; 2.18.2 F-01): продление свежести
27
- * держателем долгой операции; writer — для отладки, не auth; claim_acquired_at
28
- * привязывает heartbeat к конкретному владению claim'ом. */
28
+ /** Heartbeat-запись (2.18.0 REQ-03, design §3.3; 2.18.2 F-01; 2.18.3 per-token isolation):
29
+ * продление свежести держателем долгой операции; writer — для отладки, не auth;
30
+ * claim_acquired_at и claim_token привязывают heartbeat к конкретному владению claim'ом. */
29
31
  export interface HeartbeatRecord {
30
32
  /** ISO-время последнего heartbeat. */
31
33
  written_at: string;
@@ -33,6 +35,22 @@ export interface HeartbeatRecord {
33
35
  writer: string;
34
36
  /** ISO-время захвата claim, к которому привязан heartbeat (F-01). */
35
37
  claim_acquired_at?: string;
38
+ /** Уникальный токен владения claim'ом (2.18.3). */
39
+ claim_token?: string;
40
+ /** 2.18.4: полный идентификатор сессии писателя (null — переданное владение). */
41
+ session_id?: string | null;
42
+ /** 2.18.4: pid писателя (для отладки, не auth). */
43
+ pid?: number;
44
+ }
45
+ /** 2.18.4: полная идентичность писателя heartbeat. Проверяются только переданные
46
+ * поля: owner — всегда; sessionId (null трактуется строго: claim тоже без сессии —
47
+ * переданное владение) и claimToken — только если определены. Непереданные поля —
48
+ * legacy-поведение (только writer). */
49
+ export interface HeartbeatIdentity {
50
+ owner: string;
51
+ sessionId?: string | null;
52
+ pid?: number;
53
+ claimToken?: string;
36
54
  }
37
55
  export type HeartbeatReadResult = HeartbeatRecord | {
38
56
  corrupt: true;
@@ -66,24 +84,34 @@ export declare function claimSlug(artifact: string): string;
66
84
  export declare function claimFilePath(root: string, artifact: string): string;
67
85
  /** След перехвата: `<slug>.<epochMs>.json` (исходные байты сохраняются, NFR-02). */
68
86
  export declare function claimTrailPath(root: string, artifact: string, epochMs: number): string;
69
- /** Путь heartbeat-файла артефакта (2.18.0 REQ-03): `<slug>.heartbeat` рядом с claim-файлом. */
70
- export declare function heartbeatFilePath(root: string, artifact: string): string;
71
- /** Чтение heartbeat (F-01): null при отсутствии файла (ENOENT); { corrupt: true }
87
+ /** Путь heartbeat-файла артефакта (2.18.0 REQ-03; 2.18.3 per-token isolation):
88
+ * если передан token: `<slug>.<claim_token>.heartbeat`, иначе fallback на `<slug>.heartbeat`. */
89
+ export declare function heartbeatFilePath(root: string, artifact: string, token?: string): string;
90
+ /** Токен claim'а: явный claim_token или fallback на acquired_at (legacy-совместимость). */
91
+ export declare function claimTokenOf(rec: ClaimRecord): string;
92
+ /** Удаление heartbeat-файлов артефакта: per-token (если указан) и legacy. */
93
+ export declare function removeHeartbeatFiles(root: string, artifact: string, token?: string): void;
94
+ /** Чтение heartbeat для конкретного claim (2.18.3): сначала per-token файл, затем fallback на legacy. */
95
+ export declare function readClaimHeartbeat(root: string, artifact: string, rec?: ClaimRecord | null): HeartbeatReadResult;
96
+ /** Чтение heartbeat (F-01; 2.18.3): null при отсутствии файла (ENOENT); { corrupt: true }
72
97
  * при повреждённом файле/JSON; HeartbeatRecord при валидном JSON. */
73
98
  export declare function readHeartbeat(path: string): HeartbeatReadResult;
74
- /** Запись heartbeat (REQ-03, ADR-7; 2.18.2 F-01): атомарная замена — уникальный tmp (wx) +
75
- * rename поверх. Проверяет, что claim существует, активен и принадлежит writer.
76
- * Привязывает heartbeat к rec.acquired_at. */
99
+ /** Запись heartbeat (REQ-03, ADR-7; 2.18.2 F-01; 2.18.3 per-token isolation; 2.18.4
100
+ * полная идентификация): атомарная замена — уникальный tmp (wx) + rename поверх
101
+ * per-token heartbeat-файла. Проверяет, что claim существует, активен и принадлежит
102
+ * писателю (owner обязателен; sessionId/claimToken — при передаче в identity).
103
+ * Привязывает heartbeat к rec.acquired_at и rec.claim_token. */
77
104
  export declare function writeHeartbeat(deps: ClaimRegistryDeps, input: {
78
105
  artifact: string;
79
106
  writer: string;
107
+ identity?: HeartbeatIdentity;
80
108
  }): HeartbeatRecord;
81
109
  /** Прод-liveness: signal 0; ESRCH — мёртв, EPERM — жив (чужой user). pid<=0 —
82
110
  * неизвестен (переданный claim) — считаем живым, пока не истечёт TTL. */
83
111
  export declare function pidAlive(pid: number): boolean;
84
- /** Stale (design §3.3; 2.18.2 F-01): мёртвый PID ИЛИ возраст > TTL ИЛИ (heartbeat есть и
85
- * старше окна/повреждён); нет heartbeat → правила 2.17.1 (NFR-03).
86
- * Если heartbeat привязан к чужому claim_acquired_at — игнорируется. */
112
+ /** Stale (design §3.3; 2.18.2 F-01; 2.18.3 per-token isolation): мёртвый PID ИЛИ
113
+ * возраст > TTL ИЛИ (heartbeat есть и старше окна/повреждён); нет heartbeat → правила 2.17.1 (NFR-03).
114
+ * Если heartbeat привязан к чужому claim_acquired_at или чужому claim_token — игнорируется. */
87
115
  export declare function isStale(rec: ClaimRecord | null, hb: HeartbeatReadResult, deps: ClaimRegistryDeps): boolean;
88
116
  /** Атомарный захват (REQ-05 AC-1): wx-create; занято и fresh — ClaimHeldError
89
117
  * с идентификатором владельца; stale/порченый — перехват со следом. */
@@ -1 +1 @@
1
- {"version":3,"file":"claim-registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/claim-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claim-registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/claim-registry.ts"],"names":[],"mappings":"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"}
@@ -42,11 +42,55 @@ export function claimFilePath(root, artifact) {
42
42
  export function claimTrailPath(root, artifact, epochMs) {
43
43
  return join(claimsDir(root), `${claimSlug(artifact)}.${epochMs}.json`);
44
44
  }
45
- /** Путь heartbeat-файла артефакта (2.18.0 REQ-03): `<slug>.heartbeat` рядом с claim-файлом. */
46
- export function heartbeatFilePath(root, artifact) {
45
+ /** Путь heartbeat-файла артефакта (2.18.0 REQ-03; 2.18.3 per-token isolation):
46
+ * если передан token: `<slug>.<claim_token>.heartbeat`, иначе fallback на `<slug>.heartbeat`. */
47
+ export function heartbeatFilePath(root, artifact, token) {
48
+ if (token) {
49
+ return join(claimsDir(root), `${claimSlug(artifact)}.${token}.heartbeat`);
50
+ }
47
51
  return join(claimsDir(root), `${claimSlug(artifact)}.heartbeat`);
48
52
  }
49
- /** Чтение heartbeat (F-01): null при отсутствии файла (ENOENT); { corrupt: true }
53
+ /** Токен claim'а: явный claim_token или fallback на acquired_at (legacy-совместимость). */
54
+ export function claimTokenOf(rec) {
55
+ return rec.claim_token ?? rec.acquired_at;
56
+ }
57
+ /** Удаление heartbeat-файлов артефакта: per-token (если указан) и legacy. */
58
+ export function removeHeartbeatFiles(root, artifact, token) {
59
+ if (token) {
60
+ try {
61
+ const p = heartbeatFilePath(root, artifact, token);
62
+ if (existsSync(p))
63
+ unlinkSync(p);
64
+ }
65
+ catch {
66
+ /* ignore */
67
+ }
68
+ }
69
+ try {
70
+ const legacy = heartbeatFilePath(root, artifact);
71
+ if (existsSync(legacy))
72
+ unlinkSync(legacy);
73
+ }
74
+ catch {
75
+ /* ignore */
76
+ }
77
+ }
78
+ /** Чтение heartbeat для конкретного claim (2.18.3): сначала per-token файл, затем fallback на legacy. */
79
+ export function readClaimHeartbeat(root, artifact, rec) {
80
+ if (rec) {
81
+ const token = claimTokenOf(rec);
82
+ const tokenPath = heartbeatFilePath(root, artifact, token);
83
+ if (existsSync(tokenPath)) {
84
+ return readHeartbeat(tokenPath);
85
+ }
86
+ }
87
+ const legacyPath = heartbeatFilePath(root, artifact);
88
+ if (existsSync(legacyPath)) {
89
+ return readHeartbeat(legacyPath);
90
+ }
91
+ return null;
92
+ }
93
+ /** Чтение heartbeat (F-01; 2.18.3): null при отсутствии файла (ENOENT); { corrupt: true }
50
94
  * при повреждённом файле/JSON; HeartbeatRecord при валидном JSON. */
51
95
  export function readHeartbeat(path) {
52
96
  let raw;
@@ -65,42 +109,71 @@ export function readHeartbeat(path) {
65
109
  written_at: d.written_at,
66
110
  writer: d.writer,
67
111
  ...(typeof d.claim_acquired_at === 'string' ? { claim_acquired_at: d.claim_acquired_at } : {}),
112
+ ...(typeof d.claim_token === 'string' ? { claim_token: d.claim_token } : {}),
113
+ ...(typeof d.session_id === 'string'
114
+ ? { session_id: d.session_id }
115
+ : d.session_id === null
116
+ ? { session_id: null }
117
+ : {}),
118
+ ...(typeof d.pid === 'number' ? { pid: d.pid } : {}),
68
119
  };
69
120
  }
70
121
  catch {
71
122
  return { corrupt: true };
72
123
  }
73
124
  }
74
- /** Запись heartbeat (REQ-03, ADR-7; 2.18.2 F-01): атомарная замена — уникальный tmp (wx) +
75
- * rename поверх. Проверяет, что claim существует, активен и принадлежит writer.
76
- * Привязывает heartbeat к rec.acquired_at. */
125
+ /** Запись heartbeat (REQ-03, ADR-7; 2.18.2 F-01; 2.18.3 per-token isolation; 2.18.4
126
+ * полная идентификация): атомарная замена — уникальный tmp (wx) + rename поверх
127
+ * per-token heartbeat-файла. Проверяет, что claim существует, активен и принадлежит
128
+ * писателю (owner обязателен; sessionId/claimToken — при передаче в identity).
129
+ * Привязывает heartbeat к rec.acquired_at и rec.claim_token. */
77
130
  export function writeHeartbeat(deps, input) {
78
131
  const cPath = claimFilePath(deps.root, input.artifact);
79
132
  const { rec } = readClaimFile(cPath);
80
133
  if (!existsSync(cPath) || rec === null) {
81
134
  throw new UserFacingError(`No claim held for "${input.artifact}" — acquire it first before heartbeat (claim file: ${cPath})`);
82
135
  }
83
- if (isStale(rec, readHeartbeat(heartbeatFilePath(deps.root, input.artifact)), deps)) {
136
+ if (isStale(rec, readClaimHeartbeat(deps.root, input.artifact, rec), deps)) {
84
137
  throw new UserFacingError(`Claim for "${input.artifact}" is stale — cannot heartbeat (claim file: ${cPath})`);
85
138
  }
86
- if (rec.owner !== input.writer) {
139
+ if (input.identity) {
140
+ const id = input.identity;
141
+ if (rec.owner !== id.owner) {
142
+ throw new UserFacingError(`Claim for "${input.artifact}" is owned by ${rec.owner}, not ${id.owner} (claim file: ${cPath})`);
143
+ }
144
+ // 2.18.4: сессия — строгое совпадение; оба null — переданное владение (легально)
145
+ if (id.sessionId !== undefined && rec.session_id !== id.sessionId) {
146
+ throw new UserFacingError(`Claim for "${input.artifact}" is held by ${rec.owner} (session ${rec.session_id ?? '-'}) — ` +
147
+ `heartbeat session '${id.sessionId ?? '-'}' does not match (claim file: ${cPath})`);
148
+ }
149
+ // 2.18.4: токен — защита от heartbeat'а прежнего владения после перезахвата
150
+ if (id.claimToken !== undefined && id.claimToken !== rec.claim_token) {
151
+ throw new UserFacingError(`Claim for "${input.artifact}" was re-acquired by ${rec.owner} — ` +
152
+ `claim_token does not match the current claim (claim file: ${cPath})`);
153
+ }
154
+ }
155
+ else if (rec.owner !== input.writer) {
87
156
  throw new UserFacingError(`Claim for "${input.artifact}" is owned by ${rec.owner}, not ${input.writer} (claim file: ${cPath})`);
88
157
  }
89
158
  const dir = claimsDir(deps.root);
90
159
  mkdirSync(dir, { recursive: true });
91
160
  const now = (deps.now ?? (() => new Date()))();
161
+ const token = claimTokenOf(rec);
92
162
  const record = {
93
163
  written_at: now.toISOString(),
94
164
  writer: input.writer,
95
165
  claim_acquired_at: rec.acquired_at,
166
+ claim_token: token,
167
+ ...(input.identity && input.identity.sessionId !== undefined ? { session_id: input.identity.sessionId } : {}),
168
+ ...(input.identity?.pid !== undefined ? { pid: input.identity.pid } : {}),
96
169
  };
97
170
  const tag = `${process.hrtime.bigint().toString(36)}.${Math.random().toString(36).slice(2, 10)}`;
98
- const tmp = join(dir, `${claimSlug(input.artifact)}.heartbeat.${tag}.tmp`);
171
+ const tmp = join(dir, `${claimSlug(input.artifact)}.${token}.heartbeat.${tag}.tmp`);
99
172
  const fd = openSync(tmp, 'wx');
100
173
  writeFileSync(fd, JSON.stringify(record), 'utf-8');
101
174
  closeSync(fd);
102
175
  try {
103
- renameSync(tmp, heartbeatFilePath(deps.root, input.artifact));
176
+ renameSync(tmp, heartbeatFilePath(deps.root, input.artifact, token));
104
177
  }
105
178
  catch (e) {
106
179
  try {
@@ -142,15 +215,16 @@ function parseClaim(raw) {
142
215
  pid: typeof d.pid === 'number' ? d.pid : 0,
143
216
  cwd: typeof d.cwd === 'string' ? d.cwd : '',
144
217
  acquired_at: typeof d.acquired_at === 'string' ? d.acquired_at : '',
218
+ claim_token: typeof d.claim_token === 'string' ? d.claim_token : undefined,
145
219
  };
146
220
  }
147
221
  catch {
148
222
  return null;
149
223
  }
150
224
  }
151
- /** Stale (design §3.3; 2.18.2 F-01): мёртвый PID ИЛИ возраст > TTL ИЛИ (heartbeat есть и
152
- * старше окна/повреждён); нет heartbeat → правила 2.17.1 (NFR-03).
153
- * Если heartbeat привязан к чужому claim_acquired_at — игнорируется. */
225
+ /** Stale (design §3.3; 2.18.2 F-01; 2.18.3 per-token isolation): мёртвый PID ИЛИ
226
+ * возраст > TTL ИЛИ (heartbeat есть и старше окна/повреждён); нет heartbeat → правила 2.17.1 (NFR-03).
227
+ * Если heartbeat привязан к чужому claim_acquired_at или чужому claim_token — игнорируется. */
154
228
  export function isStale(rec, hb, deps) {
155
229
  if (rec === null)
156
230
  return true;
@@ -167,6 +241,10 @@ export function isStale(rec, hb, deps) {
167
241
  if ('corrupt' in hb && hb.corrupt)
168
242
  return true;
169
243
  const hbRec = hb;
244
+ // 2.18.3: если heartbeat от другого claim_token — игнорируем его
245
+ if (hbRec.claim_token && rec.claim_token && hbRec.claim_token !== rec.claim_token) {
246
+ return false;
247
+ }
170
248
  // F-01: если heartbeat от предыдущего владения (acquired_at не совпадает), игнорируем его
171
249
  if (hbRec.claim_acquired_at && hbRec.claim_acquired_at !== rec.acquired_at) {
172
250
  return false;
@@ -198,6 +276,9 @@ export function acquireClaim(deps, input) {
198
276
  mkdirSync(dir, { recursive: true });
199
277
  const path = claimFilePath(deps.root, input.artifact);
200
278
  const now = deps.now ?? (() => new Date());
279
+ const epoch = now().getTime();
280
+ const randomTag = `${process.hrtime.bigint().toString(36)}.${Math.random().toString(36).slice(2, 10)}`;
281
+ const claim_token = `${epoch}.${randomTag}`;
201
282
  const record = {
202
283
  artifact: input.artifact,
203
284
  owner: input.identity.owner,
@@ -205,20 +286,14 @@ export function acquireClaim(deps, input) {
205
286
  pid: input.identity.pid,
206
287
  cwd: input.cwd,
207
288
  acquired_at: now().toISOString(),
289
+ claim_token,
208
290
  };
209
291
  for (let attempt = 0;; attempt++) {
210
292
  try {
211
293
  const fd = openSync(path, 'wx');
212
294
  writeFileSync(fd, JSON.stringify(record), 'utf-8');
213
295
  closeSync(fd);
214
- try {
215
- const hbPath = heartbeatFilePath(deps.root, input.artifact);
216
- if (existsSync(hbPath))
217
- unlinkSync(hbPath);
218
- }
219
- catch {
220
- /* ignore */
221
- }
296
+ removeHeartbeatFiles(deps.root, input.artifact);
222
297
  return record;
223
298
  }
224
299
  catch (e) {
@@ -236,19 +311,19 @@ export function acquireClaim(deps, input) {
236
311
  (deps.wait ?? sleepMs)(10);
237
312
  continue;
238
313
  }
239
- if (rec !== null && !isStale(rec, readHeartbeat(heartbeatFilePath(deps.root, input.artifact)), deps)) {
314
+ if (rec !== null && !isStale(rec, readClaimHeartbeat(deps.root, input.artifact, rec), deps)) {
240
315
  throw new ClaimHeldError(path, rec.owner, describeHolder(rec));
241
316
  }
242
317
  // stale/порченый (rec === null, сырые байты могли быть) → перехват со следом;
243
318
  // проигранная гонка перехвата (ENOENT на link/unlink) — повтор захвата
244
319
  try {
245
- const epoch = now().getTime();
320
+ const epochMs = now().getTime();
246
321
  // FIX-4 (MINOR-4, ревью T5): след — через linkSync (excl-семантика):
247
322
  // exists+rename TOCTOU позволял двум перехватчикам одной мс перезаписать
248
323
  // чужой след (потеря байтов, NFR-02); при EEXIST — bump эпохи до свободного
249
324
  let preserved = null;
250
325
  for (let bump = 0; bump < 50 && preserved === null; bump++) {
251
- const trail = claimTrailPath(deps.root, input.artifact, epoch + bump);
326
+ const trail = claimTrailPath(deps.root, input.artifact, epochMs + bump);
252
327
  try {
253
328
  linkSync(path, trail);
254
329
  preserved = trail;
@@ -268,12 +343,7 @@ export function acquireClaim(deps, input) {
268
343
  else if (statSync(path).ino === statSync(preserved).ino) {
269
344
  // unlink только сохранённый inode: конкурент мог уже пересоздать claim
270
345
  unlinkSync(path);
271
- try {
272
- unlinkSync(heartbeatFilePath(deps.root, input.artifact));
273
- }
274
- catch {
275
- /* ignore */
276
- }
346
+ removeHeartbeatFiles(deps.root, input.artifact, rec ? claimTokenOf(rec) : undefined);
277
347
  }
278
348
  }
279
349
  }
@@ -304,7 +374,7 @@ export function releaseClaim(deps, input) {
304
374
  throw new UserFacingError(`Claim file for "${input.artifact}" is corrupt — ownership cannot be verified; take over via "wolf claim acquire" (preserves bytes) or remove it manually (claim file: ${path})`);
305
375
  }
306
376
  const fullMatch = ownerSessionMatch(rec, input.identity) && rec.pid === input.identity.pid;
307
- const pidReleasable = rec.pid <= 0 || isStale(rec, readHeartbeat(heartbeatFilePath(deps.root, input.artifact)), deps);
377
+ const pidReleasable = rec.pid <= 0 || isStale(rec, readClaimHeartbeat(deps.root, input.artifact, rec), deps);
308
378
  // MINOR-1b (интегральное ревью 2.17.1): зеркально requireClaim — адресат
309
379
  // transfer (session null + owner) освобождает своей сессией, иначе передача
310
380
  // паркует release до TTL
@@ -314,6 +384,9 @@ export function releaseClaim(deps, input) {
314
384
  }
315
385
  if (input.transferTo !== undefined) {
316
386
  const now = (deps.now ?? (() => new Date()))();
387
+ const epoch = now.getTime();
388
+ const randomTag = `${process.hrtime.bigint().toString(36)}.${Math.random().toString(36).slice(2, 10)}`;
389
+ const transferredToken = `${epoch}.${randomTag}`;
317
390
  const transferred = {
318
391
  artifact: rec.artifact,
319
392
  owner: input.transferTo,
@@ -322,23 +395,14 @@ export function releaseClaim(deps, input) {
322
395
  pid: 0,
323
396
  cwd: rec.cwd,
324
397
  acquired_at: now.toISOString(),
398
+ claim_token: transferredToken,
325
399
  };
326
400
  writeFileSync(path, JSON.stringify(transferred), 'utf-8');
327
- try {
328
- unlinkSync(heartbeatFilePath(deps.root, input.artifact));
329
- }
330
- catch {
331
- /* ignore */
332
- }
401
+ removeHeartbeatFiles(deps.root, input.artifact, claimTokenOf(rec));
333
402
  return { action: 'transferred', owner: input.transferTo };
334
403
  }
335
404
  unlinkSync(path);
336
- try {
337
- unlinkSync(heartbeatFilePath(deps.root, input.artifact));
338
- }
339
- catch {
340
- /* ignore */
341
- }
405
+ removeHeartbeatFiles(deps.root, input.artifact, claimTokenOf(rec));
342
406
  return { action: 'released', owner: rec.owner };
343
407
  }
344
408
  /** Реестр для наблюдаемости (REQ-05 AC-2): кто/когда/что из файлов; следы
@@ -381,7 +445,7 @@ export function requireClaim(deps, artifact, who) {
381
445
  if (rec === null) {
382
446
  throw new UserFacingError(`Claim file for "${artifact}" is corrupt — treated as stale; re-acquire: wolf claim acquire "${artifact}" (claim file: ${path})`);
383
447
  }
384
- if (isStale(rec, readHeartbeat(heartbeatFilePath(deps.root, artifact)), deps)) {
448
+ if (isStale(rec, readClaimHeartbeat(deps.root, artifact, rec), deps)) {
385
449
  throw new UserFacingError(`Claim for "${artifact}" is stale (holder ${rec.owner}) — re-acquire: wolf claim acquire "${artifact}" (claim file: ${path})`);
386
450
  }
387
451
  // MINOR-1 (ревью T5): переданный claim (transfer: session null, pid 0)