@riddledc/riddle-proof-packs 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,6 +24,14 @@ Reusable starter profile definitions and proof-pack metadata for Riddle Proof.
24
24
  - Returns first manifest entry for a matching `pack_id`.
25
25
  - `instantiateRiddleProofProfile(name, options)`:
26
26
  - Returns a copy of a profile with optional `url`, `route`, and `target` overrides.
27
+ - `findHumanReviewPacket(proofOrPacket)`:
28
+ - Recursively finds the first `human_review_packet` in a proof artifact or returns `null`.
29
+ - `requireHumanReviewPacket(proofOrPacket)`:
30
+ - Same extraction behavior, but throws if no packet is present.
31
+ - `formatHumanReviewPacketMarkdown(packet, options)`:
32
+ - Formats a compact Markdown handoff with recommendation, objective receipts, ranking role, proof boundary, listening prompts, and caveats.
33
+ - `createHumanReviewPacketArtifacts(proofOrPacket, options)`:
34
+ - Returns `{ packet, json, markdown }` for storing a standalone review packet next to a proof run.
27
35
 
28
36
  ## Proof claims and evidence roles
29
37
 
@@ -98,6 +106,33 @@ The `audio-mix` directory contains reusable audio-proof authoring guidance, a pr
98
106
 
99
107
  The `neon-step-sequencer` directory contains the first app-specific ratchet lab under the new architecture. Its profiles declare `current_target` or `interaction_snapshots` evidence-role patterns and explicitly state what they do not prove. The ratchet-loop profile now expects a compact `humanReviewPacket` for listening handoff: supported/rejected candidates, objective guardrails, state restoration, review-order ranking, and taste caveats. The case-study files record the claim, evidence, failure classification, smallest layer changed, and next sharper question for each run.
100
108
 
109
+ ### Human-review packet handoff
110
+
111
+ Human-review packets are proof artifacts for subjective follow-up. They are deliberately not taste scores. A packet should say what objective receipts passed, what was preserved, which candidate is ready for listening review, and which caveats remain.
112
+
113
+ ```ts
114
+ import {
115
+ createHumanReviewPacketArtifacts,
116
+ findHumanReviewPacket,
117
+ formatHumanReviewPacketMarkdown,
118
+ } from "@riddledc/riddle-proof-packs";
119
+
120
+ const proof = JSON.parse(await fs.promises.readFile("proof.json", "utf8"));
121
+ const packet = findHumanReviewPacket(proof);
122
+ if (!packet) throw new Error("proof did not emit a human review packet");
123
+
124
+ const markdown = formatHumanReviewPacketMarkdown(packet, {
125
+ title: "Neon Human Review Packet",
126
+ });
127
+ const artifacts = createHumanReviewPacketArtifacts(proof, {
128
+ title: "Neon Human Review Packet",
129
+ });
130
+
131
+ console.log(markdown);
132
+ await fs.promises.writeFile("human-review-packet.json", artifacts.json);
133
+ await fs.promises.writeFile("human-review-packet.md", artifacts.markdown);
134
+ ```
135
+
101
136
  ## Usage
102
137
 
