@riddledc/riddle-proof-packs 0.4.4 → 0.4.6

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 (31) hide show
  1. package/README.md +12 -1
  2. package/bin/riddle-proof-review-packet +4 -0
  3. package/dist/chunk-SAE6HFAG.js +139 -0
  4. package/dist/humanReviewPacket-APSxuvat.d.cts +17 -0
  5. package/dist/humanReviewPacket-APSxuvat.d.ts +17 -0
  6. package/dist/index.cjs +187 -2
  7. package/dist/index.d.cts +2 -17
  8. package/dist/index.d.ts +2 -17
  9. package/dist/index.js +190 -131
  10. package/dist/reviewPacketCli.cjs +323 -0
  11. package/dist/reviewPacketCli.d.cts +28 -0
  12. package/dist/reviewPacketCli.d.ts +28 -0
  13. package/dist/reviewPacketCli.js +155 -0
  14. package/package.json +6 -2
  15. package/packs/neon-step-sequencer/README.md +3 -0
  16. package/packs/neon-step-sequencer/case-study/findings.md +11 -0
  17. package/packs/neon-step-sequencer/case-study/ratchet-card.md +2 -1
  18. package/packs/neon-step-sequencer/case-study/ratchet-log.md +55 -0
  19. package/packs/neon-step-sequencer/examples/README.md +3 -1
  20. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/human-review-packet.md +3 -0
  21. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/artifact-manifest.json +32 -0
  22. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/console.json +4 -0
  23. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/dom-summary.json +40 -0
  24. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/human-review-packet.json +801 -0
  25. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/human-review-packet.md +52 -0
  26. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/profile-result.json +11994 -0
  27. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/proof.json +11994 -0
  28. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/screenshots/lilarcade-neon-ratchet-loop-approved-candidate-desktop-neon-ratchet-loop-approved-candidate.png +0 -0
  29. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/screenshots/lilarcade-neon-ratchet-loop-approved-candidate-desktop.png +0 -0
  30. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/summary.md +32 -0
  31. package/packs/neon-step-sequencer/profiles/ratchet-loop-approved-candidate.json +177 -0
package/README.md CHANGED
@@ -99,17 +99,28 @@ Profiles are stored under `packs/<slug>/profile.json` and mirrored into the runt
99
99
  - `neon-step-sequencer-full-mix-health-matrix`
100
100
  - `neon-step-sequencer-explore-songs-and-mixes`
101
101
  - `neon-step-sequencer-ratchet-loop-mix-level-search`
102
+ - `neon-step-sequencer-ratchet-loop-approved-candidate`
102
103
 
103
104
  ## Audio and Neon ratchet packs
104
105
 
105
106
  The `audio-mix` directory contains reusable audio-proof authoring guidance, a profile template, a metrics schema, a ratchet method, and a human-review rubric.
106
107
 
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.
108
+ 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 profiles now expect a compact `humanReviewPacket` for listening handoff: supported/rejected candidates, objective guardrails, state restoration, review-order ranking, taste caveats, and, when explicitly requested, an applied-candidate receipt. The case-study files record the claim, evidence, failure classification, smallest layer changed, and next sharper question for each run.
108
109
 
109
110
  ### Human-review packet handoff
110
111
 
111
112
  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
 
