@principles/core 1.287.7 → 1.287.8

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 (61) hide show
  1. package/dist/principle-tree-ledger.d.ts +50 -0
  2. package/dist/principle-tree-ledger.d.ts.map +1 -1
  3. package/dist/principle-tree-ledger.js +133 -1
  4. package/dist/principle-tree-ledger.js.map +1 -1
  5. package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.d.ts +24 -0
  6. package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.d.ts.map +1 -1
  7. package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.js +36 -1
  8. package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.js.map +1 -1
  9. package/dist/runtime-v2/candidate-intake-service.d.ts +102 -3
  10. package/dist/runtime-v2/candidate-intake-service.d.ts.map +1 -1
  11. package/dist/runtime-v2/candidate-intake-service.js +280 -47
  12. package/dist/runtime-v2/candidate-intake-service.js.map +1 -1
  13. package/dist/runtime-v2/candidate-intake.d.ts +44 -0
  14. package/dist/runtime-v2/candidate-intake.d.ts.map +1 -1
  15. package/dist/runtime-v2/candidate-intake.js +7 -0
  16. package/dist/runtime-v2/candidate-intake.js.map +1 -1
  17. package/dist/runtime-v2/index.d.ts +6 -0
  18. package/dist/runtime-v2/index.d.ts.map +1 -1
  19. package/dist/runtime-v2/index.js +7 -0
  20. package/dist/runtime-v2/index.js.map +1 -1
  21. package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  22. package/dist/runtime-v2/pain-signal-bridge.js +14 -1
  23. package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  24. package/dist/runtime-v2/principle-reuse/reuse-domain.d.ts +89 -0
  25. package/dist/runtime-v2/principle-reuse/reuse-domain.d.ts.map +1 -0
  26. package/dist/runtime-v2/principle-reuse/reuse-domain.js +16 -0
  27. package/dist/runtime-v2/principle-reuse/reuse-domain.js.map +1 -0
  28. package/dist/runtime-v2/principle-reuse/reuse-proposal.d.ts +87 -0
  29. package/dist/runtime-v2/principle-reuse/reuse-proposal.d.ts.map +1 -0
  30. package/dist/runtime-v2/principle-reuse/reuse-proposal.js +99 -0
  31. package/dist/runtime-v2/principle-reuse/reuse-proposal.js.map +1 -0
  32. package/dist/runtime-v2/principle-reuse/reuse-retrieval.d.ts +36 -0
  33. package/dist/runtime-v2/principle-reuse/reuse-retrieval.d.ts.map +1 -0
  34. package/dist/runtime-v2/principle-reuse/reuse-retrieval.js +118 -0
  35. package/dist/runtime-v2/principle-reuse/reuse-retrieval.js.map +1 -0
  36. package/dist/runtime-v2/principle-reuse/reuse-shortlist.d.ts +40 -0
  37. package/dist/runtime-v2/principle-reuse/reuse-shortlist.d.ts.map +1 -0
  38. package/dist/runtime-v2/principle-reuse/reuse-shortlist.js +184 -0
  39. package/dist/runtime-v2/principle-reuse/reuse-shortlist.js.map +1 -0
  40. package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.d.ts +7 -0
  41. package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.d.ts.map +1 -1
  42. package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.js.map +1 -1
  43. package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.d.ts +1 -0
  44. package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.d.ts.map +1 -1
  45. package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.js +12 -0
  46. package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.js.map +1 -1
  47. package/dist/runtime-v2/store/runtime-state-manager.d.ts +5 -0
  48. package/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
  49. package/dist/runtime-v2/store/runtime-state-manager.js +8 -0
  50. package/dist/runtime-v2/store/runtime-state-manager.js.map +1 -1
  51. package/dist/runtime-v2/types/principle-schema.d.ts +65 -0
  52. package/dist/runtime-v2/types/principle-schema.d.ts.map +1 -1
  53. package/dist/runtime-v2/types/principle-schema.js +14 -0
  54. package/dist/runtime-v2/types/principle-schema.js.map +1 -1
  55. package/dist/runtime-v2/types/principle-tree-store.d.ts +12 -0
  56. package/dist/runtime-v2/types/principle-tree-store.d.ts.map +1 -1
  57. package/dist/telemetry-event.d.ts +2 -2
  58. package/dist/telemetry-event.d.ts.map +1 -1
  59. package/dist/telemetry-event.js +2 -0
  60. package/dist/telemetry-event.js.map +1 -1
  61. package/package.json +2 -2
@@ -4,12 +4,20 @@
4
4
  * Workflow:
5
5
  * 1. Validate input
6
6
  * 2. Check idempotency (existsForCandidate) — O(1) lookup
