@riddledc/riddle-proof-packs 0.4.5 → 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 (24) hide show
  1. package/README.md +2 -1
  2. package/dist/{chunk-XQ2N4EYF.js → chunk-SAE6HFAG.js} +4 -0
  3. package/dist/index.cjs +187 -2
  4. package/dist/index.js +184 -3
  5. package/dist/reviewPacketCli.cjs +4 -0
  6. package/dist/reviewPacketCli.js +1 -1
  7. package/package.json +1 -1
  8. package/packs/neon-step-sequencer/README.md +3 -0
  9. package/packs/neon-step-sequencer/case-study/findings.md +11 -0
  10. package/packs/neon-step-sequencer/case-study/ratchet-card.md +2 -1
  11. package/packs/neon-step-sequencer/case-study/ratchet-log.md +55 -0
  12. package/packs/neon-step-sequencer/examples/README.md +3 -1
  13. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/human-review-packet.md +3 -0
  14. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/artifact-manifest.json +32 -0
  15. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/console.json +4 -0
  16. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/dom-summary.json +40 -0
  17. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/human-review-packet.json +801 -0
  18. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/human-review-packet.md +52 -0
  19. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/profile-result.json +11994 -0
  20. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/proof.json +11994 -0
  21. 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
  22. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/screenshots/lilarcade-neon-ratchet-loop-approved-candidate-desktop.png +0 -0
  23. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/summary.md +32 -0
  24. package/packs/neon-step-sequencer/profiles/ratchet-loop-approved-candidate.json +177 -0
package/README.md CHANGED
@@ -99,12 +99,13 @@ 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
 