114
+ From the CLI:
115
+
116
+ ```sh
117
+ riddle-proof-review-packet \
118
+ --proof artifacts/riddle-proof/proof.json \
119
+ --output artifacts/riddle-proof
120
+ ```
121
+
122
+ This writes `human-review-packet.json` and `human-review-packet.md` next to the proof run. Use `--stdout` when an agent should read the Markdown handoff immediately.
123
+
113
124
  ```ts
114
125
  import {
115
126
  createHumanReviewPacketArtifacts,
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ const cliPath = new URL("../dist/reviewPacketCli.js", import.meta.url);
4
+ await import(cliPath.href);
@@ -0,0 +1,139 @@
1
+ // src/humanReviewPacket.ts
2
+ var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
3
+ var asRecord = (value) => isRecord(value) ? value : null;
4
+ var asArray = (value) => Array.isArray(value) ? value : [];
5
+ var getPath = (value, path) => {
6
+ let cursor = value;
7
+ for (const part of path.split(".")) {
8
+ if (!isRecord(cursor)) return void 0;
9
+ cursor = cursor[part];
10
+ }
11
+ return cursor;
12
+ };
13
+ var formatValue = (value) => {
14
+ if (value === null || value === void 0 || value === "") return "not captured";
15
+ if (typeof value === "number") return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(4)));
16
+ if (typeof value === "boolean") return value ? "true" : "false";
17
+ return String(value);
18
+ };
19
+ var formatCodeValue = (value) => `\`${formatValue(value)}\``;
20
+ var formatAction = (action) => {
21
+ const record = asRecord(action);
22
+ if (!record) return "not captured";
23
+ const type = record.type ?? "set_mixer_level";
24
+ const track = record.track ?? "track";
25
+ const from = formatValue(record.from);
26
+ const to = formatValue(record.to);
27
+ const delta = record.delta === null || record.delta === void 0 ? "" : ` (${formatValue(record.delta)})`;
28
+ return `${type} ${track}: ${from} -> ${to}${delta}`;
29
+ };
30
+ var addOptionalList = (lines, heading, values) => {
31
+ const entries = asArray(values).filter((entry) => entry !== null && entry !== void 0 && entry !== "");
32
+ if (!entries.length) return;
33
+ lines.push("", `## ${heading}`, "");
34
+ for (const entry of entries) lines.push(`- ${formatValue(entry)}`);
35
+ };
36
+ function findHumanReviewPacket(value) {
37
+ if (!value || typeof value !== "object") return null;
38
+ if (isRecord(value) && value.kind === "human_review_packet") return value;
39
+ if (Array.isArray(value)) {
40
+ for (const entry of value) {
41
+ const packet = findHumanReviewPacket(entry);
42
+ if (packet) return packet;
43
+ }
44
+ return null;
45
+ }
46
+ for (const entry of Object.values(value)) {
47
+ const packet = findHumanReviewPacket(entry);
48
+ if (packet) return packet;
49
+ }
50
+ return null;
51
+ }
52
+ function requireHumanReviewPacket(value) {
53
+ const packet = findHumanReviewPacket(value);
54
+ if (!packet) throw new Error("No human_review_packet found");
55
+ return packet;
56
+ }
57
+ function formatHumanReviewPacketMarkdown(packet, options = {}) {
58
+ if (packet.kind !== "human_review_packet") {
59
+ throw new Error("Expected a human_review_packet");
60
+ }
61
+ const recommendation = asRecord(packet.recommendation) ?? {};
62
+ const candidate = asRecord(recommendation.candidate) ?? {};
63
+ const guardrails = asRecord(packet.guardrails) ?? {};
64
+ const ranking = asRecord(packet.ranking) ?? {};
65
+ const request = asRecord(packet.request) ?? {};
66
+ const approval = asRecord(request.approval) ?? {};
67
+ const supportedCandidates = asArray(packet.supportedCandidates);
68
+ const rejectedCandidates = asArray(packet.rejectedCandidates);
69
+ const selectedSong = getPath(packet, "target.selectedSong.selectedSong") ?? getPath(packet, "target.routeState.selectedSong");
70
+ const lines = [
71
+ `# ${options.title ?? "Human Review Packet"}`,
72
+ "",
73
+ `- status: ${formatCodeValue(packet.status)}`,
74
+ `- domain: ${formatCodeValue(packet.domain)}`,
75
+ `- evidence_role_pattern: ${formatCodeValue(packet.evidenceRolePattern)}`,
76
+ `- requested_intent: ${formatValue(packet.requestedIntent)}`,
77
+ `- selected_song: ${formatValue(selectedSong)}`,
78
+ "",
79
+ "## Recommendation",
80
+ "",
81
+ `- action: ${formatCodeValue(recommendation.action)}`,
82
+ `- candidate: ${formatCodeValue(candidate.label)}`,
83
+ `- candidate_action: ${formatCodeValue(formatAction(candidate.action))}`,
84
+ `- reason: ${formatValue(recommendation.reason)}`,
85
+ "",
86
+ "## Objective Receipts",
87
+ "",
88
+ `- supported_candidates: ${formatCodeValue(guardrails.supportedClaimCandidateCount ?? supportedCandidates.length)}`,
89
+ `- rejected_candidates: ${formatCodeValue(guardrails.rejectedCandidateCount ?? rejectedCandidates.length)}`,
90
+ `- state_restored_after_loop: ${formatCodeValue(guardrails.stateRestoredAfterLoop)}`,
91
+ `- candidate_actions_are_transient: ${formatCodeValue(request.candidateActionsAreTransient)}`,
92
+ `- no_permanent_edit_unless_apply_best: ${formatCodeValue(guardrails.noPermanentEditUnlessApplyBest)}`,
93
+ `- approved_candidate_applied: ${formatCodeValue(guardrails.approvedCandidateApplied)}`,
94
+ `- approval_mode: ${formatCodeValue(approval.mode)}`,
95
+ `- approval_basis: ${formatValue(approval.basis)}`,
96
+ "",
97
+ "## Ranking",
98
+ "",
99
+ `- metric: ${formatCodeValue(ranking.metric)}`,
100
+ `- role: ${formatCodeValue(ranking.role)}`,
101
+ `- lower_is_better: ${formatCodeValue(ranking.lowerIsBetter)}`,
102
+ `- baseline: ${formatCodeValue(ranking.baselineCandidateRankingMetric)}`,
103
+ `- best: ${formatCodeValue(ranking.bestCandidateRankingMetric)}`,
104
+ `- delta: ${formatCodeValue(ranking.rankingMetricDelta)}`,
105
+ "",
106
+ "## Boundary",
107
+ "",
108
+ formatValue(packet.proofBoundary)
109
+ ];
110
+ addOptionalList(lines, "Listening Prompts", packet.listenerPrompts);
111
+ addOptionalList(lines, "Caveats", packet.caveats);
112
+ if (rejectedCandidates.length) {
113
+ lines.push("", "## Rejected Candidates", "");
114
+ for (const entry of rejectedCandidates) {
115
+ const rejected = asRecord(entry) ?? {};
116
+ const failedReceipts = asArray(rejected.failedReceipts).map(formatValue).join(", ") || "not captured";
117
+ lines.push(`- ${formatCodeValue(rejected.label)}: ${failedReceipts}`);
118
+ }
119
+ }
120
+ return `${lines.join("\n")}
121
+ `;
122
+ }
123
+ function createHumanReviewPacketArtifacts(proofOrPacket, options = {}) {
124
+ const packet = requireHumanReviewPacket(proofOrPacket);
125
+ const markdown = formatHumanReviewPacketMarkdown(packet, options);
126
+ return {
127
+ packet,
128
+ json: `${JSON.stringify(packet, null, 2)}
129
+ `,
130
+ markdown
131
+ };
132
+ }
133
+
134
+ export {
135
+ findHumanReviewPacket,
136
+ requireHumanReviewPacket,
137
+ formatHumanReviewPacketMarkdown,
138
+ createHumanReviewPacketArtifacts
139
+ };
@@ -0,0 +1,17 @@
1
+ type HumanReviewPacket = Record<string, unknown> & {
2
+ kind: "human_review_packet";
3
+ };
4
+ interface HumanReviewPacketMarkdownOptions {
5
+ title?: string;
6
+ }
7
+ interface HumanReviewPacketArtifacts {
8
+ packet: HumanReviewPacket;
9
+ json: string;
10
+ markdown: string;
11
+ }
12
+ declare function findHumanReviewPacket(value: unknown): HumanReviewPacket | null;
13
+ declare function requireHumanReviewPacket(value: unknown): HumanReviewPacket;
14
+ declare function formatHumanReviewPacketMarkdown(packet: HumanReviewPacket, options?: HumanReviewPacketMarkdownOptions): string;
15
+ declare function createHumanReviewPacketArtifacts(proofOrPacket: unknown, options?: HumanReviewPacketMarkdownOptions): HumanReviewPacketArtifacts;
16
+
17
+ export { type HumanReviewPacket as H, type HumanReviewPacketArtifacts as a, type HumanReviewPacketMarkdownOptions as b, createHumanReviewPacketArtifacts as c, formatHumanReviewPacketMarkdown as d, findHumanReviewPacket as f, requireHumanReviewPacket as r };
@@ -0,0 +1,17 @@
1
+ type HumanReviewPacket = Record<string, unknown> & {
2
+ kind: "human_review_packet";
3
+ };
4
+ interface HumanReviewPacketMarkdownOptions {
5
+ title?: string;
6
+ }
7
+ interface HumanReviewPacketArtifacts {
8
+ packet: HumanReviewPacket;
9
+ json: string;
10
+ markdown: string;
11
+ }
12
+ declare function findHumanReviewPacket(value: unknown): HumanReviewPacket | null;
13
+ declare function requireHumanReviewPacket(value: unknown): HumanReviewPacket;
14
+ declare function formatHumanReviewPacketMarkdown(packet: HumanReviewPacket, options?: HumanReviewPacketMarkdownOptions): string;
15
+ declare function createHumanReviewPacketArtifacts(proofOrPacket: unknown, options?: HumanReviewPacketMarkdownOptions): HumanReviewPacketArtifacts;
16
+
17
+ export { type HumanReviewPacket as H, type HumanReviewPacketArtifacts as a, type HumanReviewPacketMarkdownOptions as b, createHumanReviewPacketArtifacts as c, formatHumanReviewPacketMarkdown as d, findHumanReviewPacket as f, requireHumanReviewPacket as r };
package/dist/index.cjs CHANGED
@@ -1656,6 +1656,185 @@ var playback_sync_default = {
1656
1656
  }
