humanish 0.89.1 → 0.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +15 -0
  2. package/dist/automatic-analysis-completion.d.ts +25 -0
  3. package/dist/automatic-analysis-completion.js +54 -0
  4. package/dist/automatic-analysis-completion.js.map +1 -0
  5. package/dist/automatic-analysis-config.d.ts +17 -0
  6. package/dist/automatic-analysis-config.js +31 -0
  7. package/dist/automatic-analysis-config.js.map +1 -0
  8. package/dist/automatic-study-analysis.d.ts +12 -0
  9. package/dist/automatic-study-analysis.js +168 -0
  10. package/dist/automatic-study-analysis.js.map +1 -0
  11. package/dist/concurrent-shared-world-lab.d.ts +4 -2
  12. package/dist/concurrent-shared-world-lab.js +10 -3
  13. package/dist/concurrent-shared-world-lab.js.map +1 -1
  14. package/dist/cua-actor-lab.d.ts +4 -2
  15. package/dist/cua-actor-lab.js +10 -5
  16. package/dist/cua-actor-lab.js.map +1 -1
  17. package/dist/e2b-terminal-lab.d.ts +4 -2
  18. package/dist/e2b-terminal-lab.js +10 -3
  19. package/dist/e2b-terminal-lab.js.map +1 -1
  20. package/dist/export-bundle.js +2 -0
  21. package/dist/export-bundle.js.map +1 -1
  22. package/dist/index.d.ts +4 -0
  23. package/dist/index.js +1 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/lab-config.d.ts +5 -0
  26. package/dist/lab-config.js +21 -2
  27. package/dist/lab-config.js.map +1 -1
  28. package/dist/lab-engine.d.ts +2 -0
  29. package/dist/lab-engine.js +12 -3
  30. package/dist/lab-engine.js.map +1 -1
  31. package/dist/lab-summary.d.ts +4 -0
  32. package/dist/lab-summary.js +3 -0
  33. package/dist/lab-summary.js.map +1 -1
  34. package/dist/observer-app.html +9 -9
  35. package/dist/observer.d.ts +3 -0
  36. package/dist/observer.js +23 -6
  37. package/dist/observer.js.map +1 -1
  38. package/dist/oss-lab.d.ts +1 -1
  39. package/dist/oss-lab.js.map +1 -1
  40. package/dist/oss-meta-lab.d.ts +1 -1
  41. package/dist/oss-meta-lab.js.map +1 -1
  42. package/dist/program.d.ts +5 -0
  43. package/dist/program.js +42 -7
  44. package/dist/program.js.map +1 -1
  45. package/dist/run-detail.d.ts +2 -0
  46. package/dist/run-detail.js +3 -0
  47. package/dist/run-detail.js.map +1 -1
  48. package/dist/run.d.ts +1 -1
  49. package/dist/run.js.map +1 -1
  50. package/dist/scripted-browser-lab.d.ts +4 -2
  51. package/dist/scripted-browser-lab.js +10 -5
  52. package/dist/scripted-browser-lab.js.map +1 -1
  53. package/dist/shared-world-lab.d.ts +4 -2
  54. package/dist/shared-world-lab.js +10 -3
  55. package/dist/shared-world-lab.js.map +1 -1
  56. package/dist/study-analysis-engine.d.ts +6 -1
  57. package/dist/study-analysis-engine.js +17 -3
  58. package/dist/study-analysis-engine.js.map +1 -1
  59. package/dist/study-analysis-evidence.js +45 -17
  60. package/dist/study-analysis-evidence.js.map +1 -1
  61. package/dist/study-analysis-job.d.ts +87 -0
  62. package/dist/study-analysis-job.js +197 -0
  63. package/dist/study-analysis-job.js.map +1 -0
  64. package/dist/study-analysis-service.d.ts +10 -1
  65. package/dist/study-analysis-service.js +31 -8
  66. package/dist/study-analysis-service.js.map +1 -1
  67. package/dist/study-analysis-sharing.js +13 -5
  68. package/dist/study-analysis-sharing.js.map +1 -1
  69. package/dist/study-analysis-store.d.ts +4 -0
  70. package/dist/study-analysis-store.js +40 -1
  71. package/dist/study-analysis-store.js.map +1 -1
  72. package/dist/study-analysis-validation.d.ts +2 -1
  73. package/dist/study-analysis-validation.js +12 -5
  74. package/dist/study-analysis-validation.js.map +1 -1
  75. package/dist/study-analysis.d.ts +6 -0
  76. package/dist/study-analysis.js.map +1 -1
  77. package/dist/tui-actions.d.ts +1 -1
  78. package/dist/tui-actions.js +15 -1
  79. package/dist/tui-actions.js.map +1 -1
  80. package/dist/tui-app.js +116 -116
  81. package/dist/tui-contract.d.ts +3 -2
  82. package/dist/tui-contract.js.map +1 -1
  83. package/docs/contracts/schemas.md +1 -1
  84. package/docs/contracts/study-analysis.md +18 -0
  85. package/docs/goals/current.md +4 -4
  86. package/docs/product/automatic-analysis.md +63 -0
  87. package/docs/ramp/README.md +5 -1
  88. package/docs/release/0.90.0-automatic-analysis.md +21 -0
  89. package/package.json +1 -1
