@riddledc/riddle-proof-packs 0.4.5 → 0.4.7

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 (47) hide show
  1. package/README.md +53 -1
  2. package/bin/riddle-proof-durable-candidate-plan +4 -0
  3. package/dist/{chunk-XQ2N4EYF.js → chunk-SAE6HFAG.js} +4 -0
  4. package/dist/chunk-VFPSPQD7.js +219 -0
  5. package/dist/durableCandidatePlan-Dv2P33Wg.d.cts +77 -0
  6. package/dist/durableCandidatePlan-Dv2P33Wg.d.ts +77 -0
  7. package/dist/durableCandidatePlanCli.cjs +445 -0
  8. package/dist/durableCandidatePlanCli.d.cts +32 -0
  9. package/dist/durableCandidatePlanCli.d.ts +32 -0
  10. package/dist/durableCandidatePlanCli.js +177 -0
  11. package/dist/index.cjs +403 -2
  12. package/dist/index.d.cts +1 -0
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.js +192 -3
  15. package/dist/reviewPacketCli.cjs +4 -0
  16. package/dist/reviewPacketCli.js +1 -1
  17. package/package.json +3 -2
  18. package/packs/audio-mix/ratchet-method.md +12 -0
  19. package/packs/neon-step-sequencer/README.md +7 -0
  20. package/packs/neon-step-sequencer/case-study/findings.md +22 -0
  21. package/packs/neon-step-sequencer/case-study/ratchet-card.md +3 -1
  22. package/packs/neon-step-sequencer/case-study/ratchet-log.md +112 -0
  23. package/packs/neon-step-sequencer/examples/README.md +5 -1
  24. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/human-review-packet.md +3 -0
  25. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/artifact-manifest.json +32 -0
  26. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/console.json +4 -0
  27. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/dom-summary.json +40 -0
  28. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/human-review-packet.json +801 -0
  29. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/human-review-packet.md +52 -0
  30. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/profile-result.json +11994 -0
  31. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/proof.json +11994 -0
  32. 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
  33. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/screenshots/lilarcade-neon-ratchet-loop-approved-candidate-desktop.png +0 -0
  34. package/packs/neon-step-sequencer/examples/run-007-approved-candidate-applied/summary.md +32 -0
  35. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/artifact-manifest.json +32 -0
  36. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/console.json +4 -0
  37. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/dom-summary.json +40 -0
  38. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/durable-candidate-patch-plan.json +69 -0
  39. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/durable-candidate-patch-plan.md +29 -0
  40. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/human-review-packet.json +801 -0
  41. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/human-review-packet.md +52 -0
  42. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/profile-result.json +5078 -0
  43. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/proof.json +5078 -0
  44. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/screenshots/lilarcade-neon-fast-mix-health-desktop-neon-fast-mix-health.png +0 -0
  45. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/screenshots/lilarcade-neon-fast-mix-health-desktop.png +0 -0
  46. package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/summary.md +39 -0
  47. package/packs/neon-step-sequencer/profiles/ratchet-loop-approved-candidate.json +177 -0
package/dist/index.js CHANGED
@@ -1,9 +1,14 @@
1
+ import {
2
+ createDurableCandidatePatchPlan,
3
+ createDurableCandidatePatchPlanArtifacts,
4
+ formatDurableCandidatePatchPlanMarkdown
5
+ } from "./chunk-VFPSPQD7.js";
1
6
  import {
2
7
  createHumanReviewPacketArtifacts,
3
8
  findHumanReviewPacket,
4
9
  formatHumanReviewPacketMarkdown,
5
10
  requireHumanReviewPacket
6
- } from "./chunk-XQ2N4EYF.js";
11
+ } from "./chunk-SAE6HFAG.js";
7
12
 
8
13
  // src/pack-data.ts
9
14
  import { normalizeRiddleProofProfile } from "@riddledc/riddle-proof";
@@ -1624,6 +1629,185 @@ var playback_sync_default = {
1624
1629
  }
1625
1630
  };
1626
1631
 