1657
1657
  };
1658
1658
 
1659
+ // packs/neon-step-sequencer/profiles/ratchet-loop-approved-candidate.json
1660
+ var ratchet_loop_approved_candidate_default = {
1661
+ version: "riddle-proof.profile.v1",
1662
+ name: "neon-step-sequencer-ratchet-loop-approved-candidate",
1663
+ target: {
1664
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
1665
+ viewports: [
1666
+ {
1667
+ name: "desktop",
1668
+ width: 1440,
1669
+ height: 1e3
1670
+ }
1671
+ ],
1672
+ timeout_sec: 360,
1673
+ wait_for_selector: ".drum-sequencer h1",
1674
+ setup_actions: [
1675
+ {
1676
+ type: "window_eval",
1677
+ label: "capture-neon-contract",
1678
+ timeout_ms: 1e4,
1679
+ store_return_to: "__neonMixProof.contract",
1680
+ script: "const contract=window.__NEON_MIX_PROOF__; const diagnostic=contract?.captureDiagnostic?.(); window.__neonMixProof={...(window.__neonMixProof||{}),contract:{available:Boolean(contract),diagnostic}}; return window.__neonMixProof.contract;",
1681
+ return_summary_fields: [
1682
+ {
1683
+ path: "available"
1684
+ },
1685
+ {
1686
+ path: "diagnostic.selectedSong.selectedSong"
1687
+ }
1688
+ ]
1689
+ },
1690
+ {
1691
+ type: "assert_window_value",
1692
+ path: "__neonMixProof.contract.available",
1693
+ expected_value: true,
1694
+ timeout_ms: 1e4
1695
+ },
1696
+ {
1697
+ type: "window_call",
1698
+ label: "apply-approved-claim-candidate",
1699
+ path: "__NEON_MIX_PROOF__.runRatchetLoop",
1700
+ args: [
1701
+ {
1702
+ intent: "turn the chord part down a little",
1703
+ strategy: "mix-level-search",
1704
+ focusTracks: [
1705
+ "bass",
1706
+ "chord",
1707
+ "guitar",
1708
+ "rhythmSynth"
1709
+ ],
1710
+ maxIterations: 6,
1711
+ monitorProfile: "smallSpeaker",
1712
+ restore: true,
1713
+ applyBest: true,
1714
+ approval: {
1715
+ mode: "mixing_canon_surrogate",
1716
+ approvedBy: "codex",
1717
+ basis: "subtle level reduction after objective receipts pass; this keeps development moving while preserving a listening-review caveat"
1718
+ }
1719
+ }
1720
+ ],
1721
+ store_return_to: "__neonMixProof.approvedCandidateLoop",
1722
+ capture_return: true,
1723
+ timeout_ms: 24e4,
1724
+ return_summary_fields: [
1725
+ {
1726
+ path: "ok"
1727
+ },
1728
+ {
1729
+ path: "status"
1730
+ },
1731
+ {
1732
+ path: "best.claimVerdict.status"
1733
+ },
1734
+ {
1735
+ path: "best.claimCandidate.action.track"
1736
+ },
1737
+ {
1738
+ path: "appliedCandidateReceipt.ok"
1739
+ },
1740
+ {
1741
+ path: "humanReviewPacket.status"
1742
+ },
1743
+ {
1744
+ path: "humanReviewPacket.request.approval.mode"
1745
+ },
1746
+ {
1747
+ path: "humanReviewPacket.ranking.role"
1748
+ }
1749
+ ]
1750
+ },
1751
+ {
1752
+ type: "assert_window_value",
1753
+ path: "__neonMixProof.approvedCandidateLoop.ok",
1754
+ expected_value: true,
1755
+ timeout_ms: 1e4
1756
+ },
1757
+ {
1758
+ type: "assert_window_value",
1759
+ path: "__neonMixProof.approvedCandidateLoop.appliedCandidateReceipt.ok",
1760
+ expected_value: true,
1761
+ timeout_ms: 1e4
1762
+ },
1763
+ {
1764
+ type: "assert_window_value",
1765
+ path: "__neonMixProof.approvedCandidateLoop.humanReviewPacket.status",
1766
+ expected_value: "candidate_applied_for_listening_review",
1767
+ timeout_ms: 1e4
1768
+ },
1769
+ {
1770
+ type: "assert_window_value",
1771
+ path: "__neonMixProof.approvedCandidateLoop.humanReviewPacket.request.candidateActionsAreTransient",
1772
+ expected_value: false,
1773
+ timeout_ms: 1e4
1774
+ },
1775
+ {
1776
+ type: "assert_window_value",
1777
+ path: "__neonMixProof.approvedCandidateLoop.humanReviewPacket.guardrails.approvedCandidateApplied",
1778
+ expected_value: true,
1779
+ timeout_ms: 1e4
1780
+ },
1781
+ {
1782
+ type: "screenshot",
1783
+ label: "neon-step-sequencer-ratchet-loop-approved-candidate",
1784
+ mode: "viewport"
1785
+ }
1786
+ ]
1787
+ },
1788
+ checks: [
1789
+ {
1790
+ type: "route_loaded",
1791
+ expected_path: "/games/drum-sequencer"
1792
+ },
1793
+ {
1794
+ type: "selector_visible",
1795
+ selector: ".drum-sequencer h1"
1796
+ },
1797
+ {
1798
+ type: "no_horizontal_overflow"
1799
+ },
1800
+ {
1801
+ type: "no_fatal_console_errors"
1802
+ }
1803
+ ],
1804
+ artifacts: [
1805
+ "screenshot",
1806
+ "console",
1807
+ "dom_summary",
1808
+ "proof_json"
1809
+ ],
1810
+ baseline_policy: "invariant_only",
1811
+ failure_policy: {
1812
+ environment_blocked: "neutral",
1813
+ proof_insufficient: "review",
1814
+ needs_human_review: "review",
1815
+ product_regression: "fail"
1816
+ },
1817
+ metadata: {
1818
+ pack_id: "neon_step_sequencer",
1819
+ pack_public_name: "Neon Step Sequencer Pack",
1820
+ evidence_role_pattern: "interaction_snapshots",
1821
+ purpose: "Run a bounded loop, use an explicit operator-approval surrogate, apply the supported claim candidate, and preserve a listening-review packet.",
1822
+ required_receipts: [
1823
+ "ratchet loop returns ok",
1824
+ "a supported claim candidate is selected",
1825
+ "approved candidate application receipt is captured",
1826
+ "compact human-review packet is captured",
1827
+ "ranking remains review-order only",
1828
+ "listening-review caveat remains explicit"
1829
+ ],
1830
+ does_not_prove: [
1831
+ "subjective mix quality",
1832
+ "that the approval surrogate is a real listener preference",
1833
+ "all possible mix edits"
1834
+ ]
1835
+ }
1836
+ };
1837
+
1659
1838
  // packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json