@@ -63,6 +63,7 @@ function formatHumanReviewPacketMarkdown(packet, options = {}) {
63
63
  const guardrails = asRecord(packet.guardrails) ?? {};
64
64
  const ranking = asRecord(packet.ranking) ?? {};
65
65
  const request = asRecord(packet.request) ?? {};
66
+ const approval = asRecord(request.approval) ?? {};
66
67
  const supportedCandidates = asArray(packet.supportedCandidates);
67
68
  const rejectedCandidates = asArray(packet.rejectedCandidates);
68
69
  const selectedSong = getPath(packet, "target.selectedSong.selectedSong") ?? getPath(packet, "target.routeState.selectedSong");
@@ -89,6 +90,9 @@ function formatHumanReviewPacketMarkdown(packet, options = {}) {
89
90
  `- state_restored_after_loop: ${formatCodeValue(guardrails.stateRestoredAfterLoop)}`,
90
91
  `- candidate_actions_are_transient: ${formatCodeValue(request.candidateActionsAreTransient)}`,
91
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)}`,
92
96
  "",
93
97
  "## Ranking",
94
98
  "",
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.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  findHumanReviewPacket,
4
4
  formatHumanReviewPacketMarkdown,
5
5
  requireHumanReviewPacket
6
- } from "./chunk-XQ2N4EYF.js";
6
+ } from "./chunk-SAE6HFAG.js";
7
7
 
8
8
  // src/pack-data.ts
9
9
  import { normalizeRiddleProofProfile } from "@riddledc/riddle-proof";
@@ -1624,6 +1624,185 @@ var playback_sync_default = {
1624
1624
  }
1625
1625
  };
1626
1626
 
1627
+ // packs/neon-step-sequencer/profiles/ratchet-loop-approved-candidate.json
1628
+ var ratchet_loop_approved_candidate_default = {
1629
+ version: "riddle-proof.profile.v1",
1630
+ name: "neon-step-sequencer-ratchet-loop-approved-candidate",
1631
+ target: {
1632
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
1633
+ viewports: [
1634
+ {
1635
+ name: "desktop",
1636
+ width: 1440,
1637
+ height: 1e3
1638
+ }
1639
+ ],
1640
+ timeout_sec: 360,
1641
+ wait_for_selector: ".drum-sequencer h1",
1642
+ setup_actions: [
1643
+ {
1644
+ type: "window_eval",
1645
+ label: "capture-neon-contract",
1646
+ timeout_ms: 1e4,
1647
+ store_return_to: "__neonMixProof.contract",
1648
+ script: "const contract=window.__NEON_MIX_PROOF__; const diagnostic=contract?.captureDiagnostic?.(); window.__neonMixProof={...(window.__neonMixProof||{}),contract:{available:Boolean(contract),diagnostic}}; return window.__neonMixProof.contract;",
1649
+ return_summary_fields: [
1650
+ {
1651
+ path: "available"
1652
+ },
1653
+ {
1654
+ path: "diagnostic.selectedSong.selectedSong"
1655
+ }
1656
+ ]
1657
+ },
1658
+ {
1659
+ type: "assert_window_value",
1660
+ path: "__neonMixProof.contract.available",
1661
+ expected_value: true,
1662
+ timeout_ms: 1e4
1663
+ },
1664
+ {
1665
+ type: "window_call",
1666
+ label: "apply-approved-claim-candidate",
1667
+ path: "__NEON_MIX_PROOF__.runRatchetLoop",
1668
+ args: [
1669
+ {
1670
+ intent: "turn the chord part down a little",
1671
+ strategy: "mix-level-search",
1672
+ focusTracks: [
1673
+ "bass",
1674
+ "chord",
1675
+ "guitar",
1676
+ "rhythmSynth"
1677
+ ],
1678
+ maxIterations: 6,
1679
+ monitorProfile: "smallSpeaker",
1680
+ restore: true,
1681
+ applyBest: true,
1682
+ approval: {
1683
+ mode: "mixing_canon_surrogate",
1684
+ approvedBy: "codex",
1685
+ basis: "subtle level reduction after objective receipts pass; this keeps development moving while preserving a listening-review caveat"
1686
+ }
1687
+ }
1688
+ ],
1689
+ store_return_to: "__neonMixProof.approvedCandidateLoop",
1690
+ capture_return: true,
1691
+ timeout_ms: 24e4,
1692
+ return_summary_fields: [
1693
+ {
1694
+ path: "ok"
1695
+ },
1696
+ {
1697
+ path: "status"
1698
+ },
1699
+ {
1700
+ path: "best.claimVerdict.status"
1701
+ },
1702
+ {
1703
+ path: "best.claimCandidate.action.track"
1704
+ },
1705
+ {
1706
+ path: "appliedCandidateReceipt.ok"
1707
+ },
1708
+ {
1709
+ path: "humanReviewPacket.status"
1710
+ },
1711
+ {
1712
+ path: "humanReviewPacket.request.approval.mode"
1713
+ },
1714
+ {
1715
+ path: "humanReviewPacket.ranking.role"
1716
+ }
1717
+ ]
1718
+ },
1719
+ {
1720
+ type: "assert_window_value",
1721
+ path: "__neonMixProof.approvedCandidateLoop.ok",
1722
+ expected_value: true,
1723
+ timeout_ms: 1e4
1724
+ },
1725
+ {
1726
+ type: "assert_window_value",
1727
+ path: "__neonMixProof.approvedCandidateLoop.appliedCandidateReceipt.ok",
1728
+ expected_value: true,
1729
+ timeout_ms: 1e4
1730
+ },
1731
+ {
1732
+ type: "assert_window_value",
1733
+ path: "__neonMixProof.approvedCandidateLoop.humanReviewPacket.status",
1734
+ expected_value: "candidate_applied_for_listening_review",
1735
+ timeout_ms: 1e4
1736
+ },
1737
+ {
1738
+ type: "assert_window_value",
1739
+ path: "__neonMixProof.approvedCandidateLoop.humanReviewPacket.request.candidateActionsAreTransient",
1740
+ expected_value: false,
1741
+ timeout_ms: 1e4
1742
+ },
1743
+ {
1744
+ type: "assert_window_value",
1745
+ path: "__neonMixProof.approvedCandidateLoop.humanReviewPacket.guardrails.approvedCandidateApplied",
1746
+ expected_value: true,
1747
+ timeout_ms: 1e4
1748
+ },
1749
+ {
1750
+ type: "screenshot",
1751
+ label: "neon-step-sequencer-ratchet-loop-approved-candidate",
1752
+ mode: "viewport"
1753
+ }
1754
+ ]
1755
+ },
1756
+ checks: [
1757
+ {
1758
+ type: "route_loaded",
1759
+ expected_path: "/games/drum-sequencer"
1760
+ },
1761
+ {
1762
+ type: "selector_visible",
1763
+ selector: ".drum-sequencer h1"
1764
+ },
1765
+ {
1766
+ type: "no_horizontal_overflow"
1767
+ },
1768
+ {
1769
+ type: "no_fatal_console_errors"
1770
+ }
1771
+ ],
1772
+ artifacts: [
1773
+ "screenshot",
1774
+ "console",
1775
+ "dom_summary",
1776
+ "proof_json"
1777
+ ],
1778
+ baseline_policy: "invariant_only",
1779
+ failure_policy: {
1780
+ environment_blocked: "neutral",
1781
+ proof_insufficient: "review",
1782
+ needs_human_review: "review",
1783
+ product_regression: "fail"
1784
+ },
1785
+ metadata: {
1786
+ pack_id: "neon_step_sequencer",
1787
+ pack_public_name: "Neon Step Sequencer Pack",
1788
+ evidence_role_pattern: "interaction_snapshots",
1789
+ purpose: "Run a bounded loop, use an explicit operator-approval surrogate, apply the supported claim candidate, and preserve a listening-review packet.",
1790
+ required_receipts: [
1791
+ "ratchet loop returns ok",
1792
+ "a supported claim candidate is selected",
1793
+ "approved candidate application receipt is captured",
1794
+ "compact human-review packet is captured",
1795
+ "ranking remains review-order only",
1796
+ "listening-review caveat remains explicit"
1797
+ ],
1798
+ does_not_prove: [
1799
+ "subjective mix quality",
1800
+ "that the approval surrogate is a real listener preference",
1801
+ "all possible mix edits"
1802
+ ]
1803
+ }
1804
+ };
1805
+
1627
1806
  // packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json
1628
1807
  var ratchet_loop_mix_level_search_default = {
1629
1808
  version: "riddle-proof.profile.v1",
@@ -2226,7 +2405,8 @@ var rawProfiles = {
2226
2405
  "neon-step-sequencer-mobile-trainer-layout": mobile_trainer_layout_default,
2227
2406
  "neon-step-sequencer-full-mix-health-matrix": full_mix_health_matrix_default,
2228
2407
  "neon-step-sequencer-explore-songs-and-mixes": explore_songs_and_mixes_default,
2229
- "neon-step-sequencer-ratchet-loop-mix-level-search": ratchet_loop_mix_level_search_default
2408
+ "neon-step-sequencer-ratchet-loop-mix-level-search": ratchet_loop_mix_level_search_default,
2409
+ "neon-step-sequencer-ratchet-loop-approved-candidate": ratchet_loop_approved_candidate_default
2230
2410
  };
2231
2411
  var sourcePathOverrides = Object.freeze({
2232
2412
  "neon-step-sequencer-fast-mix-health": "packs/neon-step-sequencer/profiles/fast-mix-health.json",
@@ -2236,7 +2416,8 @@ var sourcePathOverrides = Object.freeze({
2236
2416
  "neon-step-sequencer-mobile-trainer-layout": "packs/neon-step-sequencer/profiles/mobile-trainer-layout.json",
2237
2417
  "neon-step-sequencer-full-mix-health-matrix": "packs/neon-step-sequencer/profiles/full-mix-health-matrix.json",
2238
2418
  "neon-step-sequencer-explore-songs-and-mixes": "packs/neon-step-sequencer/profiles/explore-songs-and-mixes.json",
2239
- "neon-step-sequencer-ratchet-loop-mix-level-search": "packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json"
2419
+ "neon-step-sequencer-ratchet-loop-mix-level-search": "packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json",
2420
+ "neon-step-sequencer-ratchet-loop-approved-candidate": "packs/neon-step-sequencer/profiles/ratchet-loop-approved-candidate.json"
2240
2421
  });
2241
2422
  var RIDDLE_PROOF_PACK_PROFILES = Object.freeze(
2242
2423
  Object.fromEntries(
@@ -103,6 +103,7 @@ function formatHumanReviewPacketMarkdown(packet, options = {}) {
103
103
  const guardrails = asRecord(packet.guardrails) ?? {};
104
104
  const ranking = asRecord(packet.ranking) ?? {};
105
105
  const request = asRecord(packet.request) ?? {};
106
+ const approval = asRecord(request.approval) ?? {};
106
107
  const supportedCandidates = asArray(packet.supportedCandidates);
107
108
  const rejectedCandidates = asArray(packet.rejectedCandidates);
108
109
  const selectedSong = getPath(packet, "target.selectedSong.selectedSong") ?? getPath(packet, "target.routeState.selectedSong");
@@ -129,6 +130,9 @@ function formatHumanReviewPacketMarkdown(packet, options = {}) {
129
130
  `- state_restored_after_loop: ${formatCodeValue(guardrails.stateRestoredAfterLoop)}`,
130
131
  `- candidate_actions_are_transient: ${formatCodeValue(request.candidateActionsAreTransient)}`,
131
132
  `- no_permanent_edit_unless_apply_best: ${formatCodeValue(guardrails.noPermanentEditUnlessApplyBest)}`,
133
+ `- approved_candidate_applied: ${formatCodeValue(guardrails.approvedCandidateApplied)}`,
134
+ `- approval_mode: ${formatCodeValue(approval.mode)}`,
135
+ `- approval_basis: ${formatValue(approval.basis)}`,
132
136
  "",
133
137
  "## Ranking",
134
138
  "",
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createHumanReviewPacketArtifacts
3
- } from "./chunk-XQ2N4EYF.js";
3
+ } from "./chunk-SAE6HFAG.js";
4
4
 
5
5
  // src/reviewPacketCli.ts
6
6
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof-packs",
3
- "version": "0.4.5",
3
+ "version": "0.4.6",
4
4
  "description": "Reusable proof pack profiles and metadata helpers for the Riddle proof framework.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",
@@ -28,6 +28,7 @@ This pack is the first app-specific lab for the open Riddle Proof architecture.
28
28
  - `profiles/full-mix-health-matrix.json`: current-target matrix across desktop, phone, iPad Mini, and iPad.
29
29
  - `profiles/explore-songs-and-mixes.json`: exploration sweep for proof-window health.
30
30
  - `profiles/ratchet-loop-mix-level-search.json`: bounded ratchet loop using the Neon `mix-level-search` strategy.
31
+ - `profiles/ratchet-loop-approved-candidate.json`: bounded ratchet loop that uses an explicit operator-approval surrogate, applies the supported candidate, and keeps the listening-review caveat visible.
31
32
 
32
33
  ## Ratchet loop strategy
33
34
 
@@ -35,6 +36,8 @@ The loop is not mix-specific as a proof concept. The proof concept is a bounded
35
36
 
36
37
  This pack's first concrete strategy is `mix-level-search`, which turns small level edits into change-claim candidates. Each candidate says what action will be attempted, what receipts must support the claim, and what evidence should be reviewed afterward. The loop may include a ranking metric to order review, but the verdict comes from receipts and invariants, not from a universal mix-quality number. It still does not decide subjective mix taste; the output is a `humanReviewPacket` for listening handoff.
37
38
 
39
+ The approved-candidate profile is the next handoff pattern after review-packet generation. It only applies a candidate when the app contract reports that the candidate's objective receipts passed, and the packet records `approvedCandidateApplied` plus the approval mode. The approval mode can keep development moving, but it is still an operator surrogate; it does not prove listener preference.
40
+
38
41
  ## Example evidence
39
42
 
40
43
  The `examples/` directory contains local Playwright proof results captured against LilArcade Neon Step Sequencer on May 24, 2026:
@@ -123,6 +123,17 @@ Pack summary guidance first; Riddle Proof core only if a general display primiti
123
123
  - rerun: passed on May 24, 2026 with local Playwright.
124
124
  - next sharper question: can the packet become the standard output shape for one-off and background candidate operators across more than `mix-level-search`?
125
125
 
126
+ ### Run 007 made applying a candidate explicit and auditable
127
+
128
+ - run: `run-007-approved-candidate-applied`
129
+ - claim: a bounded ratchet loop can apply a supported candidate only after an explicit approval mode, then record that final apply step without claiming subjective mix quality.
130
+ - observed evidence: loop status was `claim_candidate_supported`; packet status was `candidate_applied_for_listening_review`; approval mode was `mixing_canon_surrogate`; recommended candidate was `chord -0.10`; applied-candidate receipt passed with observed level `0.28`; supported candidate count was `6`; rejected candidate count was `0`; state was restored before the final apply; ranking role stayed `review_order_only`.
131
+ - classification: none; passing `interaction_snapshots` proof with subjective listening caveat.
132
+ - smallest layer changed: app proof contract and proof-pack profile assertions.
133
+ - change made: made `applyBest` require a supported claim candidate, added an applied-candidate receipt, surfaced approval metadata in the human-review packet, and added an approved-candidate profile.
134
+ - rerun: passed on May 24, 2026 with local Playwright.
135
+ - next sharper question: can follow-on agents use the applied-candidate packet to prepare a code/config patch only when the operator explicitly asks for a durable edit?
136
+
126
137
  ### Local runner shutdown needs a small ergonomics follow-up
127
138
 
128
139
  - run: `run-002-mix-change`, `run-003-full-matrix`, `run-004-ratchet-loop-mix-level-search`
@@ -36,7 +36,8 @@ The project shows that a complex audio app can improve proof confidence mostly b
36
36
  - Run 004: a bounded loop tested six `mix-level-search` change-claim candidates, returned `chord -0.10` as a supported review candidate with receipt-level evidence, and restored app state.
37
37
  - Run 005: a `current_target` exploration sweep sampled four songs and eight song/part entries. The first real sweep exposed app-contract normalization gaps and hot built-in song presets; after the local ratchet fixes it passed with `8` entries, `0` findings, and no clipping.
38
38
  - Run 006: the bounded loop returned a compact `humanReviewPacket` with the supported `chord -0.10` candidate, objective guardrails, state restoration, review-order ranking, and listening caveats.
39
+ - Run 007: the approved-candidate profile used a `mixing_canon_surrogate` approval mode, restored loop state, applied the supported `chord -0.10` candidate, and recorded an applied-candidate receipt for listening review.
39
40
 
40
41
  ## Honest boundary
41
42
 
42
- These runs prove objective claims about a running app target. They do not prove that the mix is tasteful, that every song section is healthy, or that a release candidate is better than production. Run 005 is still bounded to configured song/part limits. Run 006 makes the human handoff explicit: the packet is a compact review object, not an automated taste verdict. The ratchet loop is a generic proof-loop shape; `mix-level-search` is only the first Neon strategy plugged into it.
43
+ These runs prove objective claims about a running app target. They do not prove that the mix is tasteful, that every song section is healthy, or that a release candidate is better than production. Run 005 is still bounded to configured song/part limits. Runs 006 and 007 make the human handoff explicit: the packet is a compact review object, and the approval mode is a visible operator/surrogate choice, not an automated taste verdict. The ratchet loop is a generic proof-loop shape; `mix-level-search` is only the first Neon strategy plugged into it.
@@ -337,6 +337,61 @@ Next sharper question:
337
337
 
338
338
  Can one-off commands and background runs use this packet as their common output surface while strategy-specific code remains behind the app contract?
339
339
 
340
+ ## Run 007 - Approved candidate applied
341
+
342
+ Claim:
343
+
344
+ Neon can use an explicit approval mode to apply a supported change-claim candidate for listening review while keeping objective proof receipts and subjective taste separate.
345
+
346
+ Profile:
347
+
348
+ `profiles/ratchet-loop-approved-candidate.json`
349
+
350
+ Evidence to capture:
351
+
352
+ - supported claim candidate
353
+ - explicit approval mode
354
+ - state restoration before the final apply
355
+ - applied-candidate receipt
356
+ - compact human-review packet
357
+ - listening-review caveat
358
+
359
+ Possible outcomes:
360
+
361
+ - `candidate_applied_for_listening_review`: a supported candidate was applied after explicit approval and the final app state reflects the candidate.
362
+ - `candidate_ready_for_listening_review`: a supported candidate exists, but the profile did not request final application.
363
+ - `needs_human_review`: no candidate satisfied every objective receipt.
364
+ - `product_regression`: the selected candidate could not be applied or the final mixer state did not reflect it.
365
+
366
+ Observed status:
367
+
368
+ Passed on May 24, 2026 with `local-playwright`.
369
+
370
+ Observed evidence:
371
+
372
+ - loop status `claim_candidate_supported`
373
+ - packet status `candidate_applied_for_listening_review`
374
+ - approval mode `mixing_canon_surrogate`
375
+ - recommended candidate `chord -0.10`
376
+ - final applied level `0.28`
377
+ - applied-candidate receipt `ok`
378
+ - supported candidates `6`
379
+ - rejected candidates `0`
380
+ - state restored before apply `true`
381
+ - ranking role `review_order_only`
382
+
383
+ Failure classification:
384
+
385
+ None. This was a passing `interaction_snapshots` proof. The approval mode is intentionally labeled as a surrogate so the packet does not imply a real listener has judged the mix.
386
+
387
+ Smallest layer changed:
388
+
389
+ App proof contract and proof-pack profile. Riddle Proof core did not need a change.
390
+
391
+ Next sharper question:
392
+
393
+ Can the reusable pack expose this approved-candidate shape without making approval automatic, and can follow-on agents use the packet to prepare a code/config patch only when the operator explicitly asks for one?
394
+
340
395
  ## Project note
341
396
 
342
397
  The ratchet is not a pass. The ratchet is the next sharper question.
@@ -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. Run 006 also includes standalone `human-review-packet.json` and `human-review-packet.md` files generated from the proof artifact.
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. Runs 006 and 007 also include standalone `human-review-packet.json` and `human-review-packet.md` files generated from the proof artifact.
6
6
 
7
7
  ## Runs
8
8
 
@@ -14,6 +14,7 @@ The raw `profile-result.json` files are real runner outputs. They intentionally
14
14
  | `run-004-ratchet-loop-mix-level-search` | `interaction_snapshots` | passed | A bounded ratchet loop tests mix-level change-claim candidates, records receipt verdicts, chooses a supported candidate for review, and restores app state. |
15
15
  | `run-005-explore-songs-and-mixes-final` | `current_target` | passed | A bounded exploration sweep samples four songs and eight song/part entries, producing a zero-finding confidence map after app-contract and mix-headroom fixes. |
16
16
  | `run-006-ratchet-loop-human-review-packet` | `interaction_snapshots` | passed | A bounded ratchet loop returns a compact `humanReviewPacket` for handoff: supported candidates, objective guardrails, state restoration, review-order ranking, and listening caveats. |
17
+ | `run-007-approved-candidate-applied` | `interaction_snapshots` | passed | A bounded ratchet loop uses an explicit operator-approval surrogate, applies the supported `chord -0.10` candidate, and keeps the listening-review caveat in the packet. |
17
18
 
18
19
  ## What these examples do not prove
19
20
 
@@ -24,3 +25,4 @@ The raw `profile-result.json` files are real runner outputs. They intentionally
24
25
  - The ratchet-loop run does not prove that the loop primitive is mix-specific; `mix-level-search` is only this pack's first concrete strategy.
25
26
  - The ratchet-loop run does not prove that the supported candidate should be kept. Its ranking metric is a review-order hint, not a taste verdict.
26
27
  - The human-review packet does not replace listening judgment. It compresses objective receipts and caveats so a person or follow-on agent can decide what to review next.
28
+ - The approved-candidate run does not prove that the surrogate approval is a real listener preference; it proves that the apply step was explicit, guarded by supported receipts, and recorded for review.
@@ -20,6 +20,9 @@
20
20
  - state_restored_after_loop: `true`
21
21
  - candidate_actions_are_transient: `true`
22
22
  - no_permanent_edit_unless_apply_best: `true`
23
+ - approved_candidate_applied: `not captured`
24
+ - approval_mode: `not captured`
25
+ - approval_basis: not captured
23
26
 
24
27
  ## Ranking
25
28