@@ -0,0 +1,197 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { lstat, mkdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ import { validatePreparedRunRootIdentity } from "./run-paths.js";
6
+ import { assertPreparedSelectedOutputDirectory, bindExistingManagedHumanishOutputDirectory, prepareContainedOutputDirectoryRoot, writeContainedOutputFile } from "./selected-output-paths.js";
7
+ import { readBoundedStudyFile } from "./study-analysis-evidence.js";
8
+ import { containsSensitive } from "./redaction.js";
9
+ import { readStudyAnalysisExecution, readStudyAnalysisVersion } from "./study-analysis-store.js";
10
+ import { hashStudyAnalysisValue } from "./study-analysis-validation.js";
11
+ export const AUTOMATIC_STUDY_ANALYSIS_DIRECTORY = "analysis-automatic";
12
+ export const AUTOMATIC_STUDY_ANALYSIS_SCHEMA = "humanish.automatic-study-analysis.v1";
13
+ export const AUTOMATIC_STUDY_ANALYSIS_STALE_MS = 15_000;
14
+ const JOB_FILE = "job.json";
15
+ const CANCEL_FILE = "cancel.json";
16
+ const MAX_JOB_BYTES = 8192;
17
+ const CANCEL_SCHEMA = "humanish.automatic-study-analysis-cancellation.v1";
18
+ const reasons = ["AUTOMATIC_ANALYSIS_ALREADY_REQUESTED", "AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE",
19
+ "AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN", "AUTOMATIC_ANALYSIS_SOURCE_UNAVAILABLE", "AUTOMATIC_ANALYSIS_KEY_MISSING",
20
+ "AUTOMATIC_ANALYSIS_ADMISSION_REFUSED", "AUTOMATIC_ANALYSIS_BUSY", "AUTOMATIC_ANALYSIS_CANCELLED",
21
+ "AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE", "AUTOMATIC_ANALYSIS_FAILED", "AUTOMATIC_ANALYSIS_PUBLICATION_FAILED",
22
+ "AUTOMATIC_ANALYSIS_REUSED", "AUTOMATIC_ANALYSIS_LIMITATIONS", "AUTOMATIC_ANALYSIS_ADMISSION_EXCEEDED",
23
+ "AUTOMATIC_ANALYSIS_ACTOR_CANCELLED"];
24
+ const id = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/);
25
+ const date = z.iso.datetime();
26
+ const digest = z.string().regex(/^[a-f0-9]{64}$/);
27
+ const jobSchema = z.strictObject({
28
+ schema: z.literal(AUTOMATIC_STUDY_ANALYSIS_SCHEMA), runId: id, claimId: z.uuid(), attemptId: id,
29
+ state: z.enum(["queued", "running", "complete", "partial", "failed", "cancelled", "skipped", "unknown"]),
30
+ analysisId: id.nullable(), reason: z.enum(reasons).nullable(), createdAt: date, updatedAt: date,
31
+ configDigest: digest, promptVersion: z.string().regex(/^[A-Za-z0-9_.-]{1,80}$/),
32
+ sourceRunSha256: digest.nullable(), inputDigest: digest.nullable(),
33
+ analysisSha256: digest.nullable(), receiptSha256: digest.nullable(),
34
+ startedAt: date.nullable(), finishedAt: date.nullable()
35
+ });
36
+ const cancelSchema = z.strictObject({ schema: z.literal(CANCEL_SCHEMA), runId: id, claimId: z.uuid(), requestedAt: date });
37
+ const pending = (state) => state === "queued" || state === "running";
38
+ const iso = () => new Date().toISOString();
39
+ const unknown = (updatedAt = iso()) => ({ state: "unknown", analysisId: null,
40
+ reason: "AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN", updatedAt });
41
+ function parseJob(bytes, runId) {
42
+ const record = jobSchema.parse(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)));
43
+ if (containsSensitive(JSON.stringify(record)) || record.runId !== runId || Date.parse(record.updatedAt) < Date.parse(record.createdAt)
44
+ || (pending(record.state) && record.finishedAt !== null)
45
+ || (!pending(record.state) && record.finishedAt === null)
46
+ || (record.analysisId !== null && record.reason !== "AUTOMATIC_ANALYSIS_REUSED" && record.analysisId !== record.attemptId)
47
+ || (record.reason === "AUTOMATIC_ANALYSIS_REUSED" && (!["complete", "partial"].includes(record.state) || record.startedAt !== null || record.analysisId === null))
48
+ || (record.state === "running" && record.startedAt === null)
49
+ || (record.startedAt !== null && Date.parse(record.startedAt) < Date.parse(record.createdAt))
50
+ || (record.finishedAt !== null && Date.parse(record.finishedAt) < Date.parse(record.createdAt))) {
51
+ throw new Error("AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE");
52
+ }
53
+ return record;
54
+ }
55
+ /** Also guards direct HTML projection callers, not only the contained-file reader. */
56
+ export function projectAutomaticStudyAnalysisView(value) {
57
+ if (value === undefined)
58
+ return undefined;
59
+ const parsed = jobSchema.pick({ state: true, analysisId: true, reason: true, updatedAt: true }).safeParse(value);
60
+ if (!parsed.success || containsSensitive(JSON.stringify(parsed.data)))
61
+ return unknown();
62
+ return parsed.data;
63
+ }
64
+ async function bindJob(prepared) {
65
+ await validatePreparedRunRootIdentity(prepared);
66
+ const cwd = path.dirname(path.dirname(path.dirname(prepared.absoluteRunRoot)));
67
+ const root = await bindExistingManagedHumanishOutputDirectory(cwd, "runs", path.basename(prepared.physicalRunRoot), AUTOMATIC_STUDY_ANALYSIS_DIRECTORY);
68
+ return root ? Object.freeze({ ...root, parentRun: prepared }) : null;
69
+ }
70
+ /** Read-only projection. A stale timestamp or persisted claim never authorizes execution. */
71
+ export async function readAutomaticStudyAnalysisPrepared(prepared, now = Date.now()) {
72
+ try {
73
+ const root = await bindJob(prepared);
74
+ if (!root) {
75
+ const exists = await lstat(path.join(prepared.physicalRunRoot, AUTOMATIC_STUDY_ANALYSIS_DIRECTORY)).then(() => true, (error) => { if (error.code === "ENOENT")
76
+ return false; throw error; });
77
+ return exists ? unknown() : undefined;
78
+ }
79
+ const bytes = await readBoundedStudyFile(root, JOB_FILE, MAX_JOB_BYTES);
80
+ if (!bytes)
81
+ return unknown();
82
+ const record = parseJob(bytes, path.basename(prepared.physicalRunRoot));
83
+ const view = { state: record.state, analysisId: record.analysisId, reason: record.reason, updatedAt: record.updatedAt };
84
+ const updated = Date.parse(record.updatedAt);
85
+ if (updated > now || (pending(record.state) && now - updated > AUTOMATIC_STUDY_ANALYSIS_STALE_MS)) {
86
+ return { ...view, state: "unknown", reason: "AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN" };
87
+ }
88
+ if (!await terminalResultMatches(prepared, record))
89
+ return { ...view, state: "unknown", reason: "AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN" };
90
+ return view;
91
+ }
92
+ catch {
93
+ return unknown();
94
+ }
95
+ }
96
+ async function terminalResultMatches(prepared, record) {
97
+ if (pending(record.state) || record.state === "unknown" || record.state === "skipped")
98
+ return true;
99
+ if (record.analysisId === null)
100
+ return record.state === "cancelled" || record.state === "failed";
101
+ const matches = (value) => value.id === record.analysisId && value.runId === record.runId && value.sourceRunSha256 === record.sourceRunSha256
102
+ && value.inputDigest === record.inputDigest && value.configDigest === record.configDigest && value.promptVersion === record.promptVersion;
103
+ const receipt = await readStudyAnalysisExecution(prepared, record.analysisId);
104
+ if (!receipt || !matches(receipt) || hashStudyAnalysisValue(receipt) !== record.receiptSha256)
105
+ return false;
106
+ if (record.state === "failed" && record.reason === "AUTOMATIC_ANALYSIS_PUBLICATION_FAILED")
107
+ return true;
108
+ if (receipt.status !== record.state)
109
+ return false;
110
+ if (record.state === "failed" || record.state === "cancelled")
111
+ return true;
112
+ const entry = await readStudyAnalysisVersion(prepared, record.analysisId);
113
+ return entry?.state === "ready" && entry.analysis !== null && matches(entry.analysis)
114
+ && entry.analysis.status === record.state && hashStudyAnalysisValue(entry.analysis) === record.analysisSha256;
115
+ }
116
+ /** The directory is permanent, including after interrupted/failed writes. Never re-open it as a writer. */
117
+ export async function claimAutomaticStudyAnalysis(prepared, metadata) {
118
+ await validatePreparedRunRootIdentity(prepared);
119
+ const target = path.join(prepared.physicalRunRoot, AUTOMATIC_STUDY_ANALYSIS_DIRECTORY);
120
+ try {
121
+ await mkdir(target, { mode: 0o700 });
122
+ }
123
+ catch (error) {
124
+ if (error.code === "EEXIST")
125
+ return null;
126
+ throw error;
127
+ }
128
+ const identity = await lstat(target, { bigint: true });
129
+ const root = await prepareContainedOutputDirectoryRoot(prepared, AUTOMATIC_STUDY_ANALYSIS_DIRECTORY);
130
+ if (root.identity.dev !== identity.dev || root.identity.ino !== identity.ino || root.identity.birthtimeNs !== identity.birthtimeNs) {
131
+ throw new Error("AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE");
132
+ }
133
+ const createdAt = iso();
134
+ let record = { schema: AUTOMATIC_STUDY_ANALYSIS_SCHEMA, runId: path.basename(prepared.physicalRunRoot),
135
+ claimId: randomUUID(), attemptId: `analysis-${randomUUID()}`, state: "queued", analysisId: null, reason: null,
136
+ createdAt, updatedAt: createdAt, ...metadata, sourceRunSha256: null, inputDigest: null, analysisSha256: null, receiptSha256: null,
137
+ startedAt: null, finishedAt: null };
138
+ let writes = Promise.resolve();
139
+ const write = async (next) => {
140
+ const bytes = Buffer.from(JSON.stringify(next) + "\n");
141
+ parseJob(bytes, record.runId);
142
+ if (bytes.length > MAX_JOB_BYTES)
143
+ throw new Error("AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE");
144
+ await writeContainedOutputFile(root, JOB_FILE, bytes);
145
+ record = next;
146
+ };
147
+ await write(record);
148
+ const update = (change) => {
149
+ writes = writes.then(async () => {
150
+ if (!pending(record.state))
151
+ return;
152
+ const now = iso();
153
+ const state = change.state ?? record.state;
154
+ await write({ ...record, ...change, state, updatedAt: now, finishedAt: pending(state) ? null : now });
155
+ });
156
+ return writes;
157
+ };
158
+ return {
159
+ attemptId: record.attemptId, update, touch: () => update({}),
160
+ async cancellationRequested() {
161
+ await assertPreparedSelectedOutputDirectory(root);
162
+ const bytes = await readBoundedStudyFile(root, CANCEL_FILE, 1024);
163
+ if (!bytes) {
164
+ const exists = await lstat(path.join(root.physicalPath, CANCEL_FILE)).then(() => true, (error) => { if (error.code === "ENOENT")
165
+ return false; throw error; });
166
+ if (exists)
167
+ throw new Error("AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE");
168
+ return false;
169
+ }
170
+ const cancel = cancelSchema.parse(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)));
171
+ if (cancel.runId !== record.runId || cancel.claimId !== record.claimId)
172
+ throw new Error("AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE");
173
+ return true;
174
+ }
175
+ };
176
+ }
177
+ /** A scoped cancellation request, never a PID signal and never permission to create a new job. */
178
+ export async function requestAutomaticStudyAnalysisCancellationPrepared(prepared) {
179
+ try {
180
+ const root = await bindJob(prepared);
181
+ if (!root)
182
+ return { requested: false, reason: "AUTOMATIC_ANALYSIS_SOURCE_UNAVAILABLE" };
183
+ const bytes = await readBoundedStudyFile(root, JOB_FILE, MAX_JOB_BYTES);
184
+ if (!bytes)
185
+ throw new Error("Unavailable job.");
186
+ const record = parseJob(bytes, path.basename(prepared.physicalRunRoot));
187
+ if (!pending(record.state))
188
+ return { requested: false, reason: null };
189
+ const cancellation = { schema: CANCEL_SCHEMA, runId: record.runId, claimId: record.claimId, requestedAt: iso() };
190
+ await writeContainedOutputFile(root, CANCEL_FILE, JSON.stringify(cancellation) + "\n");
191
+ return { requested: true, reason: null };
192
+ }
193
+ catch {
194
+ return { requested: false, reason: "AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE" };
195
+ }
196
+ }
197
+ //# sourceMappingURL=study-analysis-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"study-analysis-job.js","sourceRoot":"","sources":["../src/study-analysis-job.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type PreparedRunArtifactPaths } from "./run-paths.js";
2
- import { type StudyAnalysisAdmission, type StudyAnalysisProgress } from "./study-analysis-engine.js";
2
+ import { type StudyAnalysisAdmission, type StudyAnalysisProgress, type StudyAnalysisDispatchContext } from "./study-analysis-engine.js";
3
3
  import { type StudyAnalysisArtifact, type StudyAnalysisConfig, type StudyAnalysisCorrection, type LoadedStudyAnalysis } from "./study-analysis.js";
