mister-wolf 2.16.3 → 2.17.1

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 (143) hide show
  1. package/README.md +24 -11
  2. package/README.ru.md +25 -14
  3. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  4. package/dist/adapters/cli/cli-entry.js +25 -0
  5. package/dist/adapters/cli/cli-entry.js.map +1 -1
  6. package/dist/adapters/cli/commands/claim.d.ts +6 -0
  7. package/dist/adapters/cli/commands/claim.d.ts.map +1 -0
  8. package/dist/adapters/cli/commands/claim.js +65 -0
  9. package/dist/adapters/cli/commands/claim.js.map +1 -0
  10. package/dist/adapters/cli/commands/face.d.ts +3 -0
  11. package/dist/adapters/cli/commands/face.d.ts.map +1 -0
  12. package/dist/adapters/cli/commands/face.js +227 -0
  13. package/dist/adapters/cli/commands/face.js.map +1 -0
  14. package/dist/adapters/cli/commands/memory-add.d.ts.map +1 -1
  15. package/dist/adapters/cli/commands/memory-add.js +1 -1
  16. package/dist/adapters/cli/commands/memory-add.js.map +1 -1
  17. package/dist/adapters/cli/commands/memory-doctor.d.ts +20 -0
  18. package/dist/adapters/cli/commands/memory-doctor.d.ts.map +1 -1
  19. package/dist/adapters/cli/commands/memory-doctor.js +123 -7
  20. package/dist/adapters/cli/commands/memory-doctor.js.map +1 -1
  21. package/dist/adapters/cli/commands/memory-edit.d.ts.map +1 -1
  22. package/dist/adapters/cli/commands/memory-edit.js +6 -52
  23. package/dist/adapters/cli/commands/memory-edit.js.map +1 -1
  24. package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
  25. package/dist/adapters/cli/commands/memory-init.js +37 -54
  26. package/dist/adapters/cli/commands/memory-init.js.map +1 -1
  27. package/dist/adapters/cli/commands/memory-list.d.ts.map +1 -1
  28. package/dist/adapters/cli/commands/memory-list.js +1 -1
  29. package/dist/adapters/cli/commands/memory-list.js.map +1 -1
  30. package/dist/adapters/cli/commands/memory-scaffold.d.ts.map +1 -1
  31. package/dist/adapters/cli/commands/memory-scaffold.js +2 -1
  32. package/dist/adapters/cli/commands/memory-scaffold.js.map +1 -1
  33. package/dist/adapters/cli/commands/memory-search.d.ts.map +1 -1
  34. package/dist/adapters/cli/commands/memory-search.js +1 -1
  35. package/dist/adapters/cli/commands/memory-search.js.map +1 -1
  36. package/dist/adapters/cli/commands/memory-sync.js +1 -1
  37. package/dist/adapters/cli/commands/memory-sync.js.map +1 -1
  38. package/dist/adapters/cli/commands/propose.d.ts +3 -0
  39. package/dist/adapters/cli/commands/propose.d.ts.map +1 -0
  40. package/dist/adapters/cli/commands/propose.js +94 -0
  41. package/dist/adapters/cli/commands/propose.js.map +1 -0
  42. package/dist/adapters/cli/type-command-generator.d.ts.map +1 -1
  43. package/dist/adapters/cli/type-command-generator.js +2 -0
  44. package/dist/adapters/cli/type-command-generator.js.map +1 -1
  45. package/dist/adapters/fs/claim-registry.d.ts +85 -0
  46. package/dist/adapters/fs/claim-registry.d.ts.map +1 -0
  47. package/dist/adapters/fs/claim-registry.js +276 -0
  48. package/dist/adapters/fs/claim-registry.js.map +1 -0
  49. package/dist/adapters/fs/memory-root.d.ts +26 -1
  50. package/dist/adapters/fs/memory-root.d.ts.map +1 -1
  51. package/dist/adapters/fs/memory-root.js +88 -2
  52. package/dist/adapters/fs/memory-root.js.map +1 -1
  53. package/dist/app/use-cases/add-memory-object.d.ts +5 -0
  54. package/dist/app/use-cases/add-memory-object.d.ts.map +1 -1
  55. package/dist/app/use-cases/add-memory-object.js +24 -5
  56. package/dist/app/use-cases/add-memory-object.js.map +1 -1
  57. package/dist/app/use-cases/claim-artifact.d.ts +31 -0
  58. package/dist/app/use-cases/claim-artifact.d.ts.map +1 -0
  59. package/dist/app/use-cases/claim-artifact.js +38 -0
  60. package/dist/app/use-cases/claim-artifact.js.map +1 -0
  61. package/dist/app/use-cases/create-face-version.d.ts +101 -0
  62. package/dist/app/use-cases/create-face-version.d.ts.map +1 -0
  63. package/dist/app/use-cases/create-face-version.js +100 -0
  64. package/dist/app/use-cases/create-face-version.js.map +1 -0
  65. package/dist/app/use-cases/create-mutation-record.d.ts +55 -0
  66. package/dist/app/use-cases/create-mutation-record.d.ts.map +1 -0
  67. package/dist/app/use-cases/create-mutation-record.js +78 -0
  68. package/dist/app/use-cases/create-mutation-record.js.map +1 -0
  69. package/dist/app/use-cases/deliver-proposal.d.ts +26 -0
  70. package/dist/app/use-cases/deliver-proposal.d.ts.map +1 -0
  71. package/dist/app/use-cases/deliver-proposal.js +35 -0
  72. package/dist/app/use-cases/deliver-proposal.js.map +1 -0
  73. package/dist/app/use-cases/edit-memory-object.d.ts +26 -0
  74. package/dist/app/use-cases/edit-memory-object.d.ts.map +1 -0
  75. package/dist/app/use-cases/edit-memory-object.js +57 -0
  76. package/dist/app/use-cases/edit-memory-object.js.map +1 -0
  77. package/dist/app/use-cases/face-operation.d.ts +81 -0
  78. package/dist/app/use-cases/face-operation.d.ts.map +1 -0
  79. package/dist/app/use-cases/face-operation.js +503 -0
  80. package/dist/app/use-cases/face-operation.js.map +1 -0
  81. package/dist/app/use-cases/get-call-injections.d.ts +12 -1
  82. package/dist/app/use-cases/get-call-injections.d.ts.map +1 -1
  83. package/dist/app/use-cases/get-call-injections.js +73 -12
  84. package/dist/app/use-cases/get-call-injections.js.map +1 -1
  85. package/dist/app/use-cases/migrate-faces.d.ts +81 -0
  86. package/dist/app/use-cases/migrate-faces.d.ts.map +1 -0
  87. package/dist/app/use-cases/migrate-faces.js +267 -0
  88. package/dist/app/use-cases/migrate-faces.js.map +1 -0
  89. package/dist/app/use-cases/promote-memory.d.ts +14 -1
  90. package/dist/app/use-cases/promote-memory.d.ts.map +1 -1
  91. package/dist/app/use-cases/promote-memory.js +36 -5
  92. package/dist/app/use-cases/promote-memory.js.map +1 -1
  93. package/dist/app/use-cases/record-relation.d.ts.map +1 -1
  94. package/dist/app/use-cases/record-relation.js +6 -0
  95. package/dist/app/use-cases/record-relation.js.map +1 -1
  96. package/dist/app/use-cases/save-proposal.d.ts +49 -0
  97. package/dist/app/use-cases/save-proposal.d.ts.map +1 -0
  98. package/dist/app/use-cases/save-proposal.js +32 -0
  99. package/dist/app/use-cases/save-proposal.js.map +1 -0
  100. package/dist/app/use-cases/scaffold-agent.d.ts.map +1 -1
  101. package/dist/app/use-cases/scaffold-agent.js +20 -52
  102. package/dist/app/use-cases/scaffold-agent.js.map +1 -1
  103. package/dist/app/use-cases/scaffold-artifact.d.ts +5 -0
  104. package/dist/app/use-cases/scaffold-artifact.d.ts.map +1 -1
  105. package/dist/app/use-cases/scaffold-artifact.js +2 -0
  106. package/dist/app/use-cases/scaffold-artifact.js.map +1 -1
  107. package/dist/app/use-cases/seed-base-playbooks.d.ts +17 -96
  108. package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
  109. package/dist/app/use-cases/seed-base-playbooks.js +77 -32
  110. package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
  111. package/dist/app/use-cases/supersede-memory-object.d.ts +3 -1
  112. package/dist/app/use-cases/supersede-memory-object.d.ts.map +1 -1
  113. package/dist/app/use-cases/supersede-memory-object.js +8 -1
  114. package/dist/app/use-cases/supersede-memory-object.js.map +1 -1
  115. package/dist/app/use-cases/transition-memory-object.d.ts.map +1 -1
  116. package/dist/app/use-cases/transition-memory-object.js +6 -0
  117. package/dist/app/use-cases/transition-memory-object.js.map +1 -1
  118. package/dist/domain/facet-colors.d.ts.map +1 -1
  119. package/dist/domain/facet-colors.js +1 -0
  120. package/dist/domain/facet-colors.js.map +1 -1
  121. package/dist/domain/memory-types.d.ts +36 -1
  122. package/dist/domain/memory-types.d.ts.map +1 -1
  123. package/dist/domain/memory-types.js +36 -2
  124. package/dist/domain/memory-types.js.map +1 -1
  125. package/dist/domain/schemas/memory-event-schema.d.ts +8 -0
  126. package/dist/domain/schemas/memory-event-schema.d.ts.map +1 -1
  127. package/dist/domain/schemas/memory-event-schema.js +42 -1
  128. package/dist/domain/schemas/memory-event-schema.js.map +1 -1
  129. package/dist/domain/schemas/relation-schema.d.ts +6 -2
  130. package/dist/domain/schemas/relation-schema.d.ts.map +1 -1
  131. package/dist/domain/schemas/relation-schema.js +8 -0
  132. package/dist/domain/schemas/relation-schema.js.map +1 -1
  133. package/dist/domain/schemas/session-checkpoint-schema.d.ts +1 -1
  134. package/dist/domain/type-schema-builder.d.ts +4 -2
  135. package/dist/domain/type-schema-builder.d.ts.map +1 -1
  136. package/dist/domain/type-schema-builder.js +32 -1
  137. package/dist/domain/type-schema-builder.js.map +1 -1
  138. package/package.json +1 -1
  139. package/templates/.wolf/router.log +1 -1
  140. package/templates/base/agents/steward.md +9 -6
  141. package/templates/base/playbooks/complaint-protocol.md +1 -1
  142. package/templates/base/playbooks/steward-nastavnik.md +36 -17
  143. package/templates/opencode/plugins/wolf-router.ts +60 -10