7
+ * 2b. Check durable reuse resolution replay (PRI-917 PR3B Phase 2) —
8
+ * a candidate already resolved into an existing Principle returns that
9
+ * resolution; no decision is re-asked, no Principle is created
7
10
  * 3. Load candidate from DB (RuntimeStateManager)
8
11
  * 3b. ★ Principle Ledger write boundary (Phase 1 / PR1) — see below
9
12
  * 4. Load artifact from DB and parse recommendation
10
13
  * 5. Build 11-field LedgerPrincipleEntry
11
14
  * 6. Write via adapter.writeProbationEntry()
12
15
  *
16
+ * 4d (PRI-917 Slice 2 + PR3B Phase 2) — the reuse gate sits between 4c and 5:
17
+ * a credible proposal + a `reuse` verdict is materialised as durable evidence
18
+ * on the selected Principle (appendReuseEvidence) and reported as a
19
+ * `reuse_selected` refusal; a `create` verdict proceeds exactly as before.
20
+ *
13
21
  * ── Principle Ledger write boundary (Phase 1 / PR1) ─────────────────────────
14
22
  * This service is the single shared chokepoint through which EVERY
15
23
  * candidate-origin write to the Principle Ledger flows (pd-cli `candidate
@@ -36,6 +44,9 @@
36
44
  import { randomUUID } from 'crypto';
37
45
  import { CandidateIntakeError, INTAKE_ERROR_CODES, isRecord, validateRecommendation } from './candidate-intake.js';
38
46
  import { isPrincipleLedgerEligibleKind, validateRecommendationKind, } from './store/candidate/recommendation-kind-resolver.js';
47
+ import { buildReuseProposal, proposalNeedsDecision } from './principle-reuse/reuse-proposal.js';
48
+ import { buildReuseShortlist } from './principle-reuse/reuse-retrieval.js';
49
+ import { validateReuseDecision } from './principle-reuse/reuse-proposal.js';
39
50
  /**
40
51
  * Normalize a DiagnosticianRecommendation-shaped object to the Recommendation
41
52
  * contract by mapping `description` → `text`. The diagnostician-committer stores
@@ -98,12 +109,72 @@ function extractRecommendationFromContentJson(parsed) {
98
109
  return validateRecommendation(norm);
99
110
  return null;
100
111
  }
112
+ export function extractIntakeRecommendation(candidate, artifact) {
113
+ const { candidateId } = candidate;
114
+ // 4b: the canonical source first.
115
+ const sourceRecJson = candidate.sourceRecommendationJson;
116
+ if (sourceRecJson && sourceRecJson.trim() !== '') {
117
+ try {
118
+ const parsed = JSON.parse(sourceRecJson);
119
+ const fromCandidate = validateRecommendation(parsed);
120
+ if (fromCandidate)
121
+ return { ok: true, recommendation: fromCandidate };
122
+ // diagnostician-committer stores a DiagnosticianRecommendation, whose
123
+ // body field is `description` (not `text`). Normalize that shape to the
124
+ // Recommendation contract. rc-4: validate the normalized value too.
125
+ const normalized = normalizeDiagnosticianRecommendation(parsed);
126
+ const fromNorm = normalized ? validateRecommendation(normalized) : null;
127
+ if (fromNorm)
128
+ return { ok: true, recommendation: fromNorm };
129
+ }
130
+ catch (err) {
131
+ // sourceRecommendationJson is non-empty but malformed — warn and fall through
132
+ const detail = err instanceof Error ? err.message : String(err);
133
+ console.warn(`[CandidateIntakeService] sourceRecommendationJson parse failed for candidate ${candidateId}: ${detail}. Falling back to artifact.contentJson.`);
134
+ }
135
+ }
136
+ // 4c: fall back to artifact.contentJson.
137
+ if (!artifact) {
138
+ return {
139
+ ok: false,
140
+ error: new CandidateIntakeError(INTAKE_ERROR_CODES.INPUT_INVALID, `Cannot extract recommendation for candidate ${candidateId}: no artifact content available`, { candidateId }),
141
+ };
142
+ }
143
+ try {
144
+ const parsed = JSON.parse(artifact.contentJson);
145
+ // Three historical shapes can land in contentJson:
146
+ // 1. { recommendation: {...} } — manual E2E wrapper
147
+ // 2. DiagnosticianOutputV1 — { summary, rootCause, recommendations: [...] }
148
+ // 3. bare Recommendation-like object
149
+ // rc-1/rc-2: parsed is untrusted — validate, never cast. rc-5: Object.hasOwn.
150
+ const rec = extractRecommendationFromContentJson(parsed);
151
+ if (!rec) {
152
+ return {
153
+ ok: false,
154
+ error: new CandidateIntakeError(INTAKE_ERROR_CODES.INPUT_INVALID, `Failed to parse artifact content for candidate ${candidateId}: contentJson is not a valid recommendation object`, { candidateId }),
155
+ };
156
+ }
157
+ return { ok: true, recommendation: rec };
158
+ }
159
+ catch (err) {
160
+ if (err instanceof CandidateIntakeError)
161
+ return { ok: false, error: err };
162
+ return {
163
+ ok: false,
164
+ error: new CandidateIntakeError(INTAKE_ERROR_CODES.INPUT_INVALID, `Failed to parse artifact content for candidate ${candidateId}: ${err instanceof Error ? err.message : String(err)}`, { candidateId, cause: err }),
165
+ };
166
+ }
167
+ }
101
168
  export class CandidateIntakeService {
102
169
  #stateManager;
103
170
  #ledgerAdapter;
171
+ #reuseDecision;
172
+ #reuseStateDir;
104
173
  constructor(opts) {
105
174
  this.#stateManager = opts.stateManager;
106
175
  this.#ledgerAdapter = opts.ledgerAdapter;
176
+ this.#reuseDecision = opts.reuseDecision;
177
+ this.#reuseStateDir = opts.reuseStateDir;
107
178
  }
108
179
  /**
109
180
  * Consume a pending candidate: load it and its artifact, build a
@@ -132,6 +203,34 @@ export class CandidateIntakeService {
132
203
  if (existing) {
133
204
  return { outcome: 'ledger_entry', written: false, entry: existing };
134
205
  }
206
+ // 2b. PRI-917 PR3B Phase 2 — durable reuse resolution replay (INV-R07).
207
+ //
208
+ // A candidate resolved by a recorded REUSE decision left its evidence on
209
+ // the target Principle and NO ledger principle of its own, so step 2
210
+ // cannot see it — without this check a replay would reach the gate again
211
+ // (re-asking the Owner) or, with the gate absent, fall through to CREATE
212
+ // and manufacture the very duplicate this feature exists to prevent.
213
+ //
214
+ // Unconditional (not gated on reuseDecision being injected): the
215
+ // resolution is durable persisted state, and honouring it is idempotency,
216
+ // not gate behaviour. Gate-unconfigured candidates WITHOUT a recorded
217
+ // resolution keep the exact pre-Phase-2 flow.
218
+ const resolved = this.#ledgerAdapter.findReuseResolutionForCandidate(candidateId);
219
+ if (resolved) {
220
+ return {
221
+ outcome: 'refused',
222
+ reason: 'reuse_selected',
223
+ candidateId,
224
+ // The candidate row is intentionally not loaded for a replay: the
225
+ // recorded evidence is itself the authoritative proof that this
226
+ // candidate was fully validated and resolved before.
227
+ rawRecommendationKind: null,
228
+ message: `Candidate ${candidateId} was already resolved into existing Principle ${resolved.principleId} by a ` +
229
+ 'recorded reuse decision; the decision was NOT asked again and no new Principle was created (INV-R07 replay).',
230
+ selectedPrincipleId: resolved.principleId,
231
+ reuseEvidence: resolved.evidence,
232
+ };
233
+ }
135
234
  // 3. Load candidate from DB
136
235
  const candidate = await this.#stateManager.getCandidate(candidateId);
137
236
  if (!candidate) {
@@ -171,57 +270,144 @@ export class CandidateIntakeService {
171
270
  if (!artifact) {
172
271
  throw new CandidateIntakeError(INTAKE_ERROR_CODES.ARTIFACT_NOT_FOUND, `Artifact ${candidate.artifactId} not found for candidate ${candidateId}`, { candidateId, artifactId: candidate.artifactId });
173
272
  }
174
- // 4b. Parse recommendation from candidate.sourceRecommendationJson FIRST (canonical source)
175
- // Fall back to artifact.contentJson for backwards-compatibility with legacy/manual inserts.
176
- let recommendation;
177
- const sourceRecJson = candidate.sourceRecommendationJson;
178
- try {
179
- if (sourceRecJson && sourceRecJson.trim() !== '') {
180
- // rc-1/rc-2 (ERR-001/ERR-005): candidate JSON is untrusted — validate shape,
181
- // never cast directly. validateRecommendation returns null on bad shape;
182
- // a null result falls through to the contentJson branch below.
183
- const parsed = JSON.parse(sourceRecJson);
184
- const fromCandidate = validateRecommendation(parsed);
185
- if (fromCandidate) {
186
- recommendation = fromCandidate;
187
- }
188
- else {
189
- // diagnostician-committer stores a DiagnosticianRecommendation, whose
190
- // body field is `description` (not `text`). Normalize that shape to the
191
- // Recommendation contract so the canonical source path is preferred over
192
- // the contentJson fallback. rc-4: validate the normalized value too.
193
- const normalized = normalizeDiagnosticianRecommendation(parsed);
194
- const fromNorm = normalized ? validateRecommendation(normalized) : null;
195
- if (fromNorm) {
196
- recommendation = fromNorm;
197
- }
198
- }
199
- }
273
+ // 4b/4c. Extract the recommendation via the SHARED semantics extraction
274
+ // (PRI-917 PR3A C4) — the exact logic `pd candidate review` uses to show
275
+ // the Owner what this candidate claims, so proposal and intake can never
276
+ // disagree about the input. Failures carry the same CandidateIntakeError
277
+ // this method always threw.
278
+ const extracted = extractIntakeRecommendation(candidate, artifact);
279
+ if (!extracted.ok) {
280
+ throw extracted.error;
200
281
  }
201
- catch (err) {
202
- // sourceRecommendationJson is non-empty but malformed — warn and fall through
203
- const detail = err instanceof Error ? err.message : String(err);
204
- console.warn(`[CandidateIntakeService] sourceRecommendationJson parse failed for candidate ${candidateId}: ${detail}. Falling back to artifact.contentJson.`);
282
+ const recommendation = extracted.recommendation;
283
+ // 4d. PRI-917 Slice 2 — reuse gate.
284
+ //
285
+ // Sits between "we know what this candidate claims" (4c) and "we mint a new
286
+ // canonical identity for it" (5), which is the only place a duplicate can
287
+ // still be prevented without changing any downstream contract.
288
+ //
289
+ // Three shapes, and the default one is "no gate":
290
+ // not_configured — no decision function injected (today's production);
291
+ // the write proceeds EXACTLY as before.
292
+ // no_candidates — the gate ran and found nothing credible.
293
+ // reuse_selected — the Owner/AI Owner answered `reuse`; nothing is
294
+ // written. Encoded as a refusal disposition to keep
295
+ // the result-union shape stable. See the ⚠ note on
296
+ // LedgerRefusalReason: shape-compatible does NOT
297
+ // mean message-compatible — consumers with
298
+ // refusal-specific wording must branch on
299
+ // `reason === 'reuse_selected'` before reuse ships.
300
+ //
301
+ // A retrieval failure NEVER falls through to create (rc-9): it throws, so
302
+ // the candidate stays pending and visible instead of silently manufacturing
303
+ // the duplicate this gate exists to prevent.
304
+ //
305
+ // PRI-917 hardening: a HALF-configured gate is a configuration error, not
306
+ // a disabled one. Previously a decision function without a state dir
307
+ // skipped the gate silently while still reporting 'not_configured', so a
308
+ // one-option misconfiguration looked exactly like "the gate is off" and
309
+ // wrote duplicates without ever asking.
310
+ if (this.#reuseDecision && !this.#reuseStateDir) {
311
+ throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse gate is misconfigured: reuseDecision was provided without reuseStateDir; no Principle was created for candidate ${candidateId}. nextAction: pass reuseStateDir, or remove reuseDecision to disable the gate.`, { candidateId, reason: 'reuse_gate_misconfigured' });
205
312
  }