4
4
  export declare const ANALYZE_RESULT_SCHEMA = "humanish.analyze-result.v1";
5
5
  export interface AnalyzeOptions {
@@ -31,9 +31,18 @@ export interface AnalyzeDeps {
31
31
  onProgress?: (progress: StudyAnalysisProgress) => void;
32
32
  /** Request boundary only: evidence capture, admission, validation and writes remain real. */
33
33
  fetch?: typeof fetch;
34
+ /** Internal producer pin: use this original run identity without resolving a replacement. */
35
+ expectedRun?: PreparedRunArtifactPaths;
36
+ /** Internal post-run orchestration; never populated from an Observer request. */
37
+ analysisId?: string;
38
+ beforeDispatch?: (context: StudyAnalysisDispatchContext) => Promise<void>;
34
39
  }
40
+ /** A producer pin is authority for one physical project and exact run ID only. */
41
+ export declare function resolveStudyAnalysisRun(cwd: string, run: string, expectedRun?: PreparedRunArtifactPaths): Promise<PreparedRunArtifactPaths | null>;
35
42
  /** One analysis or correction writer per run. Never steal a lock based on an untrusted PID. */
36
43
  export declare function withStudyAnalysisLock<T>(prepared: PreparedRunArtifactPaths, action: () => Promise<T>): Promise<T>;
44
+ /** Internal completion gate shared with the opt-in post-run owner. */
45
+ export declare function readCompletedStudyAnalysisSource(cwd: string, prepared: PreparedRunArtifactPaths): Promise<Buffer>;
37
46
  export declare function analyzeStudy(cwdInput: string, run: string, options: AnalyzeOptions, deps?: AnalyzeDeps): Promise<AnalyzeResult>;
38
47
  export declare function showStudyAnalysis(cwd: string, run: string, id?: string): Promise<LoadedStudyAnalysis>;
39
48
  export declare function correctStudyAnalysis(cwd: string, run: string, options: {
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { lstat, mkdir, rmdir } from "node:fs/promises";
2
+ import { lstat, mkdir, realpath, rmdir } from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { renderObserver } from "./observer.js";
5
5
  import { containsSensitive } from "./redaction.js";
@@ -12,6 +12,22 @@ import { appendStudyAnalysisCorrection, assertStudyAnalysisPublicationCapacity,
12
12
  import { hashStudyAnalysisValue } from "./study-analysis-validation.js";
13
13
  import { STUDY_ANALYSIS_CORRECTION_SCHEMA } from "./study-analysis.js";
14
14
  export const ANALYZE_RESULT_SCHEMA = "humanish.analyze-result.v1";
15
+ /** A producer pin is authority for one physical project and exact run ID only. */
16
+ export async function resolveStudyAnalysisRun(cwd, run, expectedRun) {
17
+ if (expectedRun === undefined)
18
+ return resolveRunPath(cwd, run);
19
+ const physicalCwd = path.dirname(path.dirname(expectedRun.physicalRunsRoot));
20
+ const selectedCwd = await realpath(cwd).catch(() => null);
21
+ if (selectedCwd !== physicalCwd || run !== path.basename(expectedRun.physicalRunRoot))
22
+ throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
23
+ try {
24
+ await validatePreparedRunRootIdentity(expectedRun);
25
+ }
26
+ catch {
27
+ throw new Error("ANALYSIS_SOURCE_CHANGED");
28
+ }
29
+ return expectedRun;
30
+ }
15
31
  const messages = {
16
32
  ANALYSIS_RUN_NOT_FOUND: "The selected run is unavailable or its storage is unsafe.",
17
33
  ANALYSIS_VERIFY_FAILED: "The run must pass verification before analysis.",
@@ -63,7 +79,8 @@ export async function withStudyAnalysisLock(prepared, action) {
63
79
  catch { /* Leave ambiguous storage in place for explicit operator inspection. */ }
64
80
  }
65
81
  }
66
- async function completedSource(cwd, prepared) {
82
+ /** Internal completion gate shared with the opt-in post-run owner. */
83
+ export async function readCompletedStudyAnalysisSource(cwd, prepared) {
67
84
  const bytes = await readBoundedStudyFile(prepared, "run.json", STUDY_EVIDENCE_LIMITS.sourceBytes);
68
85
  if (!bytes)
69
86
  throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
@@ -99,7 +116,7 @@ async function completedSource(cwd, prepared) {
99
116
  return bytes;
100
117
  }
101
118
  export async function analyzeStudy(cwdInput, run, options, deps = {}) {
102
- const cwd = path.resolve(cwdInput);
119
+ let cwd = path.resolve(cwdInput);
103
120
  const dryRun = options.dryRun === true;
104
121
  const config = structuredClone(options.config);
105
122
  if (!Number.isFinite(config.maxCostUsd) || config.maxCostUsd <= 0 || config.maxCostUsd > 1000)
@@ -107,13 +124,15 @@ export async function analyzeStudy(cwdInput, run, options, deps = {}) {
107
124
  if (config.question !== null && containsSensitive(config.question))
108
125
  return fail(run, dryRun, "ANALYSIS_QUESTION_UNSAFE");
109
126
  try {
110
- const prepared = await resolveRunPath(cwd, run);
127
+ const prepared = await resolveStudyAnalysisRun(cwd, run, deps.expectedRun);
111
128
  if (!prepared)
112
129
  return fail(run, dryRun, "ANALYSIS_RUN_NOT_FOUND");
130
+ if (deps.expectedRun !== undefined)
131
+ cwd = path.dirname(path.dirname(prepared.physicalRunsRoot));
113
132
  const execute = async () => {
114
133
  if (deps.signal?.aborted)
115
134
  return fail(run, dryRun, "ANALYSIS_CANCELLED");
116
- const bytes = await completedSource(cwd, prepared);
135
+ const bytes = await readCompletedStudyAnalysisSource(cwd, prepared);
117
136
  const input = await captureStudyEvidence(prepared, bytes);
118
137
  if (input.evidence.length === 0)
119
138
  return fail(input.runId, dryRun, "ANALYSIS_NO_PARTICIPANTS");
@@ -130,10 +149,12 @@ export async function analyzeStudy(cwdInput, run, options, deps = {}) {
130
149
  const prior = (await listStudyAnalyses(prepared)).find((entry) => entry.state === "ready"
131
150
  && entry.analysis?.inputDigest === input.inputDigest && entry.analysis.configDigest === hashStudyAnalysisValue(config)
132
151
  && entry.analysis.promptVersion === STUDY_ANALYSIS_PROMPT_VERSION)?.analysis;
133
- if (prior)
152
+ if (prior) {
153
+ await validatePreparedRunRootIdentity(prepared);
134
154
  return { ...base, ok: prior.error === null, reused: true, analysisId: prior.id, status: prior.status, usage: prior.usage,
135
155
  ...(prior.error === null ? {} : { error: { code: prior.error, message: "The saved analysis exceeded its admission estimate. Findings and usage are retained; no new request was sent." } }),
136
156
  artifactPath: path.join(prepared.relativeRunRoot, "analysis", prior.id, "analysis.json") };
157
+ }
137
158
  }
138
159
  // An unreadable inventory is not evidence of an absent prior result.
139
160
  // Check readable history capacity before any new paid attempt.
@@ -142,6 +163,8 @@ export async function analyzeStudy(cwdInput, run, options, deps = {}) {
142
163
  if (!apiKey.trim())
143
164
  return { ...fail(input.runId, false, "ANALYSIS_API_KEY_MISSING"), admission };
144
165
  const analysis = await runStudyAnalysis(input, config, { apiKey,
166
+ ...(deps.analysisId === undefined ? {} : { analysisId: deps.analysisId }),
167
+ ...(deps.beforeDispatch === undefined ? {} : { beforeDispatch: deps.beforeDispatch }),
145
168
  ...(deps.signal === undefined ? {} : { signal: deps.signal }),
146
169
  ...(deps.onProgress === undefined ? {} : { onProgress: deps.onProgress }),
147
170
  ...(deps.fetch === undefined ? {} : { fetch: deps.fetch }) });
@@ -160,7 +183,7 @@ export async function analyzeStudy(cwdInput, run, options, deps = {}) {
160
183
  : "Storage changed or became unavailable after the attempt. Usage is retained in this response; no durable receipt could be written." } };
161
184
  }
162
185
  try {
163
- const rendered = await renderObserver(cwd, input.runId, { open: false });
186
+ const rendered = await renderObserver(cwd, input.runId, { open: false, expectedRun: prepared });
164
187
  if (!rendered.ok)
165
188
  result.warnings.push("Analysis was saved, but Observer could not be refreshed. Run humanish observe again.");
166
189
  }
@@ -200,7 +223,7 @@ export async function correctStudyAnalysis(cwd, run, options) {
200
223
  status: options.status, reason: options.reason, replacementClaim: options.replacementClaim ?? null
201
224
  };
202
225
  await appendStudyAnalysisCorrection(prepared, correction);
203
- await renderObserver(cwd, run, { open: false }).catch(() => null);
226
+ await renderObserver(cwd, path.basename(prepared.physicalRunRoot), { open: false, expectedRun: prepared }).catch(() => null);
204
227
  return correction;
205
228
  });
206
229
  }
@@ -1 +1 @@
1
- {"version":3,"file":"study-analysis-service.js","sourceRoot":"","sources":["../src/study-analysis-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,EAAE,+BAA+B,EAAiC,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACjH,OAAO,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,6BAA6B,EAC7B,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,6BAA6B,EAAE,sCAAsC,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAC;AAChN,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,gCAAgC,EACiB,MAAM,qBAAqB,CAAC;AAEtF,MAAM,CAAC,MAAM,qBAAqB,GAAG,4BAA4B,CAAC;AA6BlE,MAAM,QAAQ,GAA2B;IACvC,sBAAsB,EAAE,2DAA2D;IACnF,sBAAsB,EAAE,iDAAiD;IACzE,mBAAmB,EAAE,wEAAwE;IAC7F,wBAAwB,EAAE,uDAAuD;IACjF,0BAA0B,EAAE,2GAA2G;IACvI,2BAA2B,EAAE,sEAAsE;IACnG,uBAAuB,EAAE,0GAA0G;IACnI,aAAa,EAAE,iJAAiJ;IAChK,4BAA4B,EAAE,0IAA0I;IACxK,uBAAuB,EAAE,gIAAgI;IACzJ,wBAAwB,EAAE,mGAAmG;IAC7H,wBAAwB,EAAE,mGAAmG;IAC7H,kBAAkB,EAAE,yCAAyC;IAC7D,oBAAoB,EAAE,0EAA0E;CACjG,CAAC;AACF,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,MAAe,EAAE,IAAY,EAAiB,EAAE,CAAC,CAAC;IAC3E,MAAM,EAAE,qBAAqB,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAClF,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,oBAAqB,EAAE;CAC3E,CAAC,CAAC;AAEH,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAI,QAAkC,EAAE,MAAwB;IACzG,MAAM,+BAA+B,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IACrE,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAAC,CAAC;IAC7C,OAAO,KAAK,EAAE,CAAC;QACb,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,+BAA+B,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAClG,OAAO,MAAM,MAAM,EAAE,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,kGAAkG;QAClG,IAAI,CAAC;YACH,MAAM,+BAA+B,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;mBACjF,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW;gBAAE,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACzG,CAAC;QAAC,MAAM,CAAC,CAAC,wEAAwE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,QAAkC;IAC5E,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAClG,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjG,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC/F,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACjF,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACrF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAc,EAAE,EAAE;YACzH,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,IAAI,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,kFAAkF;QAClF,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACtG,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9G,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC;QAC3G,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,GAAW,EAAE,OAAuB,EAAE,OAAoB,EAAE;IAC/G,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,IAAI;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACnJ,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACzH,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,KAAK,IAA4B,EAAE;YACjD,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;YACzE,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC1D,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,0BAA0B,CAAC,CAAC;YAC9F,MAAM,SAAS,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChE,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,qBAAqD,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAc,EAAE,CAAC;YAC7J,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,KAAK;oBACjD,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,IAAI,2BAA2B,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,KAAK,0BAA0B;4BACpH,CAAC,CAAC,uFAAuF;4BACzF,CAAC,CAAC,2FAA2F,EAAE,EAAE,CAAC;YACtG,IAAI,MAAM;gBAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO;uBACpF,KAAK,CAAC,QAAQ,EAAE,WAAW,KAAK,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,KAAK,sBAAsB,CAAC,MAAM,CAAC;uBACnH,KAAK,CAAC,QAAQ,CAAC,aAAa,KAAK,6BAA6B,CAAC,EAAE,QAAQ,CAAC;gBAC/E,IAAI,KAAK;oBAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK;wBACjI,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,+GAA+G,EAAE,EAAE,CAAC;wBAC3L,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,eAAe,CAAC,EAAE,CAAC;YAC/F,CAAC;YACD,qEAAqE;YACrE,+DAA+D;YAC/D,MAAM,sCAAsC,CAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;YAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;gBAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,0BAA0B,CAAC,EAAE,SAAS,EAAE,CAAC;YAClG,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM;gBAC7D,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7D,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,MAAM,MAAM,GAAkB,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM;gBAChJ,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,6FAA6F,EAAE,EAAE,CAAC,EAAE,CAAC;YACpL,IAAI,CAAC;gBACH,MAAM,kCAAkC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC7D,MAAM,CAAC,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,mBAAmB,EAAE,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;gBACpH,MAAM,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC7C,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YACtG,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,6BAA6B;wBACzE,OAAO,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,6FAA6F;4BAClI,CAAC,CAAC,mIAAmI,EAAE,EAAE,CAAC;YAChJ,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzE,IAAI,CAAC,QAAQ,CAAC,EAAE;oBAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;YACjI,CAAC;YAAC,MAAM,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;YAAC,CAAC;YACzH,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QACF,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC;QACvH,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,GAAW,EAAE,EAAW;IAC3E,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChF,OAAO,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC/C,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC;AAClG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAW,EAAE,GAAW,EAAE,OAEpE;IACC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACzD,OAAO,qBAAqB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;QACzF,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACjH,IAAI,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC/I,MAAM,UAAU,GAA4B;YAC1C,MAAM,EAAE,gCAAgC,EAAE,EAAE,EAAE,cAAc,UAAU,EAAE,EAAE;YAC1E,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,sBAAsB,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;YAChG,aAAa,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnF,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI;SACnG,CAAC;QACF,MAAM,6BAA6B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1D,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClE,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"study-analysis-service.js","sourceRoot":"","sources":["../src/study-analysis-service.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { containsSensitive } from "./redaction.js";
2
+ import { projectAutomaticStudyAnalysisView } from "./study-analysis-job.js";
2
3
  /** Owned file names in normalized run-relative paths, not directory ownership.
3
4
  * Legacy evidence under analysis/ still follows ordinary evidence policy. */
4
5
  export function isStudyAnalysisRecordPath(relativePath) {
@@ -6,22 +7,29 @@ export function isStudyAnalysisRecordPath(relativePath) {
6
7
  const leaf = parts.at(-1);
7
8
  return (parts[0] === "analysis" && ["analysis.json", "correction.json"].includes(leaf))
8
9
  || (parts[0] === "analysis-attempts" && leaf === "receipt.json")
9
- || (["analysis", "analysis-attempts"].includes(parts[0]) && leaf.startsWith(".humanish-write-"));
10
+ || (parts[0] === "analysis-automatic" && ["job.json", "cancel.json"].includes(leaf))
11
+ || (["analysis", "analysis-attempts", "analysis-automatic"].includes(parts[0]) && leaf.startsWith(".humanish-write-"));
10
12
  }
11
13
  /** Check the exact in-memory snapshot being projected; a prior filesystem scan cannot approve a later write. */
12
14
  export function studyAnalysisSharingProblems(loaded) {
15
+ // Job metadata never approves evidence, nor does uncertain liveness revoke its approval.
16
+ const { automatic: _automatic, ...evidence } = loaded;
13
17
  const benignAttempt = loaded.analysis?.result === null
14
18
  && (loaded.analysis.status === "failed" || loaded.analysis.status === "cancelled");
15
19
  const validationWarnings = loaded.warnings.filter((warning) => warning !== "ANALYSIS_FAILED" && warning !== "ANALYSIS_CANCELLED");
16
20
  return {
17
- sensitive: containsSensitive(JSON.stringify(loaded)),
21
+ sensitive: containsSensitive(JSON.stringify(evidence)),
18
22
  unverified: loaded.state === "stale" || (loaded.state === "invalid" && !benignAttempt) || validationWarnings.length > 0
19
23
  };
20
24
  }
21
25
  /** Unsafe generated text is quarantined without hiding the original recording. */
22
26
  export function projectShareCheckedAnalysis(loaded) {
23
- return studyAnalysisSharingProblems(loaded).sensitive
24
- ? { state: "invalid", analysis: null, corrections: [], warnings: ["ANALYSIS_SENSITIVE_TEXT_QUARANTINED"] }
25
- : loaded;
27
+ const { automatic: _automatic, ...evidence } = loaded;
28
+ const automatic = projectAutomaticStudyAnalysisView(loaded.automatic);
29
+ const safe = automatic === undefined ? evidence : { ...evidence, automatic };
30
+ return studyAnalysisSharingProblems(safe).sensitive
31
+ ? { state: "invalid", analysis: null, corrections: [], warnings: ["ANALYSIS_SENSITIVE_TEXT_QUARANTINED"],
32
+ ...(automatic === undefined ? {} : { automatic }) }
33
+ : safe;
26
34
  }
27
35
  //# sourceMappingURL=study-analysis-sharing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"study-analysis-sharing.js","sourceRoot":"","sources":["../src/study-analysis-sharing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD;6EAC6E;AAC7E,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;WAClF,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,mBAAmB,IAAI,IAAI,KAAK,cAAc,CAAC;WAC7D,CAAC,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,4BAA4B,CAAC,MAA2B;IACtE,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI;WACjD,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IACrF,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,iBAAiB,IAAI,OAAO,KAAK,oBAAoB,CAAC,CAAC;IAClI,OAAO;QACL,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpD,UAAU,EAAE,MAAM,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;KACxH,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,2BAA2B,CAAC,MAA2B;IACrE,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC,SAAS;QACnD,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,qCAAqC,CAAC,EAAE;QAC1G,CAAC,CAAC,MAAM,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"study-analysis-sharing.js","sourceRoot":"","sources":["../src/study-analysis-sharing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAE5E;6EAC6E;AAC7E,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;WAClF,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,mBAAmB,IAAI,IAAI,KAAK,cAAc,CAAC;WAC7D,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,oBAAoB,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;WACjF,CAAC,CAAC,UAAU,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC5H,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,4BAA4B,CAAC,MAA2B;IACtE,yFAAyF;IACzF,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;IACtD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI;WACjD,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IACrF,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,iBAAiB,IAAI,OAAO,KAAK,oBAAoB,CAAC,CAAC;IAClI,OAAO;QACL,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtD,UAAU,EAAE,MAAM,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;KACxH,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,2BAA2B,CAAC,MAA2B;IACrE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;IACtD,MAAM,SAAS,GAAG,iCAAiC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7E,OAAO,4BAA4B,CAAC,IAAI,CAAC,CAAC,SAAS;QACjD,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,qCAAqC,CAAC;YACtG,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;QACrD,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}
@@ -13,12 +13,16 @@ export interface StudyAnalysisListEntry {
13
13
  export declare function assertStudyAnalysisPublicationCapacity(prepared: PreparedRunArtifactPaths): Promise<void>;
14
14
  /** A claimed version is never reused, including after interruption before publication. */
15
15
  export declare function writeStudyAnalysis(prepared: PreparedRunArtifactPaths, value: StudyAnalysisArtifact): Promise<void>;
16
+ /** Read one exact result without reading automatic job state or unrelated history. */
17
+ export declare function readStudyAnalysisVersion(prepared: PreparedRunArtifactPaths, id: string): Promise<StudyAnalysisListEntry | null>;
16
18
  /** Includes failed attempts; callers must not equate the newest attempt with usable findings. */
17
19
  export declare function listStudyAnalyses(prepared: PreparedRunArtifactPaths): Promise<StudyAnalysisListEntry[]>;
18
20
  export declare function loadStudyAnalysis(prepared: PreparedRunArtifactPaths, id?: string): Promise<LoadedStudyAnalysis>;
19
21
  export declare function appendStudyAnalysisCorrection(prepared: PreparedRunArtifactPaths, value: StudyAnalysisCorrection): Promise<void>;
20
22
  export type { StudyAnalysisExecutionReceipt } from "./study-analysis-validation.js";
21
23
  export declare const STUDY_ANALYSIS_EXECUTION_DIRECTORY = "analysis-attempts";
24
+ /** Exact bounded receipt lookup for an already claimed execution, never a dispatch decision. */
25
+ export declare function readStudyAnalysisExecution(prepared: PreparedRunArtifactPaths, id: string): Promise<StudyAnalysisExecutionReceipt | null>;
22
26
  /**
23
27
  * Publish accounting first. Unlike a usable report, this receipt does not claim
24
28
  * the source still matches; its digests name the exact input that was attempted.
@@ -5,6 +5,7 @@ import { validatePreparedRunRootIdentity } from "./run-paths.js";
5
5
  import { assertPreparedSelectedOutputDirectory, bindExistingManagedHumanishOutputDirectory, prepareContainedOutputDirectoryRoot, writeContainedOutputFile } from "./selected-output-paths.js";
6
6
  import { isStudyEvidencePath, readBoundedStudyFile, STUDY_EVIDENCE_LIMITS, validateStudyAnalysisEvidence } from "./study-analysis-evidence.js";
7
7
  import { hashStudyAnalysisValue, validateStudyAnalysisExecutionReceipt, validateStudyAnalysisArtifact, validateStudyAnalysisCorrection } from "./study-analysis-validation.js";
8
+ import { readAutomaticStudyAnalysisPrepared } from "./study-analysis-job.js";
8
9
  export const STUDY_ANALYSIS_DIRECTORY = "analysis";
9
10
  const ANALYSIS_MAX_BYTES = 4 * 1024 * 1024;
10
11
  const MAX_VERSIONS = 256;
@@ -143,6 +144,20 @@ async function readVersion(prepared, root, id, source) {
143
144
  warnings: [analysis.status === "cancelled" ? "ANALYSIS_CANCELLED" : "ANALYSIS_FAILED"] };
144
145
  return { id, state: "ready", analysis, warnings: [] };
145
146
  }
147
+ /** Read one exact result without reading automatic job state or unrelated history. */
148
+ export async function readStudyAnalysisVersion(prepared, id) {
149
+ if (!safeId(id))
150
+ return null;
151
+ try {
152
+ const root = await existingRoot(prepared);
153
+ if (!root)
154
+ return null;
155
+ return await readVersion(prepared, root, id, await readBoundedStudyFile(prepared, "run.json", STUDY_EVIDENCE_LIMITS.sourceBytes));
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ }
146
161
  /** Includes failed attempts; callers must not equate the newest attempt with usable findings. */
147
162
  export async function listStudyAnalyses(prepared) {
148
163
  try {
@@ -210,7 +225,7 @@ async function readCorrections(prepared, root, analysis) {
210
225
  corrections.sort((a, b) => a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id));
211
226
  return { corrections, warnings };
212
227
  }
213
- export async function loadStudyAnalysis(prepared, id) {
228
+ async function loadStudyAnalysisRecord(prepared, id) {
214
229
  if (id !== undefined && !safeId(id))
215
230
  return empty("invalid", ["ANALYSIS_ID_INVALID"]);
216
231
  try {
@@ -239,6 +254,12 @@ export async function loadStudyAnalysis(prepared, id) {
239
254
  return empty("invalid", ["ANALYSIS_STORAGE_UNAVAILABLE"]);
240
255
  }
241
256
  }
257
+ export async function loadStudyAnalysis(prepared, id) {
258
+ const [loaded, automatic] = await Promise.all([
259
+ loadStudyAnalysisRecord(prepared, id), readAutomaticStudyAnalysisPrepared(prepared)
260
+ ]);
261
+ return automatic === undefined ? loaded : { ...loaded, automatic };
262
+ }
242
263
  function assertCorrectionBinding(analysis, correction) {
243
264
  const finding = analysis.result?.findings.find((entry) => entry.id === correction.findingId);
244
265
  if (analysis.id !== correction.analysisId || hashStudyAnalysisValue(analysis) !== correction.analysisSha256
@@ -270,6 +291,24 @@ export async function appendStudyAnalysisCorrection(prepared, value) {
270
291
  await writeContainedOutputFile(claimed, "correction.json", `${JSON.stringify(correction, null, 2)}\n`);
271
292
  }
272
293
  export const STUDY_ANALYSIS_EXECUTION_DIRECTORY = "analysis-attempts";
294
+ /** Exact bounded receipt lookup for an already claimed execution, never a dispatch decision. */
295
+ export async function readStudyAnalysisExecution(prepared, id) {
296
+ if (!safeId(id))
297
+ return null;
298
+ try {
299
+ const root = await existingRoot(prepared, STUDY_ANALYSIS_EXECUTION_DIRECTORY);
300
+ if (!root)
301
+ return null;
302
+ const bytes = await readBoundedStudyFile(root, `${id}/receipt.json`, 16 * 1024);
303
+ if (!bytes)
304
+ return null;
305
+ const receipt = validateStudyAnalysisExecutionReceipt(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)));
306
+ return receipt.id === id && receipt.runId === path.basename(prepared.physicalRunRoot) ? receipt : null;
307
+ }
308
+ catch {
309
+ return null;
310
+ }
311
+ }
273
312
  /**
274
313
  * Publish accounting first. Unlike a usable report, this receipt does not claim
275
314
  * the source still matches; its digests name the exact input that was attempted.