@@ -2,6 +2,7 @@ import { MemoryStore } from '../../ports/memory-store.port.js';
2
2
  import { SearchIndex } from '../../ports/search-index.port.js';
3
3
  import { Clock } from '../../ports/clock.port.js';
4
4
  import { RelationLog } from '../../ports/relation-log.port.js';
5
+ import { type WorktreeIdentity } from '../../adapters/fs/memory-root.js';
5
6
  export interface CallInjectionResult {
6
7
  blocks: string[];
7
8
  truncated: number;
@@ -21,12 +22,20 @@ export interface CallInjectionResult {
21
22
  scope: string;
22
23
  count: number;
23
24
  } | null;
25
+ /** 2.17.1 REQ-02 (R02), design §3.2: legacy-токены `worktree:<name>`, не
26
+ * сопоставленные никому (неоднозначное имя — две живые копии с тем же basename).
27
+ * Честный конфликт: stderr-подсказка wolf call + doctor; объекты не переписываются. */
28
+ scopeConflicts: string[];
24
29
  }
25
30
  export declare function getCallInjections(deps: {
26
31
  store: MemoryStore;
27
32
  index?: SearchIndex;
28
33
  clock: Clock;
29
34
  relations?: RelationLog;
35
+ /** 2.17.1 REQ-02 (R02): база идентичности копии (CLI — process.cwd()); дефолт — cwd. */
36
+ baseDir?: string;
37
+ /** Тестовый seam: резолвер identity (прод-дефолт — resolveWorktreeIdentity). */
38
+ resolveIdentity?: (baseDir: string) => WorktreeIdentity | null;
30
39
  }, input: {
31
40
  topic?: string;
32
41
  thread?: boolean | string;
@@ -36,7 +45,9 @@ export declare function getCallInjections(deps: {
36
45
  deliveredRegistry?: Record<string, string>;
37
46
  /** P212 (2.13 §5.3в): подсветка фасета (CLI-TTY); false/undefined → плоский текст. */
38
47
  colors?: boolean;
39
- /** WP3 §6.2: текущий scope доставки; undefined/'main' — main. */
48
+ /** WP3 §6.2 + 2.17.1 REQ-02 (R02): токен текущей копии — WT-ID
49
+ * (`w-<12 hex>` из resolveMemoryRoot().worktree, полный `worktree:…` тоже
50
+ * принят) либо undefined/'main' — main-вид: worktree-scoped объекты скрыты. */
40
51
  currentScope?: string;
41
52
  }): Promise<CallInjectionResult>;
42
53
  //# sourceMappingURL=get-call-injections.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-call-injections.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/get-call-injections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAQ/D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;4DACwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB;;kDAE8C;IAC9C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4FAA4F;IAC5F,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACjD;AAcD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,WAAW,CAAA;CAAE,EACxF,KAAK,EAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;yFACqF;IACrF,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sFAAsF;IACtF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACA,OAAO,CAAC,mBAAmB,CAAC,CAiL9B"}
1
+ {"version":3,"file":"get-call-injections.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/get-call-injections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAM/D,OAAO,EAA+C,KAAK,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAUtH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;4DACwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB;;kDAE8C;IAC9C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4FAA4F;IAC5F,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChD;;2FAEuF;IACvF,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAcD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IACJ,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,gBAAgB,GAAG,IAAI,CAAC;CAChE,EACD,KAAK,EAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;yFACqF;IACrF,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sFAAsF;IACtF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;mFAE+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACA,OAAO,CAAC,mBAAmB,CAAC,CAqO9B"}
@@ -2,7 +2,14 @@ import { tokenize } from '../../domain/solve/scenarios.js';
2
2
  import { finalScore } from '../../domain/solve/relevance.js';
3
3
  import { highlightFacet } from '../../domain/facet-colors.js';
4
4
  import { checksumBlock } from '../../adapters/fs/session-delivery-registry.js';
5
+ import { brokenWorktreeHint, resolveWorktreeIdentity } from '../../adapters/fs/memory-root.js';
5
6
  import { detectUnaggregatedLessons } from './detect-unaggregated-lessons.js';
7
+ const WT_PREFIX = 'worktree:';
8
+ /** Формат WT-ID-токена (design §3.2). Свой токен сравнивается с текущим напрямую;
9
+ * чужой WT-ID-токен НЕ сравнивается с текущим молча — падает в общий legacy-разбор
10
+ * ниже: каталог, названный `w-<12hex>`, маппится по basename или честно конфликтует
11
+ * (R2-01 fallthrough). */
12
+ const WT_ID_TOKEN = /^w-[0-9a-f]{12}$/;
6
13
  function formatBlock(obj, colors) {
7
14
  // P212 (2.13 §5.3в): фасет перед title — формат как в list; нет фасета → без скобок
8
15
  const facet = typeof obj.facet === 'string' ? obj.facet : null;
@@ -29,18 +36,48 @@ export async function getCallInjections(deps, input) {
29
36
  // migrate alias_origin исчезает и пул их не видит — задумано спекой 8.1)
30
37
  const injections = memoryObjects.filter((o) => o.status === 'active' &&
31
38
  (o.type === 'call-injection' || (o.type === 'note' && o.alias_origin === 'call-injection')));
32
- // WP3 §6.2 (спека 2.16): worktree-scoped объект виден только в той же ворктрии;
33
- // весь пайплайн ниже — на visible. scope без префикса worktree: ('main', rule-
34
- // легаси 'project'/'global') доставляется везде — гейтинг только для ворктрий.
39
+ // 2.17.1 REQ-02 (R02), design §3.2 (ADR-1/ADR-2): ЕДИНЫЙ предикат isVisible —
40
+ // единственная точка знания о scope; каждая ветвь отбора ниже обязана
41
+ // пропускать кандидатов через него до ранжирования. WT-ID сравнивается строго
42
+ // (без git); legacy-токен `worktree:<name>` маппится через идентичность копии
43
+ // (лениво, ≤1 git-подпроцесс на процесс — NFR-01); неоднозначное имя — честный
44
+ // конфликт (scopeConflicts), fail-closed: не видно никому.
35
45
  const current = input.currentScope ?? 'main';
46
+ const currentToken = current === 'main' ? null : current.startsWith(WT_PREFIX) ? current.slice(WT_PREFIX.length) : current;
36
47
  const scopeOf = (o) => {
37
48
  const s = o.scope;
38
- return typeof s === 'string' && s.startsWith('worktree:') ? s : null;
49
+ return typeof s === 'string' && s.startsWith(WT_PREFIX) ? s : null;
39
50
  };
40
- const visible = injections.filter((o) => {
51
+ const scopeConflicts = new Set();
52
+ let identity; // undefined — ещё не резолвили (лениво)
53
+ const identityOf = () => {
54
+ if (identity === undefined) {
55
+ identity = (deps.resolveIdentity ?? resolveWorktreeIdentity)(deps.baseDir ?? process.cwd());
56
+ }
57
+ return identity;
58
+ };
59
+ const isVisible = (o) => {
41
60
  const s = scopeOf(o);
42
- return s === null || s === current;
43
- });
61
+ if (s === null)
62
+ return true; // main/project/global — доставляются везде (как раньше)
63
+ if (currentToken === null)
64
+ return false; // main-вид: worktree-scoped невидимы
65
+ const token = s.slice(WT_PREFIX.length);
66
+ // Свой WT-ID — прямое сравнение. Чужой WT-ID-токен уходит в общий
67
+ // legacy-разбор (R2-01 fallthrough): маппинг по basename или конфликт.
68
+ if (WT_ID_TOKEN.test(token) && token === currentToken)
69
+ return true;
70
+ const id = identityOf();
71
+ if (id === null)
72
+ return false; // сбой git-метаданных — fail-closed (design §5)
73
+ if (token !== id.legacyName)
74
+ return false;
75
+ if (id.legacyUnique)
76
+ return true; // однозначное legacy-имя маппится на эту копию
77
+ scopeConflicts.add(s); // неоднозначное — честный конфликт, не тихое присвоение
78
+ return false;
79
+ };
80
+ const visible = injections.filter(isVisible);
44
81
  const hiddenCount = injections.length - visible.length;
45
82
  // 2. topic matching
46
83
  let matched;
@@ -72,18 +109,20 @@ export async function getCallInjections(deps, input) {
72
109
  };
73
110
  const lessons = activeOf('lesson');
74
111
  for (const l of lessons) {
75
- if (kwMatched(l) && !matched.some((m) => m.id === l.id))
112
+ if (isVisible(l) && kwMatched(l) && !matched.some((m) => m.id === l.id))
76
113
  matched.push(l);
77
114
  }
78
115
  const rules = activeOf('rule');
79
- const keywordRules = rules.filter((r) => !isMachineState(r) && kwMatched(r));
116
+ const keywordRules = rules.filter((r) => !isMachineState(r) && kwMatched(r) && isVisible(r));
80
117
  for (const r of keywordRules) {
81
118
  if (!matched.some((m) => m.id === r.id))
82
119
  matched.push(r);
83
120
  }
84
121
  // 3. fallback to rules if no matches (keyword-matched rules excluded)
85
122
  if (matched.length === 0) {
86
- matched = rules.filter((r) => !isMachineState(r) && !keywordRules.some((k) => k.id === r.id)).slice(0, 3);
123
+ matched = rules
124
+ .filter((r) => isVisible(r) && !isMachineState(r) && !keywordRules.some((k) => k.id === r.id))
125
+ .slice(0, 3);
87
126
  }
88
127
  }
89
128
  else {
@@ -94,7 +133,7 @@ export async function getCallInjections(deps, input) {
94
133
  const threadId = typeof input.thread === 'string' ? input.thread : null;
95
134
  const rules = activeOf('rule');
96
135
  for (const r of rules) {
97
- if (!isMachineState(r) && r.scope === 'project' && !matched.some((m) => m.id === r.id)) {
136
+ if (!isMachineState(r) && r.scope === 'project' && isVisible(r) && !matched.some((m) => m.id === r.id)) {
98
137
  matched.push(r);
99
138
  }
100
139
  }
@@ -105,7 +144,7 @@ export async function getCallInjections(deps, input) {
105
144
  o.type === 'note' &&
106
145
  (o.facet === 'pitfall' || o.alias_origin === 'blocker'));
107
146
  for (const b of blockers) {
108
- if (b.thread === threadId && !matched.some((m) => m.id === b.id)) {
147
+ if (b.thread === threadId && isVisible(b) && !matched.some((m) => m.id === b.id)) {
109
148
  matched.push(b);
110
149
  }
111
150
  }
@@ -164,6 +203,27 @@ export async function getCallInjections(deps, input) {
164
203
  'вызовите Стюарда: opencode run --agent steward';
165
204
  }
166
205
  }
206
+ // 2.17.1 REQ-02 (R02), design §3.2/§5: конфликт scope и битые git-метаданные —
207
+ // stderr-подсказка wolf call (CLI-слой не меняется; вывод сюда — единственный
208
+ // путь к stderr нетронутого memory-call.ts). Doctor подхватывает конфликт из
209
+ // результата своей задачей (T2).
210
+ if (scopeConflicts.size > 0) {
211
+ console.error(`[wolf] worktree scope conflict: ${[...scopeConflicts].join(', ')} — ` +
212
+ 'ambiguous legacy worktree name (two live checkouts share the basename); objects stay hidden until promoted');
213
+ }
214
+ if (currentToken === null) {
215
+ const hint = brokenWorktreeHint(deps.baseDir ?? process.cwd());
216
+ if (hint)
217
+ console.error(`[wolf] ${hint}`);
218
+ }
219
+ else if (identity === null) {
220
+ // design §5, второй sub-case: fs-парс .git успешен (WT-ID копии известен),
221
+ // но git worktree list упал — legacy-разбор fail-closed; предупреждение,
222
+ // не молчаливое скрытие (identity резолвился и вернул null; undefined —
223
+ // git не запускался, предупреждать не о чем).
224
+ console.error(`[wolf] git worktree metadata unavailable in ${deps.baseDir ?? process.cwd()} — ` +
225
+ 'legacy worktree scopes stay hidden (fail-closed)');
226
+ }
167
227
  return {
168
228
  blocks,
169
229
  truncated,
@@ -172,6 +232,7 @@ export async function getCallInjections(deps, input) {
172
232
  banner,
173
233
  poolSize: injections.length,
174
234
  hidden: hiddenCount > 0 ? { scope: current, count: hiddenCount } : null,
235
+ scopeConflicts: [...scopeConflicts],
175
236
  };
176
237
  }
177
238
  //# sourceMappingURL=get-call-injections.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-call-injections.js","sourceRoot":"","sources":["../../../src/app/use-cases/get-call-injections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-call-injections.js","sourceRoot":"","sources":["../../../src/app/use-cases/get-call-injections.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAyB,MAAM,kCAAkC,CAAC;AACtH,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAE7E,MAAM,SAAS,GAAG,WAAW,CAAC;AAC9B;;;0BAG0B;AAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAwBvC,SAAS,WAAW,CAAC,GAA4B,EAAE,MAAgB;IACjE,oFAAoF;IACpF,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,SAAS,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,gBAAgB,GAAG,CAAC,EAAE,EAAE,CAAC;AAC9G,CAAC;AAED,iGAAiG;AACjG,SAAS,cAAc,CAAC,GAA4B;IAClD,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAK,GAAG,CAAC,IAAkB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IASC,EACD,KAaC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,wEAAwE;IACxE,0EAA0E;IAC1E,wEAAwE;IACxE,8DAA8D;IAC9D,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAA8B,CAAC;IAC7E,MAAM,QAAQ,GAAG,CAAC,IAAY,EAA6B,EAAE,CAC3D,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IAExE,6BAA6B;IAC7B,0EAA0E;IAC1E,2EAA2E;IAC3E,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,KAAK,QAAQ;QACrB,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,YAAY,KAAK,gBAAgB,CAAC,CAAC,CAC9F,CAAC;IAEF,8EAA8E;IAC9E,sEAAsE;IACtE,8EAA8E;IAC9E,8EAA8E;IAC9E,+EAA+E;IAC/E,2DAA2D;IAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC;IAC7C,MAAM,YAAY,GAChB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACxG,MAAM,OAAO,GAAG,CAAC,CAA0B,EAAiB,EAAE;QAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAClB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,IAAI,QAA6C,CAAC,CAAC,wCAAwC;IAC3F,MAAM,UAAU,GAAG,GAA4B,EAAE;QAC/C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,CAA0B,EAAW,EAAE;QACxD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,wDAAwD;QACrF,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,CAAC,qCAAqC;QAC9E,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxC,kEAAkE;QAClE,uEAAuE;QACvE,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;QACnE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,CAAC,gDAAgD;QAC/E,IAAI,KAAK,KAAK,EAAE,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,EAAE,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,CAAC,+CAA+C;QACjF,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,wDAAwD;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAEvD,oBAAoB;IACpB,IAAI,OAAkC,CAAC;IACvC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,wEAAwE;QACxE,0DAA0D;QAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,IAAI,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC5F,KAAK,MAAM,CAAC,IAAI,OAAO;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,oFAAoF;YACtF,CAAC;QACH,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/B,MAAM,EAAE,GAAc,GAAG,CAAC,gBAA6B,IAAI,EAAE,CAAC;YAC9D,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACzD,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,wEAAwE;QACxE,2EAA2E;QAC3E,MAAM,SAAS,GAAG,CAAC,GAA4B,EAAW,EAAE;YAC1D,MAAM,EAAE,GAAc,GAAG,CAAC,gBAA6B,IAAI,EAAE,CAAC;YAC9D,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAA8B,CAAC;QAChE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAA8B,CAAC;QAC5D,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,sEAAsE;QACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,GAAG,KAAK;iBACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBAC7F,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC;IAED,4EAA4E;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAA8B,CAAC;QAC5D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,wEAAwE;YACxE,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CACnC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,KAAK,QAAQ;gBACrB,CAAC,CAAC,IAAI,KAAK,MAAM;gBAChB,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,CAAa,CACvE,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,MAAM,GAAG,OAAO;SACnB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,GAAG;QACH,KAAK,EAAE,UAAU,CACf;YACE,QAAQ,EAAE,CAAC;YACX,UAAU,EAAG,GAAG,CAAC,UAAqB,IAAI,GAAG;YAC7C,UAAU,EAAG,GAAG,CAAC,UAAqB,IAAI,QAAQ;YAClD,SAAS,EAAE,GAAG,CAAC,UAAoB;SACpC,EACD,GAAG,CACJ;KACF,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAErC,2EAA2E;IAC3E,wEAAwE;IACxE,8EAA8E;IAC9E,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,OAAO,GAAG,KAAK,CAAC,iBAAiB;QACrC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;YACxB,IAAI,KAAK,CAAC,iBAAkB,CAAC,GAAG,CAAC,EAAY,CAAC,KAAK,aAAa,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC9G,YAAY,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QACJ,CAAC,CAAC,MAAM,CAAC;IAEX,2EAA2E;IAC3E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IACtG,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC;YACpC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,yEAAyE;IACzE,0DAA0D;IAC1D,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,yBAAyB,CACtC,aAA0C,EAC1C,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAC3B,GAAG,CACJ,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM;gBACJ,4BAA4B,MAAM,CAAC,KAAK,aAAa,MAAM,CAAC,MAAM,MAAM;oBACxE,gDAAgD,CAAC;QACrD,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,8EAA8E;IAC9E,6EAA6E;IAC7E,iCAAiC;IACjC,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CACX,mCAAmC,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YACpE,4GAA4G,CAC/G,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/D,IAAI,IAAI;YAAE,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC7B,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,8CAA8C;QAC9C,OAAO,CAAC,KAAK,CACX,+CAA+C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK;YAC/E,kDAAkD,CACrD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM;QACN,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,MAAM;QACN,QAAQ,EAAE,UAAU,CAAC,MAAM;QAC3B,MAAM,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;QACvE,cAAc,EAAE,CAAC,GAAG,cAAc,CAAC;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { MemoryStore } from '../../ports/memory-store.port.js';
2
+ import { EventLog } from '../../ports/event-log.port.js';
3
+ import { Clock } from '../../ports/clock.port.js';
4
+ import { IdGenerator } from '../../ports/id-generator.port.js';
5
+ import { SearchIndex } from '../../ports/search-index.port.js';
6
+ import { MemoryLock } from '../../ports/memory-lock.port.js';
7
+ import { MemoryTypeDeclaration } from '../../domain/memory-types.js';
8
+ import { type FaceFaultInjector } from './face-operation.js';
9
+ /** Волна 2.17 T-05: идемпотентная физическая миграция legacy-записей лица в
10
+ * контракт face. Кандидат — запись, читаемая как note + facet howto + непустой
11
+ * owner_skill (включая legacy-тип playbook: alias-резолв P211 отдаёт его как
12
+ * note+howto); howto без owner_skill не мигрируется (AC4 — не всякий howto
13
+ * есть лицо).
14
+ *
15
+ * 2.17.1 REQ-04 (R05, design §3.4/ADR-4): миграция идёт на общей операции
16
+ * лица (createFaceVersion command 'migrate', механизм §3.3 — resume/abort
17
+ * в face-operation.ts), skip-логика заменена разбором состояния владельца:
18
+ * 1) незавершённая операция migrate в журнале → resume (детерминированно из
19
+ * input операции op_started);
20
+ * 2) лицо есть, активного legacy head нет → честный idempotent-skip;
21
+ * 3) лицо есть + активный legacy head + дословное совпадение face.reason с
22
+ * форматом волны 2.17 `migrated from playbook note <head.id> (2.17)`
23
+ * (anchored: точное равенство, без усечения) → healing-операция
24
+ * [supersede_legacy, announce] — body НИКОГДА не пишется (AC-3);
25
+ * 4) неоднозначности (несколько live-лиц, несколько активных head, reason не
26
+ * матчится) → report.conflicts + запись в failed (CLI даёт exit ≠ 0);
27
+ * записи не изменяются, «успех» не объявляется.
28
+ *
29
+ * Поэтапность (§Отказов): каждый owner_skill — независимая итерация; падение
30
+ * на N-м не откатывает N-1, ошибка попадает в report.failed, обход
31
+ * продолжается. Свой внешний lock НЕ держим: fresh-миграцию создаёт
32
+ * createFaceVersion под собственным lock, healing/resume-путь берёт тот же
33
+ * lock сам (FsMemoryLock не реентерабелен, прецедент tool-librarian.ts:167).
34
+ *
35
+ * Fresh-миграция передаёт legacyHeadId в операцию: supersede_legacy — шаг
36
+ * ТОЙ ЖЕ операции migrate между supersede_prev и announce (design §3.4/F9;
37
+ * закрыто решением L1 — allowlist на face-operation.ts). Healing-операция
38
+ * [supersede_legacy, announce] остаётся только для докомпьютерных частичных
39
+ * переходов (разбор 3: лицо создано волной 2.17.0 без op_id) и их
40
+ * дозавершения по незавершённой healing-записи в журнале. */
41
+ export interface MigrateFacesDeps {
42
+ store: MemoryStore;
43
+ log: EventLog;
44
+ clock: Clock;
45
+ idGen: IdGenerator;
46
+ index?: SearchIndex;
47
+ lock?: MemoryLock;
48
+ declarations?: readonly MemoryTypeDeclaration[];
49
+ env?: NodeJS.ProcessEnv;
50
+ /** Тестовый seam (test-plan REQ-03/REQ-04): fault(point) бросается после
51
+ * завершения шага; прод-код не задаёт. Прокидывается в операцию лица и
52
+ * в healing (точка supersede_legacy). */
53
+ fault?: FaceFaultInjector;
54
+ }
55
+ export interface MigrateOutcome {
56
+ ownerSkill: string;
57
+ action: 'migrated' | 'healed' | 'resumed' | 'skipped';
58
+ faceId?: string;
59
+ headId?: string;
60
+ reason: string;
61
+ }
62
+ export interface MigrateConflict {
63
+ ownerSkill: string;
64
+ kind: 'multiple-faces' | 'multiple-legacy-heads' | 'reason-mismatch' | 'broken-healing-op';
65
+ error: string;
66
+ }
67
+ export interface MigrateFacesReport {
68
+ outcomes: MigrateOutcome[];
69
+ /** REQ-02 AC4: howto-записи без owner_skill — не кандидаты (skip с отчётом). */
70
+ skippedHowtoIds: string[];
71
+ /** §Отказов: ошибки по владельцам; уже мигрированные N-1 остаются на месте.
72
+ * Дублирует конфликты — существующий CLI-маппинг (face.ts) даёт exit ≠ 0. */
73
+ failed: {
74
+ ownerSkill: string;
75
+ error: string;
76
+ }[];
77
+ /** §3.4 разбор 4: неоднозначные legacy-переходы — записи не изменены. */
78
+ conflicts: MigrateConflict[];
79
+ }
80
+ export declare function migrateFaces(deps: MigrateFacesDeps): Promise<MigrateFacesReport>;
81
+ //# sourceMappingURL=migrate-faces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-faces.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/migrate-faces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAMrE,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DA+B6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;6CAEyC;IACzC,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,gBAAgB,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;IAC3F,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,gFAAgF;IAChF,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B;iFAC6E;IAC7E,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChD,yEAAyE;IACzE,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AA6SD,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiCtF"}
@@ -0,0 +1,267 @@
1
+ import { resolveCreatedBy } from '../../domain/actor.js';
2
+ import { createFaceVersion } from './create-face-version.js';
3
+ import { supersedeMemoryObject } from './supersede-memory-object.js';
4
+ import { generateOpId } from './face-operation.js';
5
+ /** Дословный формат reason миграции волны 2.17 (migrate-faces.ts:95 той волны);
6
+ * детект healing — только точное равенство (anchored, с суффиксом), усечённое
7
+ * сравнение запрещено (ADR-4: риск «формат сломает детект» закрыт контрактом). */
8
+ function legacyMigrationReason(headId) {
9
+ return `migrated from playbook note ${headId} (2.17)`;
10
+ }
11
+ async function facesOfOwner(store, ownerSkill) {
12
+ return (await store.list({ type: 'face' }))
13
+ .filter((o) => o.owner_skill === ownerSkill)
14
+ .map((o) => o);
15
+ }
16
+ function parseMigrateOps(events) {
17
+ const ops = new Map();
18
+ let seq = 0;
19
+ for (const e of events) {
20
+ const opId = typeof e.payload['opId'] === 'string' ? e.payload['opId'] : null;
21
+ if (opId === null)
22
+ continue;
23
+ if (e.type === 'memory.face.op_started') {
24
+ if (e.payload['command'] !== 'migrate')
25
+ continue;
26
+ const plan = Array.isArray(e.payload['plan']) ? e.payload['plan'].map(String) : [];
27
+ ops.set(opId, {
28
+ opId,
29
+ ownerSkill: String(e.payload['owner_skill'] ?? ''),
30
+ healing: plan[0] !== 'add_face',
31
+ input: (e.payload['input'] ?? {}),
32
+ steps: new Set(),
33
+ seq: seq++,
34
+ });
35
+ }
36
+ else if (e.type === 'memory.face.op_step') {
37
+ const op = ops.get(opId);
38
+ if (op)
39
+ op.steps.add(String(e.payload['step']));
40
+ }
41
+ else if (e.type === 'memory.face.op_committed' || e.type === 'memory.face.op_aborted') {
42
+ // незавершённая = нет op_committed/op_aborted (как incompleteFaceOperations §3.3)
43
+ ops.delete(opId);
44
+ }
45
+ }
46
+ return ops;
47
+ }
48
+ async function appendFaceEvent(deps, type, payload, actor) {
49
+ const now = deps.clock.now();
50
+ await deps.log.append({ id: deps.idGen.generateEventId(now), type, timestamp: now.toISOString(), actor, payload });
51
+ }
52
+ /** FTS-индекс производный (§3.3): сбой его обновления не рушит healing —
53
+ * зеркалирует safeIndex face-operation.ts (обёртка без прототипного spread). */
54
+ function healingSafeIndex(deps, opId) {
55
+ const idx = deps.index;
56
+ if (!idx)
57
+ return undefined;
58
+ return {
59
+ rebuild: (objects) => idx.rebuild(objects),
60
+ indexObject: (o) => idx.indexObject(o).catch((err) => {
61
+ console.error(`face healing ${opId}: FTS index update failed (wolf doctor --repair rebuilds it): ${err instanceof Error ? err.message : String(err)}`);
62
+ }),
63
+ removeObject: (id) => idx.removeObject(id),
64
+ search: (q, o) => idx.search(q, o),
65
+ };
66
+ }
67
+ /** Healing-операция (§3.4 разбор 3): дозавершение доказуемо связанного
68
+ * legacy-перехода — ТОЛЬКО переходы статусов и события; body лица не пишется
69
+ * (REQ-04 AC-3). Каждый шаг идемпотентен (повторный supersede_legacy — skip);
70
+ * resume существующей незавершённой healing-операции — по её op_started input
71
+ * (faceId/headId записаны в него — resume детерминирован). Идёт под тем же
72
+ * MemoryLock, что и fresh-миграция (createFaceVersion берёт его сам; lock
73
+ * не реентерабелен — внутри шагов lock не берётся). */
74
+ async function healLegacyTransition(deps, ownerSkill, face, headId, existing, actor) {
75
+ const run = async () => {
76
+ let opId;
77
+ let done;
78
+ if (existing) {
79
+ opId = existing.opId;
80
+ done = existing.steps;
81
+ }
82
+ else {
83
+ opId = generateOpId(deps.clock);
84
+ await appendFaceEvent(deps, 'memory.face.op_started', {
85
+ opId,
86
+ command: 'migrate',
87
+ owner_skill: ownerSkill,
88
+ plan: ['supersede_legacy', 'announce'],
89
+ input: { command: 'migrate', ownerSkill, reason: face.reason, faceId: face.id, headId },
90
+ }, actor);
91
+ done = new Set();
92
+ }
93
+ // supersede_legacy — уже погашенный head не перезаписывается (идемпотентность)
94
+ const head = await deps.store.get(headId);
95
+ if (head && head.status !== 'superseded') {
96
+ await supersedeMemoryObject({ store: deps.store, log: deps.log, clock: deps.clock, idGen: deps.idGen, index: healingSafeIndex(deps, opId) }, headId, face.id);
97
+ }
98
+ if (!done.has('supersede_legacy')) {
99
+ await appendFaceEvent(deps, 'memory.face.op_step', { opId, step: 'supersede_legacy', detail: { head_id: headId, face_id: face.id } }, actor);
100
+ done.add('supersede_legacy');
101
+ }
102
+ deps.fault?.('supersede_legacy');
103
+ // announce — идемпотентен по событию memory.face.versioned(new = face)
104
+ const announced = (await deps.log.readAll()).some((e) => e.type === 'memory.face.versioned' && e.payload['new'] === face.id);
105
+ if (!announced) {
106
+ await appendFaceEvent(deps, 'memory.face.versioned', { owner_skill: ownerSkill, from: null, new: face.id, initiator: 'migration', reason: face.reason }, actor);
107
+ }
108
+ if (!done.has('announce')) {
109
+ await appendFaceEvent(deps, 'memory.face.op_step', { opId, step: 'announce' }, actor);
110
+ done.add('announce');
111
+ }
112
+ // op_committed — F7-крайний случай: дозаписывается повторным запуском
113
+ const committed = (await deps.log.readAll()).some((e) => e.type === 'memory.face.op_committed' && e.payload['opId'] === opId);
114
+ if (!committed) {
115
+ deps.fault?.('op_committed');
116
+ await appendFaceEvent(deps, 'memory.face.op_committed', { opId }, actor);
117
+ }
118
+ };
119
+ return deps.lock ? deps.lock.withLock(run) : run();
120
+ }
121
+ async function migrateOwner(deps, ownerSkill, records, actor) {
122
+ // §3.4 разбор 1: незавершённая операция migrate владельца → resume
123
+ const migrateOps = parseMigrateOps(await deps.log.readAll());
124
+ const lastUnfinished = (healing) => [...migrateOps.values()]
125
+ .filter((o) => o.healing === healing && o.ownerSkill === ownerSkill)
126
+ .sort((a, b) => a.seq - b.seq)
127
+ .pop() ?? null;
128
+ const unfinishedMigration = lastUnfinished(false);
129
+ let resumed = false;
130
+ if (unfinishedMigration) {
131
+ // input — JSON-чистый payload op_started (JSONL); недоверенные ключи createFaceVersion
132
+ // валидирует сам (reason/body обязательны, guard — до op_started)
133
+ await createFaceVersion(deps, unfinishedMigration.input);
134
+ resumed = true;
135
+ }
136
+ // разборы 2–4 — по фактическому состоянию store (журнал — намёк, store — истина)
137
+ const liveFaces = (await facesOfOwner(deps.store, ownerSkill)).filter((f) => f.status === 'active' || f.status === 'candidate');
138
+ const heads = (await Promise.all(records.map((r) => deps.store.get(r.id)))).filter((r) => r !== null && r.status !== 'superseded');
139
+ if (liveFaces.length > 1) {
140
+ return {
141
+ conflict: {
142
+ kind: 'multiple-faces',
143
+ error: `owner ${ownerSkill} has ${liveFaces.length} live faces (${liveFaces.map((f) => f.id).join(', ')}) — ambiguous, resolve manually`,
144
+ },
145
+ };
146
+ }
147
+ if (heads.length > 1) {
148
+ return {
149
+ conflict: {
150
+ kind: 'multiple-legacy-heads',
151
+ error: `owner ${ownerSkill} has ${heads.length} active legacy playbook notes (${heads.map((h) => h.id).join(', ')}) — ambiguous legacy head, resolve manually`,
152
+ },
153
+ };
154
+ }
155
+ // дозавершение незавершённой healing-операции (сбой внутри healing)
156
+ const unfinishedHealing = lastUnfinished(true);
157
+ if (unfinishedHealing) {
158
+ const faceId = typeof unfinishedHealing.input['faceId'] === 'string' ? unfinishedHealing.input['faceId'] : null;
159
+ const headId = typeof unfinishedHealing.input['headId'] === 'string' ? unfinishedHealing.input['headId'] : null;
160
+ const face = faceId ? (await deps.store.get(faceId)) : null;
161
+ if (!face || !headId) {
162
+ return {
163
+ conflict: {
164
+ kind: 'broken-healing-op',
165
+ error: `unfinished healing operation ${unfinishedHealing.opId} lacks face/head binding — resolve manually (wolf face recover ${unfinishedHealing.opId})`,
166
+ },
167
+ };
168
+ }
169
+ await healLegacyTransition(deps, ownerSkill, face, headId, unfinishedHealing, actor);
170
+ resumed = true;
171
+ }
172
+ if (liveFaces.length === 1) {
173
+ const face = liveFaces[0];
174
+ if (heads.length === 0) {
175
+ return {
176
+ outcome: {
177
+ ownerSkill,
178
+ action: resumed ? 'resumed' : 'skipped',
179
+ faceId: face.id,
180
+ reason: resumed
181
+ ? 'unfinished migration operation completed by re-run (resume)'
182
+ : 'face already exists and no active legacy head — idempotent, nothing to do',
183
+ },
184
+ };
185
+ }
186
+ const head = heads[0];
187
+ if (face.reason === legacyMigrationReason(head.id)) {
188
+ // доказуемая связь → healing; body не пишется (AC-3)
189
+ await healLegacyTransition(deps, ownerSkill, face, head.id, null, actor);
190
+ return {
191
+ outcome: {
192
+ ownerSkill,
193
+ action: resumed ? 'resumed' : 'healed',
194
+ faceId: face.id,
195
+ headId: head.id,
196
+ reason: `provable link by exact reason "${legacyMigrationReason(head.id)}" — legacy head superseded, face body untouched`,
197
+ },
198
+ };
199
+ }
200
+ return {
201
+ conflict: {
202
+ kind: 'reason-mismatch',
203
+ error: `face ${face.id} of ${ownerSkill} does not prove the link to active legacy head ${head.id} (expected exact reason "${legacyMigrationReason(head.id)}", got "${face.reason}") — not healing blindly, resolve manually`,
204
+ },
205
+ };
206
+ }
207
+ // fresh-миграция: дословный перенос (ADR-4 волны 2.17: FTS-совместимость router)
208
+ if (heads.length === 0) {
209
+ return {
210
+ outcome: {
211
+ ownerSkill,
212
+ action: 'skipped',
213
+ reason: 'no active playbook note — superseded chain stays legacy and reads as before',
214
+ },
215
+ };
216
+ }
217
+ const head = heads[0];
218
+ const reason = legacyMigrationReason(head.id);
219
+ const { face } = await createFaceVersion(deps, {
220
+ command: 'migrate',
221
+ ownerSkill,
222
+ reason,
223
+ title: head.title,
224
+ body: head.body,
225
+ tags: head.tags,
226
+ legacyHeadId: head.id,
227
+ });
228
+ return {
229
+ outcome: { ownerSkill, action: resumed ? 'resumed' : 'migrated', faceId: face.id, headId: head.id, reason },
230
+ };
231
+ }
232
+ export async function migrateFaces(deps) {
233
+ const skippedHowtoIds = [];
234
+ const byOwner = new Map();
235
+ for (const obj of await deps.store.list({ type: 'note', facet: 'howto' })) {
236
+ const owner = obj.owner_skill;
237
+ if (typeof owner !== 'string' || owner.trim() === '') {
238
+ skippedHowtoIds.push(obj.id);
239
+ continue;
240
+ }
241
+ const records = byOwner.get(owner) ?? [];
242
+ records.push(obj);
243
+ byOwner.set(owner, records);
244
+ }
245
+ const outcomes = [];
246
+ const failed = [];
247
+ const conflicts = [];
248
+ const actor = resolveCreatedBy(undefined, deps.env ?? process.env);
249
+ for (const [ownerSkill, records] of [...byOwner.entries()].sort(([a], [b]) => a.localeCompare(b))) {
250
+ try {
251
+ const result = await migrateOwner(deps, ownerSkill, records, actor);
252
+ if (result.conflict) {
253
+ conflicts.push({ ownerSkill, ...result.conflict });
254
+ // параллельная запись в failed: существующий CLI-маппинг даёт exit ≠ 0
255
+ failed.push({ ownerSkill, error: result.conflict.error });
256
+ }
257
+ else if (result.outcome) {
258
+ outcomes.push(result.outcome);
259
+ }
260
+ }
261
+ catch (err) {
262
+ failed.push({ ownerSkill, error: err instanceof Error ? err.message : String(err) });
263
+ }
264
+ }
265
+ return { outcomes, skippedHowtoIds, failed, conflicts };
266
+ }
267
+ //# sourceMappingURL=migrate-faces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-faces.js","sourceRoot":"","sources":["../../../src/app/use-cases/migrate-faces.ts"],"names":[],"mappings":"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"}