103
138
  ```ts
package/dist/index.cjs CHANGED
@@ -22,6 +22,9 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  RIDDLE_PROOF_PACK_MANIFEST: () => RIDDLE_PROOF_PACK_MANIFEST,
24
24
  RIDDLE_PROOF_PACK_PROFILES: () => RIDDLE_PROOF_PACK_PROFILES,
25
+ createHumanReviewPacketArtifacts: () => createHumanReviewPacketArtifacts,
26
+ findHumanReviewPacket: () => findHumanReviewPacket,
27
+ formatHumanReviewPacketMarkdown: () => formatHumanReviewPacketMarkdown,
25
28
  getPackEnabledRiddleProofPackProfiles: () => getPackEnabledRiddleProofPackProfiles,
26
29
  getRiddleProofPackProfile: () => getRiddleProofPackProfile,
27
30
  getRiddleProofPackProfileByPackId: () => getRiddleProofPackProfileByPackId,
@@ -29,7 +32,8 @@ __export(index_exports, {
29
32
  getRiddleProofProfilesByPackId: () => getRiddleProofProfilesByPackId,
30
33
  instantiateRiddleProofProfile: () => instantiateRiddleProofProfile,
31
34
  listRiddleProofPackProfiles: () => listRiddleProofPackProfiles,
32
- listRiddleProofPacks: () => listRiddleProofPacks
35
+ listRiddleProofPacks: () => listRiddleProofPacks,
36
+ requireHumanReviewPacket: () => requireHumanReviewPacket
33
37
  });
34
38
  module.exports = __toCommonJS(index_exports);
35
39
 
@@ -2345,10 +2349,142 @@ function instantiateRiddleProofProfile(profileName, options = {}) {
2345
2349
  }
2346
2350
  );
2347
2351
  }
2352
+
2353
+ // src/humanReviewPacket.ts
2354
+ var isRecord2 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
2355
+ var asRecord = (value) => isRecord2(value) ? value : null;
2356
+ var asArray = (value) => Array.isArray(value) ? value : [];
2357
+ var getPath = (value, path) => {
2358
+ let cursor = value;
2359
+ for (const part of path.split(".")) {
2360
+ if (!isRecord2(cursor)) return void 0;
2361
+ cursor = cursor[part];
2362
+ }
2363
+ return cursor;
2364
+ };
2365
+ var formatValue = (value) => {
2366
+ if (value === null || value === void 0 || value === "") return "not captured";
2367
+ if (typeof value === "number") return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(4)));
2368
+ if (typeof value === "boolean") return value ? "true" : "false";
2369
+ return String(value);
2370
+ };
2371
+ var formatCodeValue = (value) => `\`${formatValue(value)}\``;
2372
+ var formatAction = (action) => {
2373
+ const record = asRecord(action);
2374
+ if (!record) return "not captured";
2375
+ const type = record.type ?? "set_mixer_level";
2376
+ const track = record.track ?? "track";
2377
+ const from = formatValue(record.from);
2378
+ const to = formatValue(record.to);
2379
+ const delta = record.delta === null || record.delta === void 0 ? "" : ` (${formatValue(record.delta)})`;
2380
+ return `${type} ${track}: ${from} -> ${to}${delta}`;
2381
+ };
2382
+ var addOptionalList = (lines, heading, values) => {
2383
+ const entries = asArray(values).filter((entry) => entry !== null && entry !== void 0 && entry !== "");
2384
+ if (!entries.length) return;
2385
+ lines.push("", `## ${heading}`, "");
2386
+ for (const entry of entries) lines.push(`- ${formatValue(entry)}`);
2387
+ };
2388
+ function findHumanReviewPacket(value) {
2389
+ if (!value || typeof value !== "object") return null;
2390
+ if (isRecord2(value) && value.kind === "human_review_packet") return value;
2391
+ if (Array.isArray(value)) {
2392
+ for (const entry of value) {
2393
+ const packet = findHumanReviewPacket(entry);
2394
+ if (packet) return packet;
2395
+ }
2396
+ return null;
2397
+ }
2398
+ for (const entry of Object.values(value)) {
2399
+ const packet = findHumanReviewPacket(entry);
2400
+ if (packet) return packet;
2401
+ }
2402
+ return null;
2403
+ }
2404
+ function requireHumanReviewPacket(value) {
2405
+ const packet = findHumanReviewPacket(value);
2406
+ if (!packet) throw new Error("No human_review_packet found");
2407
+ return packet;
2408
+ }
2409
+ function formatHumanReviewPacketMarkdown(packet, options = {}) {
2410
+ if (packet.kind !== "human_review_packet") {
2411
+ throw new Error("Expected a human_review_packet");
2412
+ }
2413
+ const recommendation = asRecord(packet.recommendation) ?? {};
2414
+ const candidate = asRecord(recommendation.candidate) ?? {};
2415
+ const guardrails = asRecord(packet.guardrails) ?? {};
2416
+ const ranking = asRecord(packet.ranking) ?? {};
2417
+ const request = asRecord(packet.request) ?? {};
2418
+ const supportedCandidates = asArray(packet.supportedCandidates);
2419
+ const rejectedCandidates = asArray(packet.rejectedCandidates);
2420
+ const selectedSong = getPath(packet, "target.selectedSong.selectedSong") ?? getPath(packet, "target.routeState.selectedSong");
2421
+ const lines = [
2422
+ `# ${options.title ?? "Human Review Packet"}`,
2423
+ "",
2424
+ `- status: ${formatCodeValue(packet.status)}`,
2425
+ `- domain: ${formatCodeValue(packet.domain)}`,
2426
+ `- evidence_role_pattern: ${formatCodeValue(packet.evidenceRolePattern)}`,
2427
+ `- requested_intent: ${formatValue(packet.requestedIntent)}`,
2428
+ `- selected_song: ${formatValue(selectedSong)}`,
2429
+ "",
2430
+ "## Recommendation",
2431
+ "",
2432
+ `- action: ${formatCodeValue(recommendation.action)}`,
2433
+ `- candidate: ${formatCodeValue(candidate.label)}`,
2434
+ `- candidate_action: ${formatCodeValue(formatAction(candidate.action))}`,
2435
+ `- reason: ${formatValue(recommendation.reason)}`,
2436
+ "",
2437
+ "## Objective Receipts",
2438
+ "",
2439
+ `- supported_candidates: ${formatCodeValue(guardrails.supportedClaimCandidateCount ?? supportedCandidates.length)}`,
2440
+ `- rejected_candidates: ${formatCodeValue(guardrails.rejectedCandidateCount ?? rejectedCandidates.length)}`,
2441
+ `- state_restored_after_loop: ${formatCodeValue(guardrails.stateRestoredAfterLoop)}`,
2442
+ `- candidate_actions_are_transient: ${formatCodeValue(request.candidateActionsAreTransient)}`,
2443
+ `- no_permanent_edit_unless_apply_best: ${formatCodeValue(guardrails.noPermanentEditUnlessApplyBest)}`,
2444
+ "",
2445
+ "## Ranking",
2446
+ "",
2447
+ `- metric: ${formatCodeValue(ranking.metric)}`,
2448
+ `- role: ${formatCodeValue(ranking.role)}`,
2449
+ `- lower_is_better: ${formatCodeValue(ranking.lowerIsBetter)}`,
2450
+ `- baseline: ${formatCodeValue(ranking.baselineCandidateRankingMetric)}`,
2451
+ `- best: ${formatCodeValue(ranking.bestCandidateRankingMetric)}`,
2452
+ `- delta: ${formatCodeValue(ranking.rankingMetricDelta)}`,
2453
+ "",
2454
+ "## Boundary",
2455
+ "",
2456
+ formatValue(packet.proofBoundary)
2457
+ ];
2458
+ addOptionalList(lines, "Listening Prompts", packet.listenerPrompts);
2459
+ addOptionalList(lines, "Caveats", packet.caveats);
2460
+ if (rejectedCandidates.length) {
2461
+ lines.push("", "## Rejected Candidates", "");
2462
+ for (const entry of rejectedCandidates) {
2463
+ const rejected = asRecord(entry) ?? {};
2464
+ const failedReceipts = asArray(rejected.failedReceipts).map(formatValue).join(", ") || "not captured";
2465
+ lines.push(`- ${formatCodeValue(rejected.label)}: ${failedReceipts}`);
2466
+ }
2467
+ }
2468
+ return `${lines.join("\n")}
2469
+ `;
2470
+ }
2471
+ function createHumanReviewPacketArtifacts(proofOrPacket, options = {}) {
2472
+ const packet = requireHumanReviewPacket(proofOrPacket);
2473
+ const markdown = formatHumanReviewPacketMarkdown(packet, options);
2474
+ return {
2475
+ packet,
2476
+ json: `${JSON.stringify(packet, null, 2)}
2477
+ `,
2478
+ markdown
2479
+ };
2480
+ }
2348
2481
  // Annotate the CommonJS export names for ESM import in node:
2349
2482
  0 && (module.exports = {
2350
2483
  RIDDLE_PROOF_PACK_MANIFEST,
2351
2484
  RIDDLE_PROOF_PACK_PROFILES,
2485
+ createHumanReviewPacketArtifacts,
2486
+ findHumanReviewPacket,
2487
+ formatHumanReviewPacketMarkdown,
2352
2488
  getPackEnabledRiddleProofPackProfiles,
2353
2489
  getRiddleProofPackProfile,
2354
2490
  getRiddleProofPackProfileByPackId,
@@ -2356,5 +2492,6 @@ function instantiateRiddleProofProfile(profileName, options = {}) {
2356
2492
  getRiddleProofProfilesByPackId,
2357
2493
  instantiateRiddleProofProfile,
2358
2494
  listRiddleProofPackProfiles,
2359
- listRiddleProofPacks
2495
+ listRiddleProofPacks,
2496
+ requireHumanReviewPacket
2360
2497
  });
package/dist/index.d.cts CHANGED
@@ -59,4 +59,20 @@ interface RiddleProofPackProfileOverrides {
59
59
  */
60
60
  declare function instantiateRiddleProofProfile(profileName: string, options?: RiddleProofPackProfileOverrides): RiddleProofProfile;
61
61
 
62
- export { RIDDLE_PROOF_PACK_MANIFEST, RIDDLE_PROOF_PACK_PROFILES, type RiddleProofPackProfileManifest, getPackEnabledRiddleProofPackProfiles, getRiddleProofPackProfile, getRiddleProofPackProfileByPackId, getRiddleProofPackProfileManifest, getRiddleProofProfilesByPackId, instantiateRiddleProofProfile, listRiddleProofPackProfiles, listRiddleProofPacks };
62
+ type HumanReviewPacket = Record<string, unknown> & {
63
+ kind: "human_review_packet";
64
+ };
65
+ interface HumanReviewPacketMarkdownOptions {
66
+ title?: string;
67
+ }
68
+ interface HumanReviewPacketArtifacts {
69
+ packet: HumanReviewPacket;
70
+ json: string;
71
+ markdown: string;
72
+ }
73
+ declare function findHumanReviewPacket(value: unknown): HumanReviewPacket | null;
74
+ declare function requireHumanReviewPacket(value: unknown): HumanReviewPacket;
75
+ declare function formatHumanReviewPacketMarkdown(packet: HumanReviewPacket, options?: HumanReviewPacketMarkdownOptions): string;
76
+ declare function createHumanReviewPacketArtifacts(proofOrPacket: unknown, options?: HumanReviewPacketMarkdownOptions): HumanReviewPacketArtifacts;
77
+
78
+ export { type HumanReviewPacket, type HumanReviewPacketArtifacts, type HumanReviewPacketMarkdownOptions, RIDDLE_PROOF_PACK_MANIFEST, RIDDLE_PROOF_PACK_PROFILES, type RiddleProofPackProfileManifest, createHumanReviewPacketArtifacts, findHumanReviewPacket, formatHumanReviewPacketMarkdown, getPackEnabledRiddleProofPackProfiles, getRiddleProofPackProfile, getRiddleProofPackProfileByPackId, getRiddleProofPackProfileManifest, getRiddleProofProfilesByPackId, instantiateRiddleProofProfile, listRiddleProofPackProfiles, listRiddleProofPacks, requireHumanReviewPacket };
package/dist/index.d.ts CHANGED
@@ -59,4 +59,20 @@ interface RiddleProofPackProfileOverrides {
59
59
  */
60
60
  declare function instantiateRiddleProofProfile(profileName: string, options?: RiddleProofPackProfileOverrides): RiddleProofProfile;
61
61
 
62
- export { RIDDLE_PROOF_PACK_MANIFEST, RIDDLE_PROOF_PACK_PROFILES, type RiddleProofPackProfileManifest, getPackEnabledRiddleProofPackProfiles, getRiddleProofPackProfile, getRiddleProofPackProfileByPackId, getRiddleProofPackProfileManifest, getRiddleProofProfilesByPackId, instantiateRiddleProofProfile, listRiddleProofPackProfiles, listRiddleProofPacks };
62
+ type HumanReviewPacket = Record<string, unknown> & {
63
+ kind: "human_review_packet";
64
+ };
65
+ interface HumanReviewPacketMarkdownOptions {
66
+ title?: string;
67
+ }
68
+ interface HumanReviewPacketArtifacts {
69
+ packet: HumanReviewPacket;
70
+ json: string;
71
+ markdown: string;
72
+ }
73
+ declare function findHumanReviewPacket(value: unknown): HumanReviewPacket | null;
74
+ declare function requireHumanReviewPacket(value: unknown): HumanReviewPacket;
75
+ declare function formatHumanReviewPacketMarkdown(packet: HumanReviewPacket, options?: HumanReviewPacketMarkdownOptions): string;
76
+ declare function createHumanReviewPacketArtifacts(proofOrPacket: unknown, options?: HumanReviewPacketMarkdownOptions): HumanReviewPacketArtifacts;
77
+
78
+ export { type HumanReviewPacket, type HumanReviewPacketArtifacts, type HumanReviewPacketMarkdownOptions, RIDDLE_PROOF_PACK_MANIFEST, RIDDLE_PROOF_PACK_PROFILES, type RiddleProofPackProfileManifest, createHumanReviewPacketArtifacts, findHumanReviewPacket, formatHumanReviewPacketMarkdown, getPackEnabledRiddleProofPackProfiles, getRiddleProofPackProfile, getRiddleProofPackProfileByPackId, getRiddleProofPackProfileManifest, getRiddleProofProfilesByPackId, instantiateRiddleProofProfile, listRiddleProofPackProfiles, listRiddleProofPacks, requireHumanReviewPacket };
package/dist/index.js CHANGED
@@ -2310,9 +2310,141 @@ function instantiateRiddleProofProfile(profileName, options = {}) {
2310
2310
  }
2311
2311
  );
2312
2312
  }
2313
+
2314
+ // src/humanReviewPacket.ts
2315
+ var isRecord2 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
2316
+ var asRecord = (value) => isRecord2(value) ? value : null;
2317
+ var asArray = (value) => Array.isArray(value) ? value : [];
2318
+ var getPath = (value, path) => {
2319
+ let cursor = value;
2320
+ for (const part of path.split(".")) {
2321
+ if (!isRecord2(cursor)) return void 0;
2322
+ cursor = cursor[part];
2323
+ }
2324
+ return cursor;
2325
+ };
2326
+ var formatValue = (value) => {
2327
+ if (value === null || value === void 0 || value === "") return "not captured";
2328
+ if (typeof value === "number") return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(4)));
2329
+ if (typeof value === "boolean") return value ? "true" : "false";
2330
+ return String(value);
2331
+ };
2332
+ var formatCodeValue = (value) => `\`${formatValue(value)}\``;
2333
+ var formatAction = (action) => {
2334
+ const record = asRecord(action);
2335
+ if (!record) return "not captured";
2336
+ const type = record.type ?? "set_mixer_level";
2337
+ const track = record.track ?? "track";
2338
+ const from = formatValue(record.from);
2339
+ const to = formatValue(record.to);
2340
+ const delta = record.delta === null || record.delta === void 0 ? "" : ` (${formatValue(record.delta)})`;
2341
+ return `${type} ${track}: ${from} -> ${to}${delta}`;
2342
+ };
2343
+ var addOptionalList = (lines, heading, values) => {
2344
+ const entries = asArray(values).filter((entry) => entry !== null && entry !== void 0 && entry !== "");
2345
+ if (!entries.length) return;
2346
+ lines.push("", `## ${heading}`, "");
2347
+ for (const entry of entries) lines.push(`- ${formatValue(entry)}`);
2348
+ };
2349
+ function findHumanReviewPacket(value) {
2350
+ if (!value || typeof value !== "object") return null;
2351
+ if (isRecord2(value) && value.kind === "human_review_packet") return value;
2352
+ if (Array.isArray(value)) {
2353
+ for (const entry of value) {
2354
+ const packet = findHumanReviewPacket(entry);
2355
+ if (packet) return packet;
2356
+ }
2357
+ return null;
2358
+ }
2359
+ for (const entry of Object.values(value)) {
2360
+ const packet = findHumanReviewPacket(entry);
2361
+ if (packet) return packet;
2362
+ }
2363
+ return null;
2364
+ }
2365
+ function requireHumanReviewPacket(value) {
2366
+ const packet = findHumanReviewPacket(value);
2367
+ if (!packet) throw new Error("No human_review_packet found");
2368
+ return packet;
2369
+ }
2370
+ function formatHumanReviewPacketMarkdown(packet, options = {}) {
2371
+ if (packet.kind !== "human_review_packet") {
2372
+ throw new Error("Expected a human_review_packet");
2373
+ }
2374
+ const recommendation = asRecord(packet.recommendation) ?? {};
2375
+ const candidate = asRecord(recommendation.candidate) ?? {};
2376
+ const guardrails = asRecord(packet.guardrails) ?? {};
2377
+ const ranking = asRecord(packet.ranking) ?? {};
2378
+ const request = asRecord(packet.request) ?? {};
2379
+ const supportedCandidates = asArray(packet.supportedCandidates);
2380
+ const rejectedCandidates = asArray(packet.rejectedCandidates);
2381
+ const selectedSong = getPath(packet, "target.selectedSong.selectedSong") ?? getPath(packet, "target.routeState.selectedSong");
2382
+ const lines = [
2383
+ `# ${options.title ?? "Human Review Packet"}`,
2384
+ "",
2385
+ `- status: ${formatCodeValue(packet.status)}`,
2386
+ `- domain: ${formatCodeValue(packet.domain)}`,
2387
+ `- evidence_role_pattern: ${formatCodeValue(packet.evidenceRolePattern)}`,
2388
+ `- requested_intent: ${formatValue(packet.requestedIntent)}`,
2389
+ `- selected_song: ${formatValue(selectedSong)}`,
2390
+ "",
2391
+ "## Recommendation",
2392
+ "",
2393
+ `- action: ${formatCodeValue(recommendation.action)}`,
2394
+ `- candidate: ${formatCodeValue(candidate.label)}`,
2395
+ `- candidate_action: ${formatCodeValue(formatAction(candidate.action))}`,
2396
+ `- reason: ${formatValue(recommendation.reason)}`,
2397
+ "",
2398
+ "## Objective Receipts",
2399
+ "",
2400
+ `- supported_candidates: ${formatCodeValue(guardrails.supportedClaimCandidateCount ?? supportedCandidates.length)}`,
2401
+ `- rejected_candidates: ${formatCodeValue(guardrails.rejectedCandidateCount ?? rejectedCandidates.length)}`,
2402
+ `- state_restored_after_loop: ${formatCodeValue(guardrails.stateRestoredAfterLoop)}`,
2403
+ `- candidate_actions_are_transient: ${formatCodeValue(request.candidateActionsAreTransient)}`,
2404
+ `- no_permanent_edit_unless_apply_best: ${formatCodeValue(guardrails.noPermanentEditUnlessApplyBest)}`,
2405
+ "",
2406
+ "## Ranking",
2407
+ "",
2408
+ `- metric: ${formatCodeValue(ranking.metric)}`,
2409
+ `- role: ${formatCodeValue(ranking.role)}`,
2410
+ `- lower_is_better: ${formatCodeValue(ranking.lowerIsBetter)}`,
2411
+ `- baseline: ${formatCodeValue(ranking.baselineCandidateRankingMetric)}`,
2412
+ `- best: ${formatCodeValue(ranking.bestCandidateRankingMetric)}`,
2413
+ `- delta: ${formatCodeValue(ranking.rankingMetricDelta)}`,
2414
+ "",
2415
+ "## Boundary",
2416
+ "",
2417
+ formatValue(packet.proofBoundary)
2418
+ ];
2419
+ addOptionalList(lines, "Listening Prompts", packet.listenerPrompts);
2420
+ addOptionalList(lines, "Caveats", packet.caveats);
2421
+ if (rejectedCandidates.length) {
2422
+ lines.push("", "## Rejected Candidates", "");
2423
+ for (const entry of rejectedCandidates) {
2424
+ const rejected = asRecord(entry) ?? {};
2425
+ const failedReceipts = asArray(rejected.failedReceipts).map(formatValue).join(", ") || "not captured";
2426
+ lines.push(`- ${formatCodeValue(rejected.label)}: ${failedReceipts}`);
2427
+ }
2428
+ }
2429
+ return `${lines.join("\n")}
2430
+ `;
2431
+ }
2432
+ function createHumanReviewPacketArtifacts(proofOrPacket, options = {}) {
2433
+ const packet = requireHumanReviewPacket(proofOrPacket);
2434
+ const markdown = formatHumanReviewPacketMarkdown(packet, options);
2435
+ return {
2436
+ packet,
2437
+ json: `${JSON.stringify(packet, null, 2)}
2438
+ `,
2439
+ markdown
2440
+ };
2441
+ }
2313
2442
  export {
2314
2443
  RIDDLE_PROOF_PACK_MANIFEST,
2315
2444
  RIDDLE_PROOF_PACK_PROFILES,
2445
+ createHumanReviewPacketArtifacts,
2446
+ findHumanReviewPacket,
2447
+ formatHumanReviewPacketMarkdown,
2316
2448
  getPackEnabledRiddleProofPackProfiles,
2317
2449
  getRiddleProofPackProfile,
2318
2450
  getRiddleProofPackProfileByPackId,
@@ -2320,5 +2452,6 @@ export {
2320
2452
  getRiddleProofProfilesByPackId,
2321
2453
  instantiateRiddleProofProfile,
2322
2454
  listRiddleProofPackProfiles,
2323
- listRiddleProofPacks
2455
+ listRiddleProofPacks,
2456
+ requireHumanReviewPacket
2324
2457
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof-packs",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "Reusable proof pack profiles and metadata helpers for the Riddle proof framework.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",
@@ -2,7 +2,7 @@
2
2
 
3
3
  These examples are local Playwright runner outputs captured against LilArcade Neon Step Sequencer on May 24, 2026. They are included to show how this pack records atomic proof claims with explicit evidence-role patterns.
4
4
 
5
- The raw `profile-result.json` files are real runner outputs. They intentionally keep enough evidence to audit the verdict, but the summaries are the preferred place to start.
5
+ The raw `profile-result.json` files are real runner outputs. They intentionally keep enough evidence to audit the verdict, but the summaries are the preferred place to start. Run 006 also includes standalone `human-review-packet.json` and `human-review-packet.md` files generated from the proof artifact.
6
6
 
7
7
  ## Runs
8
8
 
@@ -0,0 +1,795 @@
1
+ {
2
+ "version": "neon-step-sequencer.human-review-packet.v1",
3
+ "kind": "human_review_packet",
4
+ "domain": "audio_mix",
5
+ "status": "candidate_ready_for_listening_review",
6
+ "evidenceRolePattern": "interaction_snapshots",
7
+ "proofBoundary": "Objective receipts support or reject candidate change claims; musical taste still requires listening review.",
8
+ "requestedIntent": "turn the chord part down a little",
9
+ "target": {
10
+ "routeState": {
11
+ "proofKind": "neon-route-state",
12
+ "route": "/games/drum-sequencer",
13
+ "mode": "song",
14
+ "selectedSong": "Monkberry Moon Delight (Tab)",
15
+ "selectedPartIndex": 0
16
+ },
17
+ "selectedSong": {
18
+ "proofKind": "neon-selected-song",
19
+ "selectedSong": "Monkberry Moon Delight (Tab)",
20
+ "partCount": 9,
21
+ "mixProfile": {
22
+ "id": "monkberry-moon-delight-eq-lane-mix-v7",
23
+ "label": "Monkberry humanized EQ mix",
24
+ "description": "Humanized imported-tab mix with softer vocal formants, fuller bass harmonics, darker pads, and a deeper shared room/plate space.",
25
+ "proofWindows": [
26
+ {
27
+ "name": "introBed",
28
+ "label": "Intro Bed",
29
+ "bars": 1,
30
+ "seed": "riddle-sequencer-bed",
31
+ "requiredActive": [
32
+ "bass",
33
+ "chord",
34
+ "guitar"
35
+ ]
36
+ },
37
+ {
38
+ "name": "vocalEntry",
39
+ "label": "Vocal Entry",
40
+ "bars": 3,
41
+ "seed": "riddle-sequencer-vocal-melody",
42
+ "requiredActive": [
43
+ "rhythmSynth"
44
+ ]
45
+ }
46
+ ],
47
+ "eqSettings": {
48
+ "kick": [
49
+ 2.2,
50
+ -0.8,
51
+ -3.2,
52
+ -4.5,
53
+ -5.5,
54
+ -5,
55
+ 0.8,
56
+ 0
57
+ ],
58
+ "snare": [
59
+ -6,
60
+ -2.5,
61
+ 1.4,
62
+ -3,
63
+ -0.6,
64
+ 1.4,
65
+ 0.4,
66
+ -1.8
67
+ ],
68
+ "hat": [
69
+ -12,
70
+ -12,
71
+ -12,
72
+ -10,
73
+ -7,
74
+ -2.5,
75
+ -2.2,
76
+ -1.1
77
+ ],
78
+ "clap": [
79
+ -12,
80
+ -8,
81
+ -4,
82
+ -1.5,
83
+ 0.8,
84
+ 0,
85
+ -1,
86
+ -2
87
+ ],
88
+ "rim": [
89
+ -12,
90
+ -8,
91
+ -3.5,
92
+ -1.2,
93
+ 0,
94
+ -0.5,
95
+ -1.2,
96
+ -2
97
+ ],
98
+ "bass": [
99
+ -1.2,
100
+ 2.8,
101
+ -1.4,
102
+ -4.8,
103
+ -6,
104
+ -8,
105
+ -10,
106
+ -10
107
+ ],
108
+ "chord": [
109
+ -8,
110
+ -2.8,
111
+ -4.8,
112
+ -0.8,
113
+ -1,
114
+ -2.8,
115
+ -4.8,
116
+ -6.5
117
+ ],
118
+ "guitar": [
119
+ -8,
120
+ -4.8,
121
+ -3.4,
122
+ -2.2,
123
+ 1.2,
124
+ 1.4,
125
+ 0.2,
126
+ -1.8
127
+ ],
128
+ "rhythmSynth": [
129
+ -10,
130
+ -6,
131
+ -3.8,
132
+ -1.6,
133
+ 0.8,
134
+ 1.8,
135
+ 0,
136
+ -2.8
137
+ ]
138
+ },
139
+ "mixLanes": {
140
+ "kick": "Sub thump around 60 Hz with most low-mid box removed.",
141
+ "bass": "Bass foundation around 80-160 Hz with more 120 Hz body for small speakers.",
142
+ "snare": "Backbeat body near 250 Hz with controlled upper presence.",
143
+ "hat": "Soft high pulse, trimmed in brittle 4-8 kHz bands.",
144
+ "chord": "Darker pad bed with more room depth and less plasticky top.",
145
+ "guitar": "Mid/presence lane around 1-2 kHz, wider than the pad and glued into the shared music bus.",
146
+ "rhythmSynth": "Vocal melody lane in the upper mids, forward enough to survive the small-speaker monitor without crowding 1 kHz."
147
+ }
148
+ }
149
+ }
150
+ },
151
+ "request": {
152
+ "strategy": "mix-level-search",
153
+ "focusTracks": [
154
+ "bass",
155
+ "chord",
156
+ "guitar",
157
+ "rhythmSynth"
158
+ ],
159
+ "maxIterations": 6,
160
+ "monitorProfile": "smallSpeaker",
161
+ "restore": true,
162
+ "applyBest": false,
163
+ "candidateActionsAreTransient": true
164
+ },
165
+ "recommendation": {
166
+ "action": "review_before_applying_candidate",
167
+ "candidate": {
168
+ "index": 6,
169
+ "label": "chord -0.10",
170
+ "status": "supported",
171
+ "classification": null,
172
+ "claim": "Setting chord level from 0.38 to 0.28 changes rendered chord metrics while preserving Neon proof invariants.",
173
+ "action": {
174
+ "type": "set_mixer_level",
175
+ "track": "chord",
176
+ "from": 0.38,
177
+ "to": 0.28,
178
+ "delta": -0.1
179
+ },
180
+ "rankingMetric": 27.0709,
181
+ "receipts": [
182
+ {
183
+ "name": "mixer_edit_accepted",
184
+ "ok": true
185
+ },
186
+ {
187
+ "name": "contract_mixer_level_reflects_action",
188
+ "ok": true
189
+ },
190
+ {
191
+ "name": "rendered_target_metric_changed",
192
+ "ok": true
193
+ },
194
+ {
195
+ "name": "required_instruments_preserved",
196
+ "ok": true
197
+ },
198
+ {
199
+ "name": "no_clipping",
200
+ "ok": true
201
+ },
202
+ {
203
+ "name": "no_low_level_proof_window",
204
+ "ok": true
205
+ }
206
+ ],
207
+ "failedReceipts": [],
208
+ "guardrails": {
209
+ "mixerEditAccepted": true,
210
+ "contractLevelReflected": true,
211
+ "renderedTargetMoved": true,
212
+ "requiredInstrumentsPreserved": true,
213
+ "noClipping": true,
214
+ "noLowLevelProofWindow": true
215
+ },
216
+ "targetMovement": {
217
+ "track": "chord",
218
+ "moved": true,
219
+ "deltas": {
220
+ "rms": -0.0012,
221
+ "peak": -0.0088,
222
+ "totalEnergy": -0.000003
223
+ },
224
+ "before": {
225
+ "track": "chord",
226
+ "sampleCount": 2,
227
+ "activeCount": 0,
228
+ "rms": 0.0062,
229
+ "peak": 0.0334,
230
+ "totalEnergy": 0.000007
231
+ },
232
+ "after": {
233
+ "track": "chord",
234
+ "sampleCount": 2,
235
+ "activeCount": 0,
236
+ "rms": 0.005,
237
+ "peak": 0.0246,
238
+ "totalEnergy": 0.000004
239
+ }
240
+ },
241
+ "summary": {
242
+ "status": "passed",
243
+ "windowCount": 2,
244
+ "findingCount": 0,
245
+ "mixProfile": {
246
+ "id": "monkberry-moon-delight-eq-lane-mix-v7",
247
+ "label": "Monkberry humanized EQ mix"
248
+ }
249
+ }
250
+ },
251
+ "reason": "All objective claim receipts passed for this candidate; ranking only orders listening review."
252
+ },
253
+ "supportedCandidates": [
254
+ {
255
+ "index": 6,
256
+ "label": "chord -0.10",
257
+ "status": "supported",
258
+ "classification": null,
259
+ "claim": "Setting chord level from 0.38 to 0.28 changes rendered chord metrics while preserving Neon proof invariants.",
260
+ "action": {
261
+ "type": "set_mixer_level",
262
+ "track": "chord",
263
+ "from": 0.38,
264
+ "to": 0.28,
265
+ "delta": -0.1
266
+ },
267
+ "rankingMetric": 27.0709,
268
+ "receipts": [
269
+ {
270
+ "name": "mixer_edit_accepted",
271
+ "ok": true
272
+ },
273
+ {
274
+ "name": "contract_mixer_level_reflects_action",
275
+ "ok": true
276
+ },
277
+ {
278
+ "name": "rendered_target_metric_changed",
279
+ "ok": true
280
+ },
281
+ {
282
+ "name": "required_instruments_preserved",
283
+ "ok": true
284
+ },
285
+ {
286
+ "name": "no_clipping",
287
+ "ok": true
288
+ },
289
+ {
290
+ "name": "no_low_level_proof_window",
291
+ "ok": true
292
+ }
293
+ ],
294
+ "failedReceipts": [],
295
+ "guardrails": {
296
+ "mixerEditAccepted": true,
297
+ "contractLevelReflected": true,
298
+ "renderedTargetMoved": true,
299
+ "requiredInstrumentsPreserved": true,
300
+ "noClipping": true,
301
+ "noLowLevelProofWindow": true
302
+ },
303
+ "targetMovement": {
304
+ "track": "chord",
305
+ "moved": true,
306
+ "deltas": {
307
+ "rms": -0.0012,
308
+ "peak": -0.0088,
309
+ "totalEnergy": -0.000003
310
+ },
311
+ "before": {
312
+ "track": "chord",
313
+ "sampleCount": 2,
314
+ "activeCount": 0,
315
+ "rms": 0.0062,
316
+ "peak": 0.0334,
317
+ "totalEnergy": 0.000007
318
+ },
319
+ "after": {
320
+ "track": "chord",
321
+ "sampleCount": 2,
322
+ "activeCount": 0,
323
+ "rms": 0.005,
324
+ "peak": 0.0246,
325
+ "totalEnergy": 0.000004
326
+ }
327
+ },
328
+ "summary": {
329
+ "status": "passed",
330
+ "windowCount": 2,
331
+ "findingCount": 0,
332
+ "mixProfile": {
333
+ "id": "monkberry-moon-delight-eq-lane-mix-v7",
334
+ "label": "Monkberry humanized EQ mix"
335
+ }
336
+ }
337
+ },
338
+ {
339
+ "index": 4,
340
+ "label": "bass -0.18",
341
+ "status": "supported",
342
+ "classification": null,
343
+ "claim": "Setting bass level from 0.62 to 0.44 changes rendered bass metrics while preserving Neon proof invariants.",
344
+ "action": {
345
+ "type": "set_mixer_level",
346
+ "track": "bass",
347
+ "from": 0.62,
348
+ "to": 0.44,
349
+ "delta": -0.18
350
+ },
351
+ "rankingMetric": 27.4894,
352
+ "receipts": [
353
+ {
354
+ "name": "mixer_edit_accepted",
355
+ "ok": true
356
+ },
357
+ {
358
+ "name": "contract_mixer_level_reflects_action",
359
+ "ok": true
360
+ },
361
+ {
362
+ "name": "rendered_target_metric_changed",
363
+ "ok": true
364
+ },
365
+ {
366
+ "name": "required_instruments_preserved",
367
+ "ok": true
368
+ },
369
+ {
370
+ "name": "no_clipping",
371
+ "ok": true
372
+ },
373
+ {
374
+ "name": "no_low_level_proof_window",
375
+ "ok": true
376
+ }
377
+ ],
378
+ "failedReceipts": [],
379
+ "guardrails": {
380
+ "mixerEditAccepted": true,
381
+ "contractLevelReflected": true,
382
+ "renderedTargetMoved": true,
383
+ "requiredInstrumentsPreserved": true,
384
+ "noClipping": true,
385
+ "noLowLevelProofWindow": true
386
+ },
387
+ "targetMovement": {
388
+ "track": "bass",
389
+ "moved": true,
390
+ "deltas": {
391
+ "rms": -0.01625,
392
+ "peak": -0.0535,
393
+ "totalEnergy": -0.000304
394
+ },
395
+ "before": {
396
+ "track": "bass",
397
+ "sampleCount": 2,
398
+ "activeCount": 0,
399
+ "rms": 0.058,
400
+ "peak": 0.18415,
401
+ "totalEnergy": 0.000621
402
+ },
403
+ "after": {
404
+ "track": "bass",
405
+ "sampleCount": 2,
406
+ "activeCount": 0,
407
+ "rms": 0.04175,
408
+ "peak": 0.13065,
409
+ "totalEnergy": 0.000317
410
+ }
411
+ },
412
+ "summary": {
413
+ "status": "passed",
414
+ "windowCount": 2,
415
+ "findingCount": 0,
416
+ "mixProfile": {
417
+ "id": "monkberry-moon-delight-eq-lane-mix-v7",
418
+ "label": "Monkberry humanized EQ mix"
419
+ }
420
+ }
421
+ },
422
+ {
423
+ "index": 5,
424
+ "label": "chord +0.12",
425
+ "status": "supported",
426
+ "classification": null,
427
+ "claim": "Setting chord level from 0.38 to 0.50 changes rendered chord metrics while preserving Neon proof invariants.",
428
+ "action": {
429
+ "type": "set_mixer_level",
430
+ "track": "chord",
431
+ "from": 0.38,
432
+ "to": 0.5,
433
+ "delta": 0.12
434
+ },
435
+ "rankingMetric": 28.5162,
436
+ "receipts": [
437
+ {
438
+ "name": "mixer_edit_accepted",
439
+ "ok": true
440
+ },
441
+ {
442
+ "name": "contract_mixer_level_reflects_action",
443
+ "ok": true
444
+ },
445
+ {
446
+ "name": "rendered_target_metric_changed",
447
+ "ok": true
448
+ },
449
+ {
450
+ "name": "required_instruments_preserved",
451
+ "ok": true
452
+ },
453
+ {
454
+ "name": "no_clipping",
455
+ "ok": true
456
+ },
457
+ {
458
+ "name": "no_low_level_proof_window",
459
+ "ok": true
460
+ }
461
+ ],
462
+ "failedReceipts": [],
463
+ "guardrails": {
464
+ "mixerEditAccepted": true,
465
+ "contractLevelReflected": true,
466
+ "renderedTargetMoved": true,
467
+ "requiredInstrumentsPreserved": true,
468
+ "noClipping": true,
469
+ "noLowLevelProofWindow": true
470
+ },
471
+ "targetMovement": {
472
+ "track": "chord",
473
+ "moved": true,
474
+ "deltas": {
475
+ "rms": 0.002,
476
+ "peak": 0.0105,
477
+ "totalEnergy": 0.000005
478
+ },
479
+ "before": {
480
+ "track": "chord",
481
+ "sampleCount": 2,
482
+ "activeCount": 0,
483
+ "rms": 0.0062,
484
+ "peak": 0.0334,
485
+ "totalEnergy": 0.000007
486
+ },
487
+ "after": {
488
+ "track": "chord",
489
+ "sampleCount": 2,
490
+ "activeCount": 0,
491
+ "rms": 0.0082,
492
+ "peak": 0.0439,
493
+ "totalEnergy": 0.000012
494
+ }
495
+ },
496
+ "summary": {
497
+ "status": "passed",
498
+ "windowCount": 2,
499
+ "findingCount": 0,
500
+ "mixProfile": {
501
+ "id": "monkberry-moon-delight-eq-lane-mix-v7",
502
+ "label": "Monkberry humanized EQ mix"
503
+ }
504
+ }
505
+ },
506
+ {
507
+ "index": 2,
508
+ "label": "bass -0.10",
509
+ "status": "supported",
510
+ "classification": null,
511
+ "claim": "Setting bass level from 0.62 to 0.52 changes rendered bass metrics while preserving Neon proof invariants.",
512
+ "action": {
513
+ "type": "set_mixer_level",
514
+ "track": "bass",
515
+ "from": 0.62,
516
+ "to": 0.52,
517
+ "delta": -0.1
518
+ },
519
+ "rankingMetric": 29.17,
520
+ "receipts": [
521
+ {
522
+ "name": "mixer_edit_accepted",
523
+ "ok": true
524
+ },
525
+ {
526
+ "name": "contract_mixer_level_reflects_action",
527
+ "ok": true
528
+ },
529
+ {
530
+ "name": "rendered_target_metric_changed",
531
+ "ok": true
532
+ },
533
+ {
534
+ "name": "required_instruments_preserved",
535
+ "ok": true
536
+ },
537
+ {
538
+ "name": "no_clipping",
539
+ "ok": true
540
+ },
541
+ {
542
+ "name": "no_low_level_proof_window",
543
+ "ok": true
544
+ }
545
+ ],
546
+ "failedReceipts": [],
547
+ "guardrails": {
548
+ "mixerEditAccepted": true,
549
+ "contractLevelReflected": true,
550
+ "renderedTargetMoved": true,
551
+ "requiredInstrumentsPreserved": true,
552
+ "noClipping": true,
553
+ "noLowLevelProofWindow": true
554
+ },
555
+ "targetMovement": {
556
+ "track": "bass",
557
+ "moved": true,
558
+ "deltas": {
559
+ "rms": -0.00935,
560
+ "peak": -0.02975,
561
+ "totalEnergy": -0.000184
562
+ },
563
+ "before": {
564
+ "track": "bass",
565
+ "sampleCount": 2,
566
+ "activeCount": 0,
567
+ "rms": 0.058,
568
+ "peak": 0.18415,
569
+ "totalEnergy": 0.000621
570
+ },
571
+ "after": {
572
+ "track": "bass",
573
+ "sampleCount": 2,
574
+ "activeCount": 0,
575
+ "rms": 0.04865,
576
+ "peak": 0.1544,
577
+ "totalEnergy": 0.000437
578
+ }
579
+ },
580
+ "summary": {
581
+ "status": "passed",
582
+ "windowCount": 2,
583
+ "findingCount": 0,
584
+ "mixProfile": {
585
+ "id": "monkberry-moon-delight-eq-lane-mix-v7",
586
+ "label": "Monkberry humanized EQ mix"
587
+ }
588
+ }
589
+ },
590
+ {
591
+ "index": 1,
592
+ "label": "bass +0.12",
593
+ "status": "supported",
594
+ "classification": null,
595
+ "claim": "Setting bass level from 0.62 to 0.74 changes rendered bass metrics while preserving Neon proof invariants.",
596
+ "action": {
597
+ "type": "set_mixer_level",
598
+ "track": "bass",
599
+ "from": 0.62,
600
+ "to": 0.74,
601
+ "delta": 0.12
602
+ },
603
+ "rankingMetric": 31.7993,
604
+ "receipts": [
605
+ {
606
+ "name": "mixer_edit_accepted",
607
+ "ok": true
608
+ },
609
+ {
610
+ "name": "contract_mixer_level_reflects_action",
611
+ "ok": true
612
+ },
613
+ {
614
+ "name": "rendered_target_metric_changed",
615
+ "ok": true
616
+ },
617
+ {
618
+ "name": "required_instruments_preserved",
619
+ "ok": true
620
+ },
621
+ {
622
+ "name": "no_clipping",
623
+ "ok": true
624
+ },
625
+ {
626
+ "name": "no_low_level_proof_window",
627
+ "ok": true
628
+ }
629
+ ],
630
+ "failedReceipts": [],
631
+ "guardrails": {
632
+ "mixerEditAccepted": true,
633
+ "contractLevelReflected": true,
634
+ "renderedTargetMoved": true,
635
+ "requiredInstrumentsPreserved": true,
636
+ "noClipping": true,
637
+ "noLowLevelProofWindow": true
638
+ },
639
+ "targetMovement": {
640
+ "track": "bass",
641
+ "moved": true,
642
+ "deltas": {
643
+ "rms": 0.01125,
644
+ "peak": 0.0356,
645
+ "totalEnergy": 0.000264
646
+ },
647
+ "before": {
648
+ "track": "bass",
649
+ "sampleCount": 2,
650
+ "activeCount": 0,
651
+ "rms": 0.058,
652
+ "peak": 0.18415,
653
+ "totalEnergy": 0.000621
654
+ },
655
+ "after": {
656
+ "track": "bass",
657
+ "sampleCount": 2,
658
+ "activeCount": 0,
659
+ "rms": 0.06925,
660
+ "peak": 0.21975,
661
+ "totalEnergy": 0.000885
662
+ }
663
+ },
664
+ "summary": {
665
+ "status": "passed",
666
+ "windowCount": 2,
667
+ "findingCount": 0,
668
+ "mixProfile": {
669
+ "id": "monkberry-moon-delight-eq-lane-mix-v7",
670
+ "label": "Monkberry humanized EQ mix"
671
+ }
672
+ }
673
+ },
674
+ {
675
+ "index": 3,
676
+ "label": "bass +0.20",
677
+ "status": "supported",
678
+ "classification": null,
679
+ "claim": "Setting bass level from 0.62 to 0.82 changes rendered bass metrics while preserving Neon proof invariants.",
680
+ "action": {
681
+ "type": "set_mixer_level",
682
+ "track": "bass",
683
+ "from": 0.62,
684
+ "to": 0.82,
685
+ "delta": 0.2
686
+ },
687
+ "rankingMetric": 35.2559,
688
+ "receipts": [
689
+ {
690
+ "name": "mixer_edit_accepted",
691
+ "ok": true
692
+ },
693
+ {
694
+ "name": "contract_mixer_level_reflects_action",
695
+ "ok": true
696
+ },
697
+ {
698
+ "name": "rendered_target_metric_changed",
699
+ "ok": true
700
+ },
701
+ {
702
+ "name": "required_instruments_preserved",
703
+ "ok": true
704
+ },
705
+ {
706
+ "name": "no_clipping",
707
+ "ok": true
708
+ },
709
+ {
710
+ "name": "no_low_level_proof_window",
711
+ "ok": true
712
+ }
713
+ ],
714
+ "failedReceipts": [],
715
+ "guardrails": {
716
+ "mixerEditAccepted": true,
717
+ "contractLevelReflected": true,
718
+ "renderedTargetMoved": true,
719
+ "requiredInstrumentsPreserved": true,
720
+ "noClipping": true,
721
+ "noLowLevelProofWindow": true
722
+ },
723
+ "targetMovement": {
724
+ "track": "bass",
725
+ "moved": true,
726
+ "deltas": {
727
+ "rms": 0.0187,
728
+ "peak": 0.0594,
729
+ "totalEnergy": 0.000466
730
+ },
731
+ "before": {
732
+ "track": "bass",
733
+ "sampleCount": 2,
734
+ "activeCount": 0,
735
+ "rms": 0.058,
736
+ "peak": 0.18415,
737
+ "totalEnergy": 0.000621
738
+ },
739
+ "after": {
740
+ "track": "bass",
741
+ "sampleCount": 2,
742
+ "activeCount": 0,
743
+ "rms": 0.0767,
744
+ "peak": 0.24355,
745
+ "totalEnergy": 0.001087
746
+ }
747
+ },
748
+ "summary": {
749
+ "status": "passed",
750
+ "windowCount": 2,
751
+ "findingCount": 0,
752
+ "mixProfile": {
753
+ "id": "monkberry-moon-delight-eq-lane-mix-v7",
754
+ "label": "Monkberry humanized EQ mix"
755
+ }
756
+ }
757
+ }
758
+ ],
759
+ "rejectedCandidates": [],
760
+ "ranking": {
761
+ "metric": "objective_mix_health_penalty",
762
+ "role": "review_order_only",
763
+ "lowerIsBetter": true,
764
+ "baselineCandidateRankingMetric": 28.8336,
765
+ "bestCandidateRankingMetric": 27.0709,
766
+ "rankingMetricDelta": 1.7626
767
+ },
768
+ "baseline": {
769
+ "status": "passed",
770
+ "windowCount": 2,
771
+ "findingCount": 0,
772
+ "mixProfile": {
773
+ "id": "monkberry-moon-delight-eq-lane-mix-v7",
774
+ "label": "Monkberry humanized EQ mix"
775
+ }
776
+ },
777
+ "guardrails": {
778
+ "supportedClaimCandidateCount": 6,
779
+ "rejectedCandidateCount": 0,
780
+ "stateRestoredAfterLoop": true,
781
+ "noPermanentEditUnlessApplyBest": true
782
+ },
783
+ "listenerPrompts": [
784
+ "Does the supported candidate match the requested musical intent?",
785
+ "Is the changed part better balanced in the proof window?",
786
+ "Did the proof window contain the musical material being judged?",
787
+ "Would another section or speaker profile change the listening decision?"
788
+ ],
789
+ "caveats": [
790
+ "This packet does not prove subjective mix quality.",
791
+ "A supported candidate proves objective receipts and guardrails only.",
792
+ "Ranking orders review; it is not a taste score.",
793
+ "Keep or apply the candidate only after listening review."
794
+ ]
795
+ }
@@ -0,0 +1,49 @@
1
+ # Neon Human Review Packet
2
+
3
+ - status: `candidate_ready_for_listening_review`
4
+ - domain: `audio_mix`
5
+ - evidence_role_pattern: `interaction_snapshots`
6
+ - requested_intent: turn the chord part down a little
7
+ - selected_song: Monkberry Moon Delight (Tab)
8
+
9
+ ## Recommendation
10
+
11
+ - action: `review_before_applying_candidate`
12
+ - candidate: `chord -0.10`
13
+ - candidate_action: `set_mixer_level chord: 0.38 -> 0.28 (-0.1)`
14
+ - reason: All objective claim receipts passed for this candidate; ranking only orders listening review.
15
+
16
+ ## Objective Receipts
17
+
18
+ - supported_candidates: `6`
19
+ - rejected_candidates: `0`
20
+ - state_restored_after_loop: `true`
21
+ - candidate_actions_are_transient: `true`
22
+ - no_permanent_edit_unless_apply_best: `true`
23
+
24
+ ## Ranking
25
+
26
+ - metric: `objective_mix_health_penalty`
27
+ - role: `review_order_only`
28
+ - lower_is_better: `true`
29
+ - baseline: `28.8336`
30
+ - best: `27.0709`
31
+ - delta: `1.7626`
32
+
33
+ ## Boundary
34
+
35
+ Objective receipts support or reject candidate change claims; musical taste still requires listening review.
36
+
37
+ ## Listening Prompts
38
+
39
+ - Does the supported candidate match the requested musical intent?
40
+ - Is the changed part better balanced in the proof window?
41
+ - Did the proof window contain the musical material being judged?
42
+ - Would another section or speaker profile change the listening decision?
43
+
44
+ ## Caveats
45
+
46
+ - This packet does not prove subjective mix quality.
47
+ - A supported candidate proves objective receipts and guardrails only.
48
+ - Ranking orders review; it is not a taste score.
49
+ - Keep or apply the candidate only after listening review.