1660
1839
  var ratchet_loop_mix_level_search_default = {
1661
1840
  version: "riddle-proof.profile.v1",
@@ -2258,7 +2437,8 @@ var rawProfiles = {
2258
2437
  "neon-step-sequencer-mobile-trainer-layout": mobile_trainer_layout_default,
2259
2438
  "neon-step-sequencer-full-mix-health-matrix": full_mix_health_matrix_default,
2260
2439
  "neon-step-sequencer-explore-songs-and-mixes": explore_songs_and_mixes_default,
2261
- "neon-step-sequencer-ratchet-loop-mix-level-search": ratchet_loop_mix_level_search_default
2440
+ "neon-step-sequencer-ratchet-loop-mix-level-search": ratchet_loop_mix_level_search_default,
2441
+ "neon-step-sequencer-ratchet-loop-approved-candidate": ratchet_loop_approved_candidate_default
2262
2442
  };
2263
2443
  var sourcePathOverrides = Object.freeze({
2264
2444
  "neon-step-sequencer-fast-mix-health": "packs/neon-step-sequencer/profiles/fast-mix-health.json",
@@ -2268,7 +2448,8 @@ var sourcePathOverrides = Object.freeze({
2268
2448
  "neon-step-sequencer-mobile-trainer-layout": "packs/neon-step-sequencer/profiles/mobile-trainer-layout.json",
2269
2449
  "neon-step-sequencer-full-mix-health-matrix": "packs/neon-step-sequencer/profiles/full-mix-health-matrix.json",
2270
2450
  "neon-step-sequencer-explore-songs-and-mixes": "packs/neon-step-sequencer/profiles/explore-songs-and-mixes.json",
2271
- "neon-step-sequencer-ratchet-loop-mix-level-search": "packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json"
2451
+ "neon-step-sequencer-ratchet-loop-mix-level-search": "packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json",
2452
+ "neon-step-sequencer-ratchet-loop-approved-candidate": "packs/neon-step-sequencer/profiles/ratchet-loop-approved-candidate.json"
2272
2453
  });
2273
2454
  var RIDDLE_PROOF_PACK_PROFILES = Object.freeze(
2274
2455
  Object.fromEntries(
@@ -2415,6 +2596,7 @@ function formatHumanReviewPacketMarkdown(packet, options = {}) {
2415
2596
  const guardrails = asRecord(packet.guardrails) ?? {};
2416
2597
  const ranking = asRecord(packet.ranking) ?? {};
2417
2598
  const request = asRecord(packet.request) ?? {};
2599
+ const approval = asRecord(request.approval) ?? {};
2418
2600
  const supportedCandidates = asArray(packet.supportedCandidates);
2419
2601
  const rejectedCandidates = asArray(packet.rejectedCandidates);
2420
2602
  const selectedSong = getPath(packet, "target.selectedSong.selectedSong") ?? getPath(packet, "target.routeState.selectedSong");
@@ -2441,6 +2623,9 @@ function formatHumanReviewPacketMarkdown(packet, options = {}) {
2441
2623
  `- state_restored_after_loop: ${formatCodeValue(guardrails.stateRestoredAfterLoop)}`,
2442
2624
  `- candidate_actions_are_transient: ${formatCodeValue(request.candidateActionsAreTransient)}`,
2443
2625
  `- no_permanent_edit_unless_apply_best: ${formatCodeValue(guardrails.noPermanentEditUnlessApplyBest)}`,
2626
+ `- approved_candidate_applied: ${formatCodeValue(guardrails.approvedCandidateApplied)}`,
2627
+ `- approval_mode: ${formatCodeValue(approval.mode)}`,
2628
+ `- approval_basis: ${formatValue(approval.basis)}`,
2444
2629
  "",
2445
2630
  "## Ranking",
2446
2631
  "",
package/dist/index.d.cts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as _riddledc_riddle_proof from '@riddledc/riddle-proof';
2
2
  import { RiddleProofProfile } from '@riddledc/riddle-proof';
3
+ export { H as HumanReviewPacket, a as HumanReviewPacketArtifacts, b as HumanReviewPacketMarkdownOptions, c as createHumanReviewPacketArtifacts, f as findHumanReviewPacket, d as formatHumanReviewPacketMarkdown, r as requireHumanReviewPacket } from './humanReviewPacket-APSxuvat.cjs';
3
4
 
4
5
  interface RiddleProofPackProfileManifest {
5
6
  /** Profile slug and canonical manifest key. */
@@ -59,20 +60,4 @@ interface RiddleProofPackProfileOverrides {
59
60
  */
60
61
  declare function instantiateRiddleProofProfile(profileName: string, options?: RiddleProofPackProfileOverrides): RiddleProofProfile;
61
62
 
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 };
63
+ export { RIDDLE_PROOF_PACK_MANIFEST, RIDDLE_PROOF_PACK_PROFILES, type RiddleProofPackProfileManifest, getPackEnabledRiddleProofPackProfiles, getRiddleProofPackProfile, getRiddleProofPackProfileByPackId, getRiddleProofPackProfileManifest, getRiddleProofProfilesByPackId, instantiateRiddleProofProfile, listRiddleProofPackProfiles, listRiddleProofPacks };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as _riddledc_riddle_proof from '@riddledc/riddle-proof';
2
2
  import { RiddleProofProfile } from '@riddledc/riddle-proof';
3
+ export { H as HumanReviewPacket, a as HumanReviewPacketArtifacts, b as HumanReviewPacketMarkdownOptions, c as createHumanReviewPacketArtifacts, f as findHumanReviewPacket, d as formatHumanReviewPacketMarkdown, r as requireHumanReviewPacket } from './humanReviewPacket-APSxuvat.js';
3
4
 
4
5
  interface RiddleProofPackProfileManifest {
5
6
  /** Profile slug and canonical manifest key. */
@@ -59,20 +60,4 @@ interface RiddleProofPackProfileOverrides {
59
60
  */
60
61
  declare function instantiateRiddleProofProfile(profileName: string, options?: RiddleProofPackProfileOverrides): RiddleProofProfile;
61
62
 
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 };
63
+ export { RIDDLE_PROOF_PACK_MANIFEST, RIDDLE_PROOF_PACK_PROFILES, type RiddleProofPackProfileManifest, getPackEnabledRiddleProofPackProfiles, getRiddleProofPackProfile, getRiddleProofPackProfileByPackId, getRiddleProofPackProfileManifest, getRiddleProofProfilesByPackId, instantiateRiddleProofProfile, listRiddleProofPackProfiles, listRiddleProofPacks };