1632
+ // packs/neon-step-sequencer/profiles/ratchet-loop-approved-candidate.json
1633
+ var ratchet_loop_approved_candidate_default = {
1634
+ version: "riddle-proof.profile.v1",
1635
+ name: "neon-step-sequencer-ratchet-loop-approved-candidate",
1636
+ target: {
1637
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
1638
+ viewports: [
1639
+ {
1640
+ name: "desktop",
1641
+ width: 1440,
1642
+ height: 1e3
1643
+ }
1644
+ ],
1645
+ timeout_sec: 360,
1646
+ wait_for_selector: ".drum-sequencer h1",
1647
+ setup_actions: [
1648
+ {
1649
+ type: "window_eval",
1650
+ label: "capture-neon-contract",
1651
+ timeout_ms: 1e4,
1652
+ store_return_to: "__neonMixProof.contract",
1653
+ script: "const contract=window.__NEON_MIX_PROOF__; const diagnostic=contract?.captureDiagnostic?.(); window.__neonMixProof={...(window.__neonMixProof||{}),contract:{available:Boolean(contract),diagnostic}}; return window.__neonMixProof.contract;",
1654
+ return_summary_fields: [
1655
+ {
1656
+ path: "available"
1657
+ },
1658
+ {
1659
+ path: "diagnostic.selectedSong.selectedSong"
1660
+ }
1661
+ ]
1662
+ },
1663
+ {
1664
+ type: "assert_window_value",
1665
+ path: "__neonMixProof.contract.available",
1666
+ expected_value: true,
1667
+ timeout_ms: 1e4
1668
+ },
1669
+ {
1670
+ type: "window_call",
1671
+ label: "apply-approved-claim-candidate",
1672
+ path: "__NEON_MIX_PROOF__.runRatchetLoop",
1673
+ args: [
1674
+ {
1675
+ intent: "turn the chord part down a little",
1676
+ strategy: "mix-level-search",
1677
+ focusTracks: [
1678
+ "bass",
1679
+ "chord",
1680
+ "guitar",
1681
+ "rhythmSynth"
1682
+ ],
1683
+ maxIterations: 6,
1684
+ monitorProfile: "smallSpeaker",
1685
+ restore: true,
1686
+ applyBest: true,
1687
+ approval: {
1688
+ mode: "mixing_canon_surrogate",
1689
+ approvedBy: "codex",
1690
+ basis: "subtle level reduction after objective receipts pass; this keeps development moving while preserving a listening-review caveat"
1691
+ }
1692
+ }
1693
+ ],
1694
+ store_return_to: "__neonMixProof.approvedCandidateLoop",
1695
+ capture_return: true,
1696
+ timeout_ms: 24e4,
1697
+ return_summary_fields: [
1698
+ {
1699
+ path: "ok"
1700
+ },
1701
+ {
1702
+ path: "status"
1703
+ },
1704
+ {
1705
+ path: "best.claimVerdict.status"
1706
+ },
1707
+ {
1708
+ path: "best.claimCandidate.action.track"
1709
+ },
1710
+ {
1711
+ path: "appliedCandidateReceipt.ok"
1712
+ },
1713
+ {
1714
+ path: "humanReviewPacket.status"
1715
+ },
1716
+ {
1717
+ path: "humanReviewPacket.request.approval.mode"
1718
+ },
1719
+ {
1720
+ path: "humanReviewPacket.ranking.role"
1721
+ }
1722
+ ]
1723
+ },
1724
+ {
1725
+ type: "assert_window_value",
1726
+ path: "__neonMixProof.approvedCandidateLoop.ok",
1727
+ expected_value: true,
1728
+ timeout_ms: 1e4
1729
+ },
1730
+ {
1731
+ type: "assert_window_value",
1732
+ path: "__neonMixProof.approvedCandidateLoop.appliedCandidateReceipt.ok",
1733
+ expected_value: true,
1734
+ timeout_ms: 1e4
1735
+ },
1736
+ {
1737
+ type: "assert_window_value",
1738
+ path: "__neonMixProof.approvedCandidateLoop.humanReviewPacket.status",
1739
+ expected_value: "candidate_applied_for_listening_review",
1740
+ timeout_ms: 1e4
1741
+ },
1742
+ {
1743
+ type: "assert_window_value",
1744
+ path: "__neonMixProof.approvedCandidateLoop.humanReviewPacket.request.candidateActionsAreTransient",
1745
+ expected_value: false,
1746
+ timeout_ms: 1e4
1747
+ },
1748
+ {
1749
+ type: "assert_window_value",
1750
+ path: "__neonMixProof.approvedCandidateLoop.humanReviewPacket.guardrails.approvedCandidateApplied",
1751
+ expected_value: true,
1752
+ timeout_ms: 1e4
1753
+ },
1754
+ {
1755
+ type: "screenshot",
1756
+ label: "neon-step-sequencer-ratchet-loop-approved-candidate",
1757
+ mode: "viewport"
1758
+ }
1759
+ ]
1760
+ },
1761
+ checks: [
1762
+ {
1763
+ type: "route_loaded",
1764
+ expected_path: "/games/drum-sequencer"
1765
+ },
1766
+ {
1767
+ type: "selector_visible",
1768
+ selector: ".drum-sequencer h1"
1769
+ },
1770
+ {
1771
+ type: "no_horizontal_overflow"
1772
+ },
1773
+ {
1774
+ type: "no_fatal_console_errors"
1775
+ }
1776
+ ],
1777
+ artifacts: [
1778
+ "screenshot",
1779
+ "console",
1780
+ "dom_summary",
1781
+ "proof_json"
1782
+ ],
1783
+ baseline_policy: "invariant_only",
1784
+ failure_policy: {
1785
+ environment_blocked: "neutral",
1786
+ proof_insufficient: "review",
1787
+ needs_human_review: "review",
1788
+ product_regression: "fail"
1789
+ },
1790
+ metadata: {
1791
+ pack_id: "neon_step_sequencer",
1792
+ pack_public_name: "Neon Step Sequencer Pack",
1793
+ evidence_role_pattern: "interaction_snapshots",
1794
+ purpose: "Run a bounded loop, use an explicit operator-approval surrogate, apply the supported claim candidate, and preserve a listening-review packet.",
1795
+ required_receipts: [
1796
+ "ratchet loop returns ok",
1797
+ "a supported claim candidate is selected",
1798
+ "approved candidate application receipt is captured",
1799
+ "compact human-review packet is captured",
1800
+ "ranking remains review-order only",
1801
+ "listening-review caveat remains explicit"
1802
+ ],
1803
+ does_not_prove: [
1804
+ "subjective mix quality",
1805
+ "that the approval surrogate is a real listener preference",
1806
+ "all possible mix edits"
1807
+ ]
1808
+ }
1809
+ };
1810
+
1627
1811
  // packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json
