@riddledc/riddle-proof-packs 0.4.6 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/bin/riddle-proof-durable-candidate-plan +4 -0
- package/dist/chunk-VFPSPQD7.js +219 -0
- package/dist/durableCandidatePlan-Dv2P33Wg.d.cts +77 -0
- package/dist/durableCandidatePlan-Dv2P33Wg.d.ts +77 -0
- package/dist/durableCandidatePlanCli.cjs +445 -0
- package/dist/durableCandidatePlanCli.d.cts +32 -0
- package/dist/durableCandidatePlanCli.d.ts +32 -0
- package/dist/durableCandidatePlanCli.js +177 -0
- package/dist/index.cjs +246 -7
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +38 -7
- package/package.json +3 -2
- package/packs/audio-mix/ratchet-method.md +12 -0
- package/packs/neon-step-sequencer/README.md +4 -0
- package/packs/neon-step-sequencer/case-study/findings.md +11 -0
- package/packs/neon-step-sequencer/case-study/ratchet-card.md +2 -1
- package/packs/neon-step-sequencer/case-study/ratchet-log.md +57 -0
- package/packs/neon-step-sequencer/examples/README.md +3 -1
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/artifact-manifest.json +32 -0
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/console.json +4 -0
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/dom-summary.json +40 -0
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/durable-candidate-patch-plan.json +69 -0
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/durable-candidate-patch-plan.md +29 -0
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/human-review-packet.json +801 -0
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/human-review-packet.md +52 -0
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/profile-result.json +5078 -0
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/proof.json +5078 -0
- 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
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/screenshots/lilarcade-neon-fast-mix-health-desktop.png +0 -0
- package/packs/neon-step-sequencer/examples/run-008-durable-mix-patch-handoff/summary.md +39 -0
- package/packs/neon-step-sequencer/profiles/playback-sync.json +30 -7
package/dist/index.cjs
CHANGED
|
@@ -22,8 +22,11 @@ var index_exports = {};
|
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
RIDDLE_PROOF_PACK_MANIFEST: () => RIDDLE_PROOF_PACK_MANIFEST,
|
|
24
24
|
RIDDLE_PROOF_PACK_PROFILES: () => RIDDLE_PROOF_PACK_PROFILES,
|
|
25
|
+
createDurableCandidatePatchPlan: () => createDurableCandidatePatchPlan,
|
|
26
|
+
createDurableCandidatePatchPlanArtifacts: () => createDurableCandidatePatchPlanArtifacts,
|
|
25
27
|
createHumanReviewPacketArtifacts: () => createHumanReviewPacketArtifacts,
|
|
26
28
|
findHumanReviewPacket: () => findHumanReviewPacket,
|
|
29
|
+
formatDurableCandidatePatchPlanMarkdown: () => formatDurableCandidatePatchPlanMarkdown,
|
|
27
30
|
formatHumanReviewPacketMarkdown: () => formatHumanReviewPacketMarkdown,
|
|
28
31
|
getPackEnabledRiddleProofPackProfiles: () => getPackEnabledRiddleProofPackProfiles,
|
|
29
32
|
getRiddleProofPackProfile: () => getRiddleProofPackProfile,
|
|
@@ -1549,16 +1552,16 @@ var playback_sync_default = {
|
|
|
1549
1552
|
label: "capture-pre-playback-state",
|
|
1550
1553
|
timeout_ms: 1e4,
|
|
1551
1554
|
store_return_to: "__neonProof.prePlayback",
|
|
1552
|
-
script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const
|
|
1555
|
+
script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const raw=api?.getPlaybackState?.()||api?.getSummary?.()||null; const trainer=raw?.trainer||raw||{}; const out={available:Boolean(api),isPlaying:Boolean(raw?.isPlaying),currentStep:Number(trainer.currentStep??-1),selectedInstrument:trainer.selectedInstrument||null,state:raw}; window.__neonProof={...(window.__neonProof||{}),prePlayback:out}; return out;",
|
|
1553
1556
|
return_summary_fields: [
|
|
1554
1557
|
{
|
|
1555
1558
|
path: "available"
|
|
1556
1559
|
},
|
|
1557
1560
|
{
|
|
1558
|
-
path: "
|
|
1561
|
+
path: "selectedInstrument"
|
|
1559
1562
|
},
|
|
1560
1563
|
{
|
|
1561
|
-
path: "
|
|
1564
|
+
path: "currentStep"
|
|
1562
1565
|
}
|
|
1563
1566
|
]
|
|
1564
1567
|
},
|
|
@@ -1573,6 +1576,12 @@ var playback_sync_default = {
|
|
|
1573
1576
|
selector: "button.drum-play",
|
|
1574
1577
|
timeout_ms: 1e4
|
|
1575
1578
|
},
|
|
1579
|
+
{
|
|
1580
|
+
type: "wait_for_text",
|
|
1581
|
+
selector: "button.drum-play",
|
|
1582
|
+
text: "Stop",
|
|
1583
|
+
timeout_ms: 3e4
|
|
1584
|
+
},
|
|
1576
1585
|
{
|
|
1577
1586
|
type: "wait",
|
|
1578
1587
|
ms: 900
|
|
@@ -1582,16 +1591,19 @@ var playback_sync_default = {
|
|
|
1582
1591
|
label: "capture-post-playback-state",
|
|
1583
1592
|
timeout_ms: 1e4,
|
|
1584
1593
|
store_return_to: "__neonProof.postPlayback",
|
|
1585
|
-
script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const
|
|
1594
|
+
script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const raw=api?.getPlaybackState?.()||api?.getSummary?.()||null; const trainer=raw?.trainer||raw||{}; const pre=window.__neonProof?.prePlayback||{}; const currentStep=Number(trainer.currentStep??-1); const preStep=Number(pre.currentStep??-1); const out={available:Boolean(api),isPlaying:Boolean(raw?.isPlaying),currentStep,preStep,selectedInstrument:trainer.selectedInstrument||null,movedForward:currentStep>preStep,state:raw}; window.__neonProof={...(window.__neonProof||{}),postPlayback:out}; return out;",
|
|
1586
1595
|
return_summary_fields: [
|
|
1587
1596
|
{
|
|
1588
1597
|
path: "isPlaying"
|
|
1589
1598
|
},
|
|
1590
1599
|
{
|
|
1591
|
-
path: "
|
|
1600
|
+
path: "currentStep"
|
|
1601
|
+
},
|
|
1602
|
+
{
|
|
1603
|
+
path: "selectedInstrument"
|
|
1592
1604
|
},
|
|
1593
1605
|
{
|
|
1594
|
-
path: "
|
|
1606
|
+
path: "movedForward"
|
|
1595
1607
|
}
|
|
1596
1608
|
]
|
|
1597
1609
|
},
|
|
@@ -1601,6 +1613,18 @@ var playback_sync_default = {
|
|
|
1601
1613
|
expected_value: true,
|
|
1602
1614
|
timeout_ms: 1e4
|
|
1603
1615
|
},
|
|
1616
|
+
{
|
|
1617
|
+
type: "assert_window_value",
|
|
1618
|
+
path: "__neonProof.postPlayback.isPlaying",
|
|
1619
|
+
expected_value: true,
|
|
1620
|
+
timeout_ms: 1e4
|
|
1621
|
+
},
|
|
1622
|
+
{
|
|
1623
|
+
type: "assert_window_value",
|
|
1624
|
+
path: "__neonProof.postPlayback.movedForward",
|
|
1625
|
+
expected_value: true,
|
|
1626
|
+
timeout_ms: 1e4
|
|
1627
|
+
},
|
|
1604
1628
|
{
|
|
1605
1629
|
type: "screenshot",
|
|
1606
1630
|
label: "neon-playback-sync",
|
|
@@ -1645,7 +1669,9 @@ var playback_sync_default = {
|
|
|
1645
1669
|
required_receipts: [
|
|
1646
1670
|
"pre-action playback state",
|
|
1647
1671
|
"play button interaction",
|
|
1648
|
-
"
|
|
1672
|
+
"visible Stop state after interaction",
|
|
1673
|
+
"post-action playback state is playing",
|
|
1674
|
+
"post-action trainer step moved forward",
|
|
1649
1675
|
"screenshot after interaction"
|
|
1650
1676
|
],
|
|
1651
1677
|
does_not_prove: [
|
|
@@ -2663,12 +2689,225 @@ function createHumanReviewPacketArtifacts(proofOrPacket, options = {}) {
|
|
|
2663
2689
|
markdown
|
|
2664
2690
|
};
|
|
2665
2691
|
}
|
|
2692
|
+
|
|
2693
|
+
// src/durableCandidatePlan.ts
|
|
2694
|
+
var DEFAULT_APPROVAL_MODES = ["operator_approved", "mixing_canon_surrogate"];
|
|
2695
|
+
var DEFAULT_ACTION_TYPES = ["set_mixer_level"];
|
|
2696
|
+
var isRecord3 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
2697
|
+
var asRecord2 = (value) => isRecord3(value) ? value : {};
|
|
2698
|
+
var getPath2 = (value, path) => {
|
|
2699
|
+
let cursor = value;
|
|
2700
|
+
for (const part of path.split(".")) {
|
|
2701
|
+
if (!isRecord3(cursor)) return void 0;
|
|
2702
|
+
cursor = cursor[part];
|
|
2703
|
+
}
|
|
2704
|
+
return cursor;
|
|
2705
|
+
};
|
|
2706
|
+
var asFiniteNumber = (value) => {
|
|
2707
|
+
if (value === null || value === void 0 || value === "") return null;
|
|
2708
|
+
if (typeof value !== "number" && typeof value !== "string") return null;
|
|
2709
|
+
const numeric = Number(value);
|
|
2710
|
+
return Number.isFinite(numeric) ? Number(numeric.toFixed(4)) : null;
|
|
2711
|
+
};
|
|
2712
|
+
var formatValue2 = (value) => {
|
|
2713
|
+
if (value === null || value === void 0 || value === "") return "not captured";
|
|
2714
|
+
if (typeof value === "number") return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(4)));
|
|
2715
|
+
if (typeof value === "boolean") return value ? "true" : "false";
|
|
2716
|
+
return String(value);
|
|
2717
|
+
};
|
|
2718
|
+
var formatCodeValue2 = (value) => `\`${formatValue2(value)}\``;
|
|
2719
|
+
var selectedTargetLabel = (packet) => {
|
|
2720
|
+
const value = getPath2(packet, "target.selectedSong.selectedSong") ?? getPath2(packet, "target.routeState.selectedSong") ?? getPath2(packet, "target.label");
|
|
2721
|
+
return typeof value === "string" && value.trim() ? value : null;
|
|
2722
|
+
};
|
|
2723
|
+
var selectedRoute = (packet) => {
|
|
2724
|
+
const value = getPath2(packet, "target.routeState.route") ?? getPath2(packet, "target.routeState.path") ?? getPath2(packet, "target.route");
|
|
2725
|
+
return typeof value === "string" && value.trim() ? value : null;
|
|
2726
|
+
};
|
|
2727
|
+
var selectedMixProfileId = (packet) => {
|
|
2728
|
+
const value = getPath2(packet, "recommendation.candidate.summary.mixProfile.id") ?? getPath2(packet, "baseline.mixProfile.id") ?? getPath2(packet, "target.mixProfile.id");
|
|
2729
|
+
return typeof value === "string" && value.trim() ? value : null;
|
|
2730
|
+
};
|
|
2731
|
+
function createDurableCandidatePatchPlan(proofOrPacket, options = {}) {
|
|
2732
|
+
const packet = requireHumanReviewPacket(proofOrPacket);
|
|
2733
|
+
const recommendation = asRecord2(packet.recommendation);
|
|
2734
|
+
const candidate = asRecord2(recommendation.candidate);
|
|
2735
|
+
const action = asRecord2(candidate.action);
|
|
2736
|
+
const guardrails = asRecord2(packet.guardrails);
|
|
2737
|
+
const request = asRecord2(packet.request);
|
|
2738
|
+
const approval = asRecord2(request.approval);
|
|
2739
|
+
const ranking = asRecord2(packet.ranking);
|
|
2740
|
+
const proofBoundary = packet.proofBoundary;
|
|
2741
|
+
const target = {
|
|
2742
|
+
label: selectedTargetLabel(packet),
|
|
2743
|
+
route: selectedRoute(packet),
|
|
2744
|
+
mixProfileId: selectedMixProfileId(packet)
|
|
2745
|
+
};
|
|
2746
|
+
const actionType = action.type;
|
|
2747
|
+
const actionTrack = action.track;
|
|
2748
|
+
const from = asFiniteNumber(action.from);
|
|
2749
|
+
const to = asFiniteNumber(action.to);
|
|
2750
|
+
const numericDelta = asFiniteNumber(action.delta);
|
|
2751
|
+
const delta = numericDelta ?? (from !== null && to !== null ? asFiniteNumber(to - from) : null);
|
|
2752
|
+
const allowedApprovalModes = new Set(options.allowedApprovalModes ?? DEFAULT_APPROVAL_MODES);
|
|
2753
|
+
const allowedActionTypes = new Set(options.allowedActionTypes ?? DEFAULT_ACTION_TYPES);
|
|
2754
|
+
const errors = [];
|
|
2755
|
+
if (packet.status !== "candidate_applied_for_listening_review") {
|
|
2756
|
+
errors.push("packet status must be candidate_applied_for_listening_review");
|
|
2757
|
+
}
|
|
2758
|
+
if (recommendation.action !== "listen_to_applied_candidate") {
|
|
2759
|
+
errors.push("recommendation action must be listen_to_applied_candidate");
|
|
2760
|
+
}
|
|
2761
|
+
if (guardrails.approvedCandidateApplied !== true) {
|
|
2762
|
+
errors.push("approvedCandidateApplied guardrail must be true");
|
|
2763
|
+
}
|
|
2764
|
+
if (request.candidateActionsAreTransient !== false) {
|
|
2765
|
+
errors.push("candidateActionsAreTransient must be false before a durable patch handoff");
|
|
2766
|
+
}
|
|
2767
|
+
if (!approval.mode) {
|
|
2768
|
+
errors.push("approval mode is required");
|
|
2769
|
+
} else if (!allowedApprovalModes.has(String(approval.mode))) {
|
|
2770
|
+
errors.push(`approval mode ${formatValue2(approval.mode)} is not allowed for durable patch handoff`);
|
|
2771
|
+
}
|
|
2772
|
+
if (ranking.role !== "review_order_only") {
|
|
2773
|
+
errors.push("ranking role must remain review_order_only");
|
|
2774
|
+
}
|
|
2775
|
+
if (!String(proofBoundary ?? "").includes("musical taste still requires listening review")) {
|
|
2776
|
+
errors.push("proof boundary must preserve the listening-review caveat");
|
|
2777
|
+
}
|
|
2778
|
+
if (!actionType || !allowedActionTypes.has(String(actionType))) {
|
|
2779
|
+
errors.push(`action type ${formatValue2(actionType)} is not allowed for durable patch handoff`);
|
|
2780
|
+
}
|
|
2781
|
+
if (typeof actionTrack !== "string" || !actionTrack.trim()) {
|
|
2782
|
+
errors.push("candidate action track is required");
|
|
2783
|
+
}
|
|
2784
|
+
if (to === null) {
|
|
2785
|
+
errors.push("candidate action target value is required");
|
|
2786
|
+
}
|
|
2787
|
+
if (String(actionType) === "set_mixer_level" && (to === null || to < 0 || to > 1.5)) {
|
|
2788
|
+
errors.push("set_mixer_level target must be between 0 and 1.5");
|
|
2789
|
+
}
|
|
2790
|
+
if (options.requireTargetLabel !== false && !target.label) {
|
|
2791
|
+
errors.push("target label is required for a scoped durable patch handoff");
|
|
2792
|
+
}
|
|
2793
|
+
if (options.requireMixProfileId === true && !target.mixProfileId) {
|
|
2794
|
+
errors.push("mixProfileId is required for this durable patch handoff");
|
|
2795
|
+
}
|
|
2796
|
+
const actionShape = {
|
|
2797
|
+
type: actionType ?? null,
|
|
2798
|
+
track: actionTrack ?? null,
|
|
2799
|
+
from,
|
|
2800
|
+
to,
|
|
2801
|
+
delta
|
|
2802
|
+
};
|
|
2803
|
+
const mixerLevels = !errors.length && String(actionType) === "set_mixer_level" && typeof actionTrack === "string" && to !== null ? { [actionTrack]: to } : null;
|
|
2804
|
+
return {
|
|
2805
|
+
version: "riddle-proof.durable-candidate-patch-plan.v1",
|
|
2806
|
+
kind: "durable_candidate_patch_plan",
|
|
2807
|
+
status: errors.length ? "not_ready_for_durable_patch" : "ready_for_durable_patch",
|
|
2808
|
+
ok: errors.length === 0,
|
|
2809
|
+
errors,
|
|
2810
|
+
source: {
|
|
2811
|
+
packetStatus: packet.status ?? null,
|
|
2812
|
+
recommendationAction: recommendation.action ?? null,
|
|
2813
|
+
rankingRole: ranking.role ?? null,
|
|
2814
|
+
proofBoundary: proofBoundary ?? null
|
|
2815
|
+
},
|
|
2816
|
+
target,
|
|
2817
|
+
candidate: {
|
|
2818
|
+
label: candidate.label ?? null,
|
|
2819
|
+
action: actionShape
|
|
2820
|
+
},
|
|
2821
|
+
approval: {
|
|
2822
|
+
mode: approval.mode ?? null,
|
|
2823
|
+
approvedBy: approval.approvedBy ?? null,
|
|
2824
|
+
basis: approval.basis ?? null
|
|
2825
|
+
},
|
|
2826
|
+
durableEdit: errors.length ? null : {
|
|
2827
|
+
sourceFile: options.sourceFile ?? null,
|
|
2828
|
+
target,
|
|
2829
|
+
action: actionShape,
|
|
2830
|
+
mixerLevels,
|
|
2831
|
+
provenance: {
|
|
2832
|
+
humanReviewPacketStatus: packet.status ?? null,
|
|
2833
|
+
recommendationLabel: candidate.label ?? null,
|
|
2834
|
+
approvalMode: approval.mode ?? null,
|
|
2835
|
+
approvedBy: approval.approvedBy ?? null,
|
|
2836
|
+
basis: approval.basis ?? null
|
|
2837
|
+
},
|
|
2838
|
+
doesNotProve: [
|
|
2839
|
+
"subjective mix quality",
|
|
2840
|
+
"that the approval surrogate is a real listener preference",
|
|
2841
|
+
"all possible candidate edits"
|
|
2842
|
+
]
|
|
2843
|
+
},
|
|
2844
|
+
boundary: "This is a durable patch handoff for an approved listening-review candidate. It does not prove subjective mix quality.",
|
|
2845
|
+
caveats: [
|
|
2846
|
+
"A durable patch plan is not a taste verdict.",
|
|
2847
|
+
"Ranking orders review only; it is not a universal mix-quality score.",
|
|
2848
|
+
"Run a final current-target proof after the durable edit lands."
|
|
2849
|
+
]
|
|
2850
|
+
};
|
|
2851
|
+
}
|
|
2852
|
+
function formatDurableCandidatePatchPlanMarkdown(plan, options = {}) {
|
|
2853
|
+
if (plan.kind !== "durable_candidate_patch_plan") {
|
|
2854
|
+
throw new Error("Expected a durable_candidate_patch_plan");
|
|
2855
|
+
}
|
|
2856
|
+
const lines = [
|
|
2857
|
+
`# ${options.title ?? "Durable Candidate Patch Plan"}`,
|
|
2858
|
+
"",
|
|
2859
|
+
`- status: ${formatCodeValue2(plan.status)}`,
|
|
2860
|
+
`- ok: ${formatCodeValue2(plan.ok)}`,
|
|
2861
|
+
`- target_label: ${formatValue2(plan.target.label)}`,
|
|
2862
|
+
`- mix_profile_id: ${formatCodeValue2(plan.target.mixProfileId)}`,
|
|
2863
|
+
`- source_file: ${formatCodeValue2(plan.durableEdit?.sourceFile)}`,
|
|
2864
|
+
"",
|
|
2865
|
+
"## Candidate",
|
|
2866
|
+
"",
|
|
2867
|
+
`- label: ${formatCodeValue2(plan.candidate.label)}`,
|
|
2868
|
+
`- action: ${formatCodeValue2(`${formatValue2(plan.candidate.action.type)} ${formatValue2(plan.candidate.action.track)}: ${formatValue2(plan.candidate.action.from)} -> ${formatValue2(plan.candidate.action.to)} (${formatValue2(plan.candidate.action.delta)})`)}`,
|
|
2869
|
+
"",
|
|
2870
|
+
"## Approval Boundary",
|
|
2871
|
+
"",
|
|
2872
|
+
`- approval_mode: ${formatCodeValue2(plan.approval.mode)}`,
|
|
2873
|
+
`- approved_by: ${formatCodeValue2(plan.approval.approvedBy)}`,
|
|
2874
|
+
`- basis: ${formatValue2(plan.approval.basis)}`,
|
|
2875
|
+
`- boundary: ${formatValue2(plan.boundary)}`,
|
|
2876
|
+
"",
|
|
2877
|
+
"## Durable Edit",
|
|
2878
|
+
"",
|
|
2879
|
+
`- mixer_levels: ${formatCodeValue2(JSON.stringify(plan.durableEdit?.mixerLevels ?? null))}`
|
|
2880
|
+
];
|
|
2881
|
+
if (plan.errors.length) {
|
|
2882
|
+
lines.push("", "## Errors", "");
|
|
2883
|
+
for (const error of plan.errors) lines.push(`- ${error}`);
|
|
2884
|
+
}
|
|
2885
|
+
lines.push("", "## Caveats", "");
|
|
2886
|
+
for (const caveat of plan.caveats) lines.push(`- ${caveat}`);
|
|
2887
|
+
return `${lines.join("\n")}
|
|
2888
|
+
`;
|
|
2889
|
+
}
|
|
2890
|
+
function createDurableCandidatePatchPlanArtifacts(proofOrPacket, options = {}) {
|
|
2891
|
+
const plan = createDurableCandidatePatchPlan(proofOrPacket, options);
|
|
2892
|
+
const markdown = formatDurableCandidatePatchPlanMarkdown(plan, {
|
|
2893
|
+
title: options.title
|
|
2894
|
+
});
|
|
2895
|
+
return {
|
|
2896
|
+
plan,
|
|
2897
|
+
json: `${JSON.stringify(plan, null, 2)}
|
|
2898
|
+
`,
|
|
2899
|
+
markdown
|
|
2900
|
+
};
|
|
2901
|
+
}
|
|
2666
2902
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2667
2903
|
0 && (module.exports = {
|
|
2668
2904
|
RIDDLE_PROOF_PACK_MANIFEST,
|
|
2669
2905
|
RIDDLE_PROOF_PACK_PROFILES,
|
|
2906
|
+
createDurableCandidatePatchPlan,
|
|
2907
|
+
createDurableCandidatePatchPlanArtifacts,
|
|
2670
2908
|
createHumanReviewPacketArtifacts,
|
|
2671
2909
|
findHumanReviewPacket,
|
|
2910
|
+
formatDurableCandidatePatchPlanMarkdown,
|
|
2672
2911
|
formatHumanReviewPacketMarkdown,
|
|
2673
2912
|
getPackEnabledRiddleProofPackProfiles,
|
|
2674
2913
|
getRiddleProofPackProfile,
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as _riddledc_riddle_proof from '@riddledc/riddle-proof';
|
|
2
2
|
import { RiddleProofProfile } from '@riddledc/riddle-proof';
|
|
3
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';
|
|
4
|
+
export { D as DurableCandidatePatchPlan, a as DurableCandidatePatchPlanArtifacts, b as DurableCandidatePatchPlanOptions, c as createDurableCandidatePatchPlan, d as createDurableCandidatePatchPlanArtifacts, f as formatDurableCandidatePatchPlanMarkdown } from './durableCandidatePlan-Dv2P33Wg.cjs';
|
|
4
5
|
|
|
5
6
|
interface RiddleProofPackProfileManifest {
|
|
6
7
|
/** Profile slug and canonical manifest key. */
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as _riddledc_riddle_proof from '@riddledc/riddle-proof';
|
|
2
2
|
import { RiddleProofProfile } from '@riddledc/riddle-proof';
|
|
3
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';
|
|
4
|
+
export { D as DurableCandidatePatchPlan, a as DurableCandidatePatchPlanArtifacts, b as DurableCandidatePatchPlanOptions, c as createDurableCandidatePatchPlan, d as createDurableCandidatePatchPlanArtifacts, f as formatDurableCandidatePatchPlanMarkdown } from './durableCandidatePlan-Dv2P33Wg.js';
|
|
4
5
|
|
|
5
6
|
interface RiddleProofPackProfileManifest {
|
|
6
7
|
/** Profile slug and canonical manifest key. */
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createDurableCandidatePatchPlan,
|
|
3
|
+
createDurableCandidatePatchPlanArtifacts,
|
|
4
|
+
formatDurableCandidatePatchPlanMarkdown
|
|
5
|
+
} from "./chunk-VFPSPQD7.js";
|
|
1
6
|
import {
|
|
2
7
|
createHumanReviewPacketArtifacts,
|
|
3
8
|
findHumanReviewPacket,
|
|
@@ -1517,16 +1522,16 @@ var playback_sync_default = {
|
|
|
1517
1522
|
label: "capture-pre-playback-state",
|
|
1518
1523
|
timeout_ms: 1e4,
|
|
1519
1524
|
store_return_to: "__neonProof.prePlayback",
|
|
1520
|
-
script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const
|
|
1525
|
+
script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const raw=api?.getPlaybackState?.()||api?.getSummary?.()||null; const trainer=raw?.trainer||raw||{}; const out={available:Boolean(api),isPlaying:Boolean(raw?.isPlaying),currentStep:Number(trainer.currentStep??-1),selectedInstrument:trainer.selectedInstrument||null,state:raw}; window.__neonProof={...(window.__neonProof||{}),prePlayback:out}; return out;",
|
|
1521
1526
|
return_summary_fields: [
|
|
1522
1527
|
{
|
|
1523
1528
|
path: "available"
|
|
1524
1529
|
},
|
|
1525
1530
|
{
|
|
1526
|
-
path: "
|
|
1531
|
+
path: "selectedInstrument"
|
|
1527
1532
|
},
|
|
1528
1533
|
{
|
|
1529
|
-
path: "
|
|
1534
|
+
path: "currentStep"
|
|
1530
1535
|
}
|
|
1531
1536
|
]
|
|
1532
1537
|
},
|
|
@@ -1541,6 +1546,12 @@ var playback_sync_default = {
|
|
|
1541
1546
|
selector: "button.drum-play",
|
|
1542
1547
|
timeout_ms: 1e4
|
|
1543
1548
|
},
|
|
1549
|
+
{
|
|
1550
|
+
type: "wait_for_text",
|
|
1551
|
+
selector: "button.drum-play",
|
|
1552
|
+
text: "Stop",
|
|
1553
|
+
timeout_ms: 3e4
|
|
1554
|
+
},
|
|
1544
1555
|
{
|
|
1545
1556
|
type: "wait",
|
|
1546
1557
|
ms: 900
|
|
@@ -1550,16 +1561,19 @@ var playback_sync_default = {
|
|
|
1550
1561
|
label: "capture-post-playback-state",
|
|
1551
1562
|
timeout_ms: 1e4,
|
|
1552
1563
|
store_return_to: "__neonProof.postPlayback",
|
|
1553
|
-
script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const
|
|
1564
|
+
script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const raw=api?.getPlaybackState?.()||api?.getSummary?.()||null; const trainer=raw?.trainer||raw||{}; const pre=window.__neonProof?.prePlayback||{}; const currentStep=Number(trainer.currentStep??-1); const preStep=Number(pre.currentStep??-1); const out={available:Boolean(api),isPlaying:Boolean(raw?.isPlaying),currentStep,preStep,selectedInstrument:trainer.selectedInstrument||null,movedForward:currentStep>preStep,state:raw}; window.__neonProof={...(window.__neonProof||{}),postPlayback:out}; return out;",
|
|
1554
1565
|
return_summary_fields: [
|
|
1555
1566
|
{
|
|
1556
1567
|
path: "isPlaying"
|
|
1557
1568
|
},
|
|
1558
1569
|
{
|
|
1559
|
-
path: "
|
|
1570
|
+
path: "currentStep"
|
|
1560
1571
|
},
|
|
1561
1572
|
{
|
|
1562
|
-
path: "
|
|
1573
|
+
path: "selectedInstrument"
|
|
1574
|
+
},
|
|
1575
|
+
{
|
|
1576
|
+
path: "movedForward"
|
|
1563
1577
|
}
|
|
1564
1578
|
]
|
|
1565
1579
|
},
|
|
@@ -1569,6 +1583,18 @@ var playback_sync_default = {
|
|
|
1569
1583
|
expected_value: true,
|
|
1570
1584
|
timeout_ms: 1e4
|
|
1571
1585
|
},
|
|
1586
|
+
{
|
|
1587
|
+
type: "assert_window_value",
|
|
1588
|
+
path: "__neonProof.postPlayback.isPlaying",
|
|
1589
|
+
expected_value: true,
|
|
1590
|
+
timeout_ms: 1e4
|
|
1591
|
+
},
|
|
1592
|
+
{
|
|
1593
|
+
type: "assert_window_value",
|
|
1594
|
+
path: "__neonProof.postPlayback.movedForward",
|
|
1595
|
+
expected_value: true,
|
|
1596
|
+
timeout_ms: 1e4
|
|
1597
|
+
},
|
|
1572
1598
|
{
|
|
1573
1599
|
type: "screenshot",
|
|
1574
1600
|
label: "neon-playback-sync",
|
|
@@ -1613,7 +1639,9 @@ var playback_sync_default = {
|
|
|
1613
1639
|
required_receipts: [
|
|
1614
1640
|
"pre-action playback state",
|
|
1615
1641
|
"play button interaction",
|
|
1616
|
-
"
|
|
1642
|
+
"visible Stop state after interaction",
|
|
1643
|
+
"post-action playback state is playing",
|
|
1644
|
+
"post-action trainer step moved forward",
|
|
1617
1645
|
"screenshot after interaction"
|
|
1618
1646
|
],
|
|
1619
1647
|
does_not_prove: [
|
|
@@ -2501,8 +2529,11 @@ function instantiateRiddleProofProfile(profileName, options = {}) {
|
|
|
2501
2529
|
export {
|
|
2502
2530
|
RIDDLE_PROOF_PACK_MANIFEST,
|
|
2503
2531
|
RIDDLE_PROOF_PACK_PROFILES,
|
|
2532
|
+
createDurableCandidatePatchPlan,
|
|
2533
|
+
createDurableCandidatePatchPlanArtifacts,
|
|
2504
2534
|
createHumanReviewPacketArtifacts,
|
|
2505
2535
|
findHumanReviewPacket,
|
|
2536
|
+
formatDurableCandidatePatchPlanMarkdown,
|
|
2506
2537
|
formatHumanReviewPacketMarkdown,
|
|
2507
2538
|
getPackEnabledRiddleProofPackProfiles,
|
|
2508
2539
|
getRiddleProofPackProfile,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@riddledc/riddle-proof-packs",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.8",
|
|
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:
|
|
@@ -38,6 +38,8 @@ This pack's first concrete strategy is `mix-level-search`, which turns small lev
|
|
|
38
38
|
|
|
39
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
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
|
+
|
|
41
43
|
## Example evidence
|
|
42
44
|
|
|
43
45
|
The `examples/` directory contains local Playwright proof results captured against LilArcade Neon Step Sequencer on May 24, 2026:
|
|
@@ -48,6 +50,8 @@ The `examples/` directory contains local Playwright proof results captured again
|
|
|
48
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.
|
|
49
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.
|
|
50
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.
|
|
51
55
|
|
|
52
56
|
## Naming note
|
|
53
57
|
|
|
@@ -134,6 +134,17 @@ Pack summary guidance first; Riddle Proof core only if a general display primiti
|
|
|
134
134
|
- rerun: passed on May 24, 2026 with local Playwright.
|
|
135
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
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
|
+
|
|
137
148
|
### Local runner shutdown needs a small ergonomics follow-up
|
|
138
149
|
|
|
139
150
|
- run: `run-002-mix-change`, `run-003-full-matrix`, `run-004-ratchet-loop-mix-level-search`
|
|
@@ -37,7 +37,8 @@ The project shows that a complex audio app can improve proof confidence mostly b
|
|
|
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
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.
|
|
40
41
|
|
|
41
42
|
## Honest boundary
|
|
42
43
|
|
|
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.
|
|
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.
|
|
@@ -392,6 +392,63 @@ Next sharper question:
|
|
|
392
392
|
|
|
393
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
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
|
+
|
|
395
452
|
## Project note
|
|
396
453
|
|
|
397
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. Runs 006 and
|
|
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
|
|
|
@@ -15,6 +15,7 @@ The raw `profile-result.json` files are real runner outputs. They intentionally
|
|
|
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
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. |
|
|
18
19
|
|
|
19
20
|
## What these examples do not prove
|
|
20
21
|
|
|
@@ -26,3 +27,4 @@ The raw `profile-result.json` files are real runner outputs. They intentionally
|
|
|
26
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.
|
|
27
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.
|
|
28
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.
|