206
- // 4c. Fall back to artifact.contentJson if no valid sourceRecommendationJson
207
- if (!recommendation) {
313
+ let reuseCheck = 'not_configured';
314
+ if (this.#reuseDecision && this.#reuseStateDir) {
315
+ let proposal;
208
316
  try {
209
- const parsed = JSON.parse(artifact.contentJson);
210
- // Three historical shapes can land in contentJson:
211
- // 1. { recommendation: {...} } — manual E2E wrapper
212
- // 2. DiagnosticianOutputV1 — { summary, rootCause, recommendations: [...] }
213
- // 3. bare Recommendation-like object
214
- // rc-1/rc-2: parsed is untrusted — validate, never cast. rc-5: Object.hasOwn.
215
- const rec = extractRecommendationFromContentJson(parsed);
216
- if (!rec) {
217
- throw new CandidateIntakeError(INTAKE_ERROR_CODES.INPUT_INVALID, `Failed to parse artifact content for candidate ${candidateId}: contentJson is not a valid recommendation object`, { candidateId });
317
+ proposal = buildReuseProposal(candidateId, buildReuseShortlist({
318
+ text: recommendation.text || candidate.description || '',
319
+ triggerPattern: recommendation.triggerPattern ?? '',
320
+ action: recommendation.action ?? '',
321
+ }, this.#reuseStateDir,
322
+ // Single truth: the persisted candidate's own kind. Step 3b has
323
+ // already proved eligibility fail-closed, so this is a restatement,
324
+ // never a second source a caller can override.
325
+ { recommendationKind: candidate.rawRecommendationKind }));
326
+ }
327
+ catch (reuseErr) {
328
+ throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse check could not be completed for candidate ${candidateId}; no Principle was created. Cause: ${reuseErr instanceof Error ? reuseErr.message : String(reuseErr)}`, { candidateId, cause: reuseErr });
329
+ }
330
+ if (proposalNeedsDecision(proposal)) {
331
+ // PRI-917 hardening: the decision function is an UNTRUSTED boundary
332
+ // (an AI Owner parses model output), so its return value is validated
333
+ // at runtime. Previously anything that was not exactly 'reuse' fell
334
+ // through to 'create' — a malformed answer silently manufactured the
335
+ // very duplicate this gate exists to prevent (rc-1/rc-2/rc-3).
336
+ let decision;
337
+ try {
338
+ const raw = this.#reuseDecision(proposal);
339
+ const validated = validateReuseDecision(raw);
340
+ if (!validated.ok) {
341
+ throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} is not a valid reuse|create decision (${validated.reason}); no Principle was created.`, { candidateId, reason: validated.reason });
342
+ }
343
+ ({ decision } = validated);
344
+ }
345
+ catch (decisionErr) {
346
+ if (decisionErr instanceof CandidateIntakeError)
347
+ throw decisionErr;
348
+ // A throwing decision function (LLM timeout, parse crash) is a reuse
349
+ // check failure, not an internal error: it must fail closed with a
350
+ // candidate-scoped code rather than escaping as an arbitrary throw.
351
+ throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} failed (${decisionErr instanceof Error ? decisionErr.message : String(decisionErr)}); no Principle was created.`, { candidateId, cause: decisionErr });
218
352
  }
219
- recommendation = rec;
353
+ if (decision.decision === 'reuse') {
354
+ const known = new Set(proposal.candidates.map((c) => c.principleId));
355
+ if (!known.has(decision.selectedPrincipleId)) {
356
+ // INV-R08: a selection outside the proposal fails closed. It must
357
+ // NOT silently degrade into "create". This is a defect in the
358
+ // reuse decision contract, not a malformed intake input, so it
359
+ // carries REUSE_CHECK_FAILED rather than INPUT_INVALID — the
360
+ // latter would file a governance error under "bad input".
361
+ throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision selected principle '${decision.selectedPrincipleId}' which is not in the proposal for candidate ${candidateId}; no Principle was created.`, { candidateId, selectedPrincipleId: decision.selectedPrincipleId, reason: 'selected_principle_not_in_proposal' });
362
+ }
363
+ // PRI-917 PR3B Phase 2 — materialise the verdict as durable evidence
364
+ // BEFORE reporting it. A reuse verdict that is not persisted would
365
+ // leave the resolution invisible: replay would re-ask the Owner, and
366
+ // the SPEC §11/§12 asymmetry (REUSE must be auditable, CREATE's
367
+ // artifact speaks for itself) would silently break. The write runs
368
+ // INSIDE the ledger's single-writer lock (appendReuseEvidence) and is
369
+ // fail-closed: an integrity/shape failure propagates and the
370
+ // candidate stays pending — it NEVER degrades into creating a
371
+ // Principle (INV-R03/INV-R08).
372
+ const painId = await this.#resolveReusePainId(candidateId, candidate);
373
+ let evidence;
374
+ try {
375
+ const appended = this.#ledgerAdapter.appendReuseEvidence(decision.selectedPrincipleId, {
376
+ painId,
377
+ candidateId,
378
+ decision: 'reuse',
379
+ actor: decision.actor,
380
+ reason: decision.reason,
381
+ decidedAt: decision.decidedAt,
382
+ });
383
+ // The writer either appended this candidate's entry or returned the
384
+ // already-recorded one (concurrent-intake dedupe) — the entry for
385
+ // THIS candidateId must be present; anything else is a broken
386
+ // adapter and fails loud instead of reporting a fabricated record.
387
+ const recorded = appended.reuseEvidence.find((e) => e.candidateId === candidateId);
388
+ if (!recorded) {
389
+ throw new Error(`appendReuseEvidence returned no evidence entry for candidate ${candidateId} (adapter contract violation)`);
390
+ }
391
+ evidence = recorded;
392
+ }
393
+ catch (evidenceErr) {
394
+ throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} could not be recorded on principle '${decision.selectedPrincipleId}'; no Principle was created and the decision is not durable. Cause: ${evidenceErr instanceof Error ? evidenceErr.message : String(evidenceErr)}`, { candidateId, selectedPrincipleId: decision.selectedPrincipleId, cause: evidenceErr });
395
+ }
396
+ return {
397
+ outcome: 'refused',
398
+ reason: 'reuse_selected',
399
+ candidateId,
400
+ rawRecommendationKind: typeof candidate.rawRecommendationKind === 'string' ? candidate.rawRecommendationKind : null,
401
+ message: `Candidate ${candidateId} was resolved to existing Principle ${decision.selectedPrincipleId}; the reuse decision was recorded on that Principle's reuseEvidence and no new Principle was created. This candidate DOES target the Principle Ledger — review the reuse proposal, and do not re-run intake to force a new Principle.`,
402
+ reuseProposal: proposal,
403
+ selectedPrincipleId: decision.selectedPrincipleId,
404
+ reuseEvidence: evidence,
405
+ };
406
+ }
407
+ reuseCheck = 'create_decided';
220
408
  }
221
- catch (err) {
222
- if (err instanceof CandidateIntakeError)
223
- throw err;
224
- throw new CandidateIntakeError(INTAKE_ERROR_CODES.INPUT_INVALID, `Failed to parse artifact content for candidate ${candidateId}: ${err instanceof Error ? err.message : String(err)}`, { candidateId, cause: err });
409
+ else {
410
+ reuseCheck = 'no_candidates';
225
411
  }
226
412
  }
227
413
  // 5. Build 11-field LedgerPrincipleEntry (E-06)
@@ -241,7 +427,7 @@ export class CandidateIntakeService {
241
427
  // 6. Write to ledger via adapter (E-01, D-09)
242
428
  try {
243
429
  const written = this.#ledgerAdapter.writeProbationEntry(entry);
244
- return { outcome: 'ledger_entry', written: true, entry: written };
430
+ return { outcome: 'ledger_entry', written: true, entry: written, reuseCheck };
245
431
  }
246
432
  catch (err) {
247
433
  if (err instanceof CandidateIntakeError) {
@@ -250,5 +436,52 @@ export class CandidateIntakeService {
250
436
  throw new CandidateIntakeError(INTAKE_ERROR_CODES.LEDGER_WRITE_FAILED, `Failed to write ledger entry for candidate ${candidateId}`, { candidateId, cause: err });
251
437
  }
252
438
  }
439
+ /**
440
+ * PRI-917 PR3B Phase 2 — resolve the Pain behind a candidate for its reuse
441
+ * evidence entry (SPEC v0.2.1 §12 requires a non-empty `painId`).
442
+ *
443
+ * `principle_candidates` carries NO pain column (audit F5); the durable
444
+ * bridge is `pain_diagnoses(task_id → pain_id)`, written by the diagnosis
445
+ * persistence path. Rows for one task are re-diagnoses / mixed attributions,
446
+ * so the LATEST row wins — ordered by (createdAt, id) for determinism.
447
+ *
448
+ * Fail-closed: a candidate with no resolvable Pain cannot produce a
449
+ * self-contained evidence entry, so the reuse decision is refused
450
+ * (`reuse_pain_unresolvable`) instead of writing a fabricated painId (rc-3).
451
+ * The candidate stays pending; no Principle is created.
452
+ */
453
+ async #resolveReusePainId(candidateId, candidate) {
454
+ const refuse = (detail) => {
455
+ throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} cannot be recorded: ${detail} ` +
456
+ 'The evidence entry requires the Pain that re-validated the Principle. ' +
457
+ 'nextAction: ensure the candidate\'s diagnostician task has a persisted pain diagnosis (pain_diagnoses), then retry intake.', { candidateId, reason: 'reuse_pain_unresolvable' });
458
+ };
459
+ if (typeof candidate.taskId !== 'string' || candidate.taskId === '') {
460
+ refuse('the candidate has no diagnostician task reference');
461
+ }
462
+ let diagnoses;
463
+ try {
464
+ diagnoses = await this.#stateManager.getDiagnosesByTaskId(candidate.taskId);
465
+ }
466
+ catch (err) {
467
+ throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} cannot be recorded: the pain diagnosis lookup failed. Cause: ${err instanceof Error ? err.message : String(err)}`, { candidateId, reason: 'reuse_pain_unresolvable', cause: err });
468
+ }
469
+ if (diagnoses.length === 0) {
470
+ refuse('no persisted pain diagnosis exists for its task');
471
+ }
472
+ const sorted = [...diagnoses].sort((a, b) => {
473
+ if (a.createdAt !== b.createdAt)
474
+ return a.createdAt < b.createdAt ? -1 : 1;
475
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
476
+ });
477
+ const latest = sorted.at(-1);
478
+ const latestPainId = typeof latest?.painId === 'string' ? latest.painId : '';
479
+ if (latestPainId === '') {
480
+ // Empty history or a latest row without a usable pain id — either way
481
+ // no fabricated value is written (rc-3).
482
+ refuse('no usable pain id in the candidate\'s diagnosis history');
483
+ }
484
+ return latestPainId;
485
+ }
253
486
  }
254
487
  //# sourceMappingURL=candidate-intake-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-intake-service.js","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"candidate-intake-service.js","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake-service.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,7 @@
62
62
  * reviewCycle: undefined
63
63
  */
64
64
  import { type Static } from '@sinclair/typebox';
65
+ import type { ReuseEvidenceEntry } from './types/principle-schema.js';
65
66
  export declare const CandidateIntakeInputSchema: import("@sinclair/typebox").TObject<{
66
67
  candidateId: import("@sinclair/typebox").TString;
67
68
  workspaceDir: import("@sinclair/typebox").TString;
@@ -192,6 +193,13 @@ export declare const INTAKE_ERROR_CODES: {
192
193
  readonly ARTIFACT_NOT_FOUND: 'artifact_not_found';
193
194
  readonly LEDGER_WRITE_FAILED: 'ledger_write_failed';
194
195
  readonly INPUT_INVALID: 'input_invalid';
196
+ /**
197
+ * PRI-917 Slice 2 — the reuse gate ran and could not complete (ledger
198
+ * unreadable, shortlist construction failed). Thrown rather than falling
199
+ * through to create: a failed reuse check must not silently manufacture the
200
+ * very duplicate the gate exists to prevent (rc-9).
201
+ */
202
+ readonly REUSE_CHECK_FAILED: 'reuse_check_failed';
195
203
  };
196
204
  /**
197
205
  * Candidate intake error with structured code and optional context.
@@ -253,5 +261,41 @@ export interface LedgerAdapter {
253
261
  * @returns The existing LedgerPrincipleEntry if found, null otherwise.
254
262
  */
255
263
  existsForCandidate(candidateId: string): LedgerPrincipleEntry | null;
264
+ /**
265
+ * PRI-917 PR3B Phase 2 — look up the durable reuse resolution for a
266
+ * candidate, if one was ever recorded: the evidence entry whose
267
+ * `candidateId` matches, plus the Principle it resolved into.
268
+ *
269
+ * This is the REUSE-side counterpart of {@link existsForCandidate} and is
270
+ * deliberately a SEPARATE method: existsForCandidate keeps its
271
+ * derivedFromPainIds-based create-path idempotency semantics untouched
272
+ * (SPEC v0.2.1 §12 — that field is never repurposed for reuse).
273
+ *
274
+ * @param candidateId — The candidate to look up.
275
+ * @returns The recorded resolution (principle id + evidence entry), or null
276
+ * when this candidate has never been resolved by a reuse decision.
277
+ */
278
+ findReuseResolutionForCandidate(candidateId: string): {
279
+ principleId: string;
280
+ evidence: ReuseEvidenceEntry;
281
+ } | null;
282
+ /**
283
+ * PRI-917 PR3B Phase 2 — persist one reuse resolution: append the evidence
284
+ * entry to the Principle's `reuseEvidence[]` inside the single-writer
285
+ * ledger lock. Implementations delegate to the core appendReuseEvidence
286
+ * writer (fail-closed on corruption, idempotent per candidateId,
287
+ * append-only).
288
+ *
289
+ * @param principleId — The reused Principle (canonical ledger UUID).
290
+ * @param entry — The evidence entry (painId/candidateId/decision/actor/
291
+ * reason/decidedAt[/decisionId]).
292
+ * @throws on integrity/shape failures — the caller must NOT fall back to
293
+ * creating a Principle (INV-R03/INV-R08).
294
+ */
295
+ appendReuseEvidence(principleId: string, entry: ReuseEvidenceEntry): {
296
+ principleId: string;
297
+ reuseEvidence: ReuseEvidenceEntry[];
298
+ appended: boolean;
299
+ };
256
300
  }