1628
1812
  var ratchet_loop_mix_level_search_default = {
1629
1813
  version: "riddle-proof.profile.v1",
@@ -2226,7 +2410,8 @@ var rawProfiles = {
2226
2410
  "neon-step-sequencer-mobile-trainer-layout": mobile_trainer_layout_default,
2227
2411
  "neon-step-sequencer-full-mix-health-matrix": full_mix_health_matrix_default,
2228
2412
  "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
2413
+ "neon-step-sequencer-ratchet-loop-mix-level-search": ratchet_loop_mix_level_search_default,
2414
+ "neon-step-sequencer-ratchet-loop-approved-candidate": ratchet_loop_approved_candidate_default
2230
2415
  };
2231
2416
  var sourcePathOverrides = Object.freeze({
2232
2417
  "neon-step-sequencer-fast-mix-health": "packs/neon-step-sequencer/profiles/fast-mix-health.json",
@@ -2236,7 +2421,8 @@ var sourcePathOverrides = Object.freeze({
2236
2421
  "neon-step-sequencer-mobile-trainer-layout": "packs/neon-step-sequencer/profiles/mobile-trainer-layout.json",
2237
2422
  "neon-step-sequencer-full-mix-health-matrix": "packs/neon-step-sequencer/profiles/full-mix-health-matrix.json",
2238
2423
  "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"
2424
+ "neon-step-sequencer-ratchet-loop-mix-level-search": "packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json",
2425
+ "neon-step-sequencer-ratchet-loop-approved-candidate": "packs/neon-step-sequencer/profiles/ratchet-loop-approved-candidate.json"
2240
2426
  });
2241
2427
  var RIDDLE_PROOF_PACK_PROFILES = Object.freeze(
2242
2428
  Object.fromEntries(
@@ -2320,8 +2506,11 @@ function instantiateRiddleProofProfile(profileName, options = {}) {
2320
2506
  export {
2321
2507
  RIDDLE_PROOF_PACK_MANIFEST,
2322
2508
  RIDDLE_PROOF_PACK_PROFILES,
2509
+ createDurableCandidatePatchPlan,
2510
+ createDurableCandidatePatchPlanArtifacts,
2323
2511
  createHumanReviewPacketArtifacts,
2324
2512
  findHumanReviewPacket,
2513
+ formatDurableCandidatePatchPlanMarkdown,
2325
2514
  formatHumanReviewPacketMarkdown,
2326
2515
  getPackEnabledRiddleProofPackProfiles,
2327
2516
  getRiddleProofPackProfile,
@@ -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.7",
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 @@
28
28
  "README.md"
29
29
  ],
30
30
  "bin": {
31
+ "riddle-proof-durable-candidate-plan": "./bin/riddle-proof-durable-candidate-plan",
31
32
  "riddle-proof-review-packet": "./bin/riddle-proof-review-packet"
32
33
  },
33
34
  "sideEffects": false,
@@ -43,7 +44,7 @@
43
44
  "typescript": "^5.4.5"
44
45
  },
45
46
  "scripts": {
46
- "build": "tsup src/index.ts src/reviewPacketCli.ts --format cjs,esm --dts --out-dir dist --clean",
47
+ "build": "tsup src/index.ts src/reviewPacketCli.ts src/durableCandidatePlanCli.ts --format cjs,esm --dts --out-dir dist --clean",
47
48
  "clean": "rm -rf dist",
48
49
  "lint": "echo 'lint: (not configured)'",
49
50
  "test": "npm run build && node test.js"
@@ -10,6 +10,18 @@ The audio ratchet is:
10
10
  6. Rerun with a sharper claim.
11
11
  7. Extract reusable pack guidance.
12
12
 
13
+ For creative edits, add an explicit handoff gate before any durable source/config change:
14
+
15
+ 1. Generate bounded candidates.
16
+ 2. Keep ranking as review order only.
17
+ 3. Emit a human-review packet.
18
+ 4. Apply a candidate only when approval is explicit.
19
+ 5. Generate a durable candidate patch plan from the applied packet.
20
+ 6. Make the scoped source/config edit.
21
+ 7. Rerun a `current_target` proof that verifies the app sees the durable state.
22
+
23
+ This proves the change claim and the durable application path. It still does not prove subjective mix quality.
24
+
13
25
  ## Smallest layer order
14
26
 
15
27
  Prefer changes in this order:
@@ -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,10 @@ 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
+
41
+ The durable patch handoff is a separate step after the approved-candidate proof. A follow-on agent can validate the applied `humanReviewPacket`, generate a scoped durable candidate plan, edit the app/config source, and then run a final `current_target` proof. That handoff proves the approved candidate became visible durable state in the running app. It still does not prove the mix is aesthetically better.
42
+
38
43
  ## Example evidence
39
44
 
40
45
  The `examples/` directory contains local Playwright proof results captured against LilArcade Neon Step Sequencer on May 24, 2026:
@@ -45,6 +50,8 @@ The `examples/` directory contains local Playwright proof results captured again
45
50
  - `run-004-ratchet-loop-mix-level-search`: passing `interaction_snapshots` proof where a bounded loop tested six mix-level change-claim candidates, found a supported `chord -0.10` candidate, recorded receipt-level verdicts, and restored app state without keeping the edit.
46
51
  - `run-005-explore-songs-and-mixes-final`: passing `current_target` exploration sweep across four songs and eight song/part entries, with `8` passing entries, `0` prioritized findings, and no clipping after the local app-contract and mix-headroom ratchet.
47
52
  - `run-006-ratchet-loop-human-review-packet`: passing `interaction_snapshots` proof where the same bounded loop returned a compact `humanReviewPacket` with the recommended `chord -0.10` candidate, objective guardrails, `review_order_only` ranking, state restoration, and explicit listening caveats.
53
+ - `run-007-approved-candidate-applied`: passing `interaction_snapshots` proof where an explicit `mixing_canon_surrogate` approval mode applied the supported `chord -0.10` candidate for listening review and recorded `approvedCandidateApplied`.
54
+ - `run-008-durable-mix-patch-handoff`: passing durable handoff example where the applied packet became a scoped source/config plan for `chord: 0.28`, followed by a `current_target` proof showing the running app saw the durable level without clipping or low-level windows.
48
55
 
49
56
  ## Naming note
50
57
 
@@ -123,6 +123,28 @@ 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
+
137
+ ### Run 008 closed the durable source handoff
138
+
139
+ - run: `run-008-durable-mix-patch-handoff`
140
+ - claim: an applied human-review packet can become a scoped source/config patch only after durable-readiness validation, and the running app should then prove it sees that durable state.
141
+ - observed evidence: durable plan status was `ready_for_durable_patch`; source file was `src/Games/songs/neon-approved-mix-overrides.json`; target was `Monkberry Moon Delight (Tab)` with mix profile `monkberry-moon-delight-eq-lane-mix-v7`; durable mixer level was `chord: 0.28`; final current-target proof passed with contract chord level `0.28`, peak `0.8303`, RMS `0.1234`, clipping `false`, low-level window `false`, and `6` active instruments.
142
+ - classification: none; passing durable handoff plus `current_target` proof with subjective listening caveat.
143
+ - smallest layer changed: reusable pack helper/CLI, app source override, and proof-pack example docs.
144
+ - change made: added a durable candidate plan helper that refuses transient/unapproved packets, committed a scoped Neon override in the app, and captured final proof that the running app saw the durable level.
145
+ - rerun: passed on May 24, 2026 with local Playwright and deployed in LilArcade PR #490.
146
+ - next sharper question: can this durable handoff become the default follow-on step for proof-backed creative edits across more strategies than `mix-level-search`?
147
+
126
148
  ### Local runner shutdown needs a small ergonomics follow-up
127
149
 
128
150
  - run: `run-002-mix-change`, `run-003-full-matrix`, `run-004-ratchet-loop-mix-level-search`
@@ -36,7 +36,9 @@ 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.
40
+ - Run 008: the applied packet became a durable candidate patch plan for `chord: 0.28`, the app stored it as a scoped source override, and a final `current_target` proof verified the running app saw the durable level without clipping or low-level windows.
39
41
 
40
42
  ## Honest boundary
41
43
 
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.
44
+ 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. Run 008 proves durable application and current-target visibility, not listener preference. The ratchet loop is a generic proof-loop shape; `mix-level-search` is only the first Neon strategy plugged into it.
@@ -337,6 +337,118 @@ 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
+
395
+ ## Run 008 - Durable mix patch handoff
396
+
397
+ Claim:
398
+
399
+ An explicitly applied human-review packet can become a scoped durable source/config patch, and a final current-target proof can verify the running app sees that durable state without claiming subjective mix quality.
400
+
401
+ Profile:
402
+
403
+ `profiles/fast-mix-health.json`
404
+
405
+ Evidence to capture:
406
+
407
+ - applied human-review packet
408
+ - durable candidate patch plan
409
+ - source/config target
410
+ - current app contract mixer state
411
+ - offline mix-health metrics
412
+ - listening-review caveat
413
+
414
+ Possible outcomes:
415
+
416
+ - `ready_for_durable_patch`: the packet is applied, approved, non-transient, ranked for review only, and still preserves the listening-review caveat.
417
+ - `not_ready_for_durable_patch`: the packet is still transient, lacks approval metadata, has a disallowed action, lacks required target scope, or dropped the proof/taste boundary.
418
+ - `current_target_passed`: the durable source edit is visible to the running app and current audio guardrails pass.
419
+ - `product_regression`: the durable edit is not reflected in app state or the current target clips / falls below level guardrails.
420
+
421
+ Observed status:
422
+
423
+ Passed on May 24, 2026 with `local-playwright`.
424
+
425
+ Observed evidence:
426
+
427
+ - durable plan status `ready_for_durable_patch`
428
+ - source file `src/Games/songs/neon-approved-mix-overrides.json`
429
+ - target `Monkberry Moon Delight (Tab)`
430
+ - mix profile `monkberry-moon-delight-eq-lane-mix-v7`
431
+ - durable mixer level `chord: 0.28`
432
+ - current-target profile status `passed`
433
+ - contract chord level `0.28`
434
+ - peak `0.8303`
435
+ - RMS `0.1234`
436
+ - clipping `false`
437
+ - low-level window `false`
438
+ - active instruments `6`
439
+
440
+ Failure classification:
441
+
442
+ None. This was a passing durable handoff plus `current_target` proof. It proves scoped durable application and browser-visible state, not listener preference.
443
+
444
+ Smallest layer changed:
445
+
446
+ Reusable proof-pack helper/CLI, app source override, and proof-pack example docs. Riddle Proof core did not need a change.
447
+
448
+ Next sharper question:
449
+
450
+ Can this durable handoff become the default follow-on step after approved packets for more creative strategies than `mix-level-search`?
451
+
340
452
  ## Project note
341
453
 
342
454
  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, 007, and 008 also include standalone handoff artifacts generated from proof output.
6
6
 
7
7
  ## Runs
8
8
 
@@ -14,6 +14,8 @@ 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. |
18
+ | `run-008-durable-mix-patch-handoff` | `current_target` | passed | An applied packet becomes a durable candidate patch plan for `chord: 0.28`, then a current-target proof verifies the running app sees that durable level without clipping. |
17
19
 
18
20
  ## What these examples do not prove
19
21
 
@@ -24,3 +26,5 @@ The raw `profile-result.json` files are real runner outputs. They intentionally
24
26
  - 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
27
  - 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
28
  - 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.
29
+ - 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.
30
+ - The durable handoff run does not prove the mix is better. It proves the approved candidate was eligible for scoped source/config application and that the app saw the durable result afterward.
@@ -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
 
@@ -0,0 +1,32 @@
1
+ {
2
+ "version": "riddle-proof-local-runner-manifest.v1",
3
+ "runner": "local-playwright",
4
+ "profile_name": "lilarcade-neon-ratchet-loop-approved-candidate",
5
+ "captured_at": "2026-05-24T13:41:23.987Z",
6
+ "artifacts": [
7
+ {
8
+ "name": "proof.json",
9
+ "path": "proof.json",
10
+ "kind": "text",
11
+ "bytes": 506212
12
+ },
13
+ {
14
+ "name": "console.json",
15
+ "path": "console.json",
16
+ "kind": "text",
17
+ "bytes": 38
18
+ },
19
+ {
20
+ "name": "dom-summary.json",
21
+ "path": "dom-summary.json",
22
+ "kind": "text",
23
+ "bytes": 815
24
+ },
25
+ {
26
+ "name": "profile-result.json",
27
+ "path": "profile-result.json",
28
+ "kind": "text",
29
+ "bytes": 506212
30
+ }
31
+ ]
32
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "events": [],
3
+ "fatal_count": 0
4
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "expected_viewport_count": 1,
3
+ "viewport_count": 1,
4
+ "partial": false,
5
+ "routes": [
6
+ {
7
+ "requested": "http://127.0.0.1:5177/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
8
+ "observed": "/games/drum-sequencer",
9
+ "expected_path": "/games/drum-sequencer",
10
+ "matched": true,
11
+ "http_status": 200
12
+ }
13
+ ],
14
+ "titles": [
15
+ "LilArcade"
16
+ ],
17
+ "overflow_px": [
18
+ 0
19
+ ],
20
+ "bounds_overflow_px": [
21
+ 0
22
+ ],
23
+ "overflow_offender_counts": [
24
+ 0
25
+ ],
26
+ "frames": [
27
+ {
28
+ "viewport": "desktop",
29
+ "selectors": []
30
+ }
31
+ ],
32
+ "http_status": [],
33
+ "link_status": [],
34
+ "route_inventory": [],
35
+ "network_mock_count": 0,
36
+ "network_mock_hit_count": 0,
37
+ "dialog_count": 0,
38
+ "dialog_accept_count": 0,
39
+ "dialog_dismiss_count": 0
40
+ }