257
301
  //# sourceMappingURL=candidate-intake.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-intake.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAItD,eAAO,MAAM,0BAA0B;;;EAGrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE7E,eAAO,MAAM,2BAA2B;;;;;EAKtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;EAYrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAI7E;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAUD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAiB1E;AAID;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB;aAC7B,mBAAmB,EAAE,qBAAqB;aAC1C,0BAA0B,EAAE,4BAA4B;aACxD,kBAAkB,EAAE,oBAAoB;aACxC,mBAAmB,EAAE,qBAAqB;aAC1C,aAAa,EAAE,eAAe;CACtB,CAAC;AAEX;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,IAAI,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC;aAElE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAHnD,YACkB,IAAI,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,EAClF,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA,EAIlD;CACF;AAID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,oBAAoB,CAAC;IAEvE;;;;;;;;;;;;;;OAcG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;CACtE"}
1
+ {"version":3,"file":"candidate-intake.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAItE,eAAO,MAAM,0BAA0B;;;EAGrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE7E,eAAO,MAAM,2BAA2B;;;;;EAKtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;EAYrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAI7E;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAUD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAiB1E;AAID;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB;aAC7B,mBAAmB,EAAE,qBAAqB;aAC1C,0BAA0B,EAAE,4BAA4B;aACxD,kBAAkB,EAAE,oBAAoB;aACxC,mBAAmB,EAAE,qBAAqB;aAC1C,aAAa,EAAE,eAAe;IAC9B;;;;;OAKG;aACH,kBAAkB,EAAE,oBAAoB;CAChC,CAAC;AAEX;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,IAAI,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC;aAElE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAHnD,YACkB,IAAI,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,EAClF,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA,EAIlD;CACF;AAID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,oBAAoB,CAAC;IAEvE;;;;;;;;;;;;;;OAcG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;IAErE;;;;;;;;;;;;;OAaG;IACH,+BAA+B,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,kBAAkB,CAAA;KAAE,GAAG,IAAI,CAAC;IAEnH;;;;;;;;;;;;OAYG;IACH,mBAAmB,CACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,kBAAkB,GACxB;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,kBAAkB,EAAE,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;CACpF"}
@@ -201,6 +201,13 @@ export const INTAKE_ERROR_CODES = {
201
201
  ARTIFACT_NOT_FOUND: 'artifact_not_found',
202
202
  LEDGER_WRITE_FAILED: 'ledger_write_failed',
203
203
  INPUT_INVALID: 'input_invalid',
204
+ /**
205
+ * PRI-917 Slice 2 — the reuse gate ran and could not complete (ledger
206
+ * unreadable, shortlist construction failed). Thrown rather than falling
207
+ * through to create: a failed reuse check must not silently manufacture the
208
+ * very duplicate the gate exists to prevent (rc-9).
209
+ */
210
+ REUSE_CHECK_FAILED: 'reuse_check_failed',
204
211
  };
205
212
  /**
206
213
  * Candidate intake error with structured code and optional context.
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-intake.js","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAEtD,6EAA6E;AAE7E,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,MAAM,CAAC;IACpD,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC1C,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CAC5C,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CAAC;IACrD,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE;IAC1B,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE;IACzB,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;CACjC,CAAC,CAAC;AAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,MAAM,CAAC;IACpD,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACpC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IACjC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAC5C,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,EAA2B,8CAA8C;IACjG,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAY,8CAA8C;IACnG,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAe,sCAAsC;IAC1F,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE;CACzB,CAAC,CAAC;AA0BH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,4BAA4B,GAAG;IACnC,OAAO;IACP,MAAM;IACN,gBAAgB;IAChB,QAAQ;IACR,qBAAqB;CACb,CAAC;AAEX;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,4BAA4B,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACvC,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IACD,8EAA8E;IAC9E,4EAA4E;IAC5E,sEAAsE;IACtE,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAChC,6EAA6E;IAC7E,uEAAuE;IACvE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4EAA4E;AAE5E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,mBAAmB,EAAE,qBAAqB;IAC1C,0BAA0B,EAAE,4BAA4B;IACxD,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,aAAa,EAAE,eAAe;CACtB,CAAC;AAEX;;;;;;;;;;GAUG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAE3B,IAAI;IAEJ,OAAO;IAHzB,YACkB,IAAkE,EAClF,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;oBAJC,IAAI;uBAEJ,OAAO;QAGvB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
1
+ {"version":3,"file":"candidate-intake.js","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake.ts"],"names":[],"mappings":"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"}
@@ -61,6 +61,12 @@ export type { CandidateIntakeInput, CandidateIntakeOutput, LedgerPrincipleEntry,
61
61
  export { validateRecommendation } from './candidate-intake.js';
62
62
  export { CandidateIntakeService } from './candidate-intake-service.js';
63
63
  export type { CandidateIntakeServiceOptions } from './candidate-intake-service.js';
64
+ export { extractIntakeRecommendation } from './candidate-intake-service.js';
65
+ export type { CandidateRecommendationExtraction, CandidateIntakeResult } from './candidate-intake-service.js';
66
+ export { buildReuseProposal, proposalNeedsDecision } from './principle-reuse/reuse-proposal.js';
67
+ export type { ReuseProposal, ReuseProposalEntry, ReuseDecision } from './principle-reuse/reuse-proposal.js';
68
+ export { buildReuseShortlist } from './principle-reuse/reuse-retrieval.js';
69
+ export { isPrincipleLedgerEligibleKind } from './store/candidate/recommendation-kind-resolver.js';
64
70
  export { SqliteTaskStore } from './store/task/sqlite-task-store.js';
65
71
  export type { FailedTaskSummary, FailedTaskDetail, FailedTaskFilter } from './store/task/task-types.js';
66
72
  export { SqliteRunStore, MalformedRunError } from './store/run/sqlite-run-store.js';