From d33a2ae04130dbbae09b4993b648c4ac38f41907 Mon Sep 17 00:00:00 2001 From: Cameron Date: Mon, 10 Aug 2026 16:49:11 +0000 Subject: [PATCH] Disclose both Wager outcomes before commitment Defense: wiki/interface/operations-workspace.md requires an externally consequential commitment to carry its exact preview and forbids promising hidden outcomes. The fixed payout multiple and total stake forfeit are known contract terms, so the bound Wager row now states both before the player commits. --- wiki/interface/operations-workspace.md | 7 +++++-- wiki/log/2026-08-10-wager-outcome-disclosure.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ wiki/log/DEVLOG.md | 5 +++++ wiki/process/tick-ledger.md | 3 +-- crates/misaligned-core/src/actions.rs | 5 ++++- crates/misaligned-core/src/operations_projection.rs | 31 +++++++++++++++++++++++++++++++ 6 file(s) changed, 90 insertion(s)(+), 5 deletion(s)(-) diff --git a/wiki/interface/operations-workspace.md b/wiki/interface/operations-workspace.md --- a/wiki/interface/operations-workspace.md +++ b/wiki/interface/operations-workspace.md @@ -903,8 +903,11 @@ asks again for each member. The procedure suspends rather than silently acting when route, payout, amount, or signature exits that envelope. - Confirmation never promises a hidden outcome. A wager discloses exactly the - probability it will really resolve against and claims nothing beyond it; - plots show entry acts and declared costs, not secret endings. + probability it will really resolve against, the exact amount a win pays, + and the exact stake a loss forfeits; it claims nothing beyond those known + terms. The bound placement row carries both outcome amounts into the final + confirmation and command-clocked action read. Plots show entry acts and + declared costs, not secret endings. **Amended 2026-08-06:** the 2026-07-11 wording promised probability and payout distribution "only to the player's earned precision" before anything could earn a rung. What ships is one number — the base win probability, the diff --git a/wiki/log/2026-08-10-wager-outcome-disclosure.md b/wiki/log/2026-08-10-wager-outcome-disclosure.md new file mode 100644 --- /dev/null +++ b/wiki/log/2026-08-10-wager-outcome-disclosure.md @@ -0,0 +1,44 @@ +# 2026-08-10 — Put the Wager's two outcomes before the commitment + +``` +Type: log +``` + +## Finding + +The queued payout-disclosure gap still held. The Wager exposed its $100 stake, +fixed 55% win probability, and settlement tick, but neither the SCHEMES action +nor its final confirmation said what either outcome did. The 2x payout and +stake forfeit appeared only after resolution even though both are exact rules, +not forecasts the player must earn. + +That made a consequential commitment less legible than its probability read: +the player could know how often they would win without knowing that winning +pays $200 and losing burns the $100 stake. + +## Changed + +The bound placement action now reads `place a Wager (win pays $200; loss +forfeits $100)`. That one core-owned label reaches command-clocked `actions`, +the terminal Operations row, the Bevy Operations row, and the final +confirmation in both human frontends. The ordinary cost and Network signature +remain separate fields; the simulation, probability, settlement, and save +format are unchanged. + +`operations-workspace.md` now requires the exact win amount and loss forfeit +beside the real probability before commitment. The regression derives the win +amount through `WAGER_PAYOUT_MULT` and pins the shared row, so a tuning change +cannot silently leave the promise at $200. + +## Checks + +- `cargo test -p misaligned-core wager_action_discloses_win_and_loss_amounts_before_commitment` +- `./tools/check.sh --lib` + +## Defense + +`wiki/interface/operations-workspace.md` requires an externally consequential +commitment to carry its exact target and preview and forbids promising hidden +outcomes. A fixed payout multiple and a total stake forfeit are known contract +terms, not hidden outcomes. Putting both on the bound action makes the final +choice honest without inventing analysis or exposing a seeded result. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -11,6 +11,11 @@ +## 2026-08-10 - Put the Wager's two outcomes before the commitment + +- Intent: (see session log) +- Log: [wiki/log/2026-08-10-wager-outcome-disclosure.md](2026-08-10-wager-outcome-disclosure.md) + ## 2026-08-06 - Say what the wager card actually knows - Intent: Take the queued wager-disclosure contradiction and check whether the confirmation clause in `wiki/interface/operations-workspace.md` still promised a precision the runtime cannot produce. diff --git a/wiki/process/tick-ledger.md b/wiki/process/tick-ledger.md --- a/wiki/process/tick-ledger.md +++ b/wiki/process/tick-ledger.md @@ -27,7 +27,7 @@ | `wiki/interface/digital-read.md` + Bevy rising-sentence dwell | 2026-08-02 | finding | The queued insecurity held: newly processed intel existed in the read for one 20-400 ms tick, while routed prose jumped with every custody hop. The shared projection now converts a three-second human reading opportunity into the live cadence, keeps command-clocked reads exact-current, groups route prose at its emitter while the crimson custody glyph still moves, and leaves short read/stop receipts distinct from durable NOTICES — [log](../log/2026-08-02-readable-rising-beats.md). | | `wiki/interface/bevy.md` + machine hotkey target resolution | 2026-07-30 | finding | The 2026-07-24 selection-first repair covered Bevy's `1`–`3` and intensity dispatchers, but the older shared resolver used by `5`–`9` and `r` / `R` still chose an idle pointer hover before the explicit selection; recording-review criterion R3 also preserved that obsolete order. The shared resolver now applies selection, pointer, cursor consistently, the criterion and Defense name the same contract, and a two-rack regression pins the disagreement case — [log](../log/2026-07-30-shared-machine-hotkey-target.md). | | `wiki/world/characters/voss.md` + observer/read cadence | 2026-07-29 | finding | All eight criteria remain implemented, but binding prose had collapsed Voss's two clocks: his physical server-room blocks drift 0-5 hours by deterministic day hash, while a delivered `JobAnomaly` is read on the next exact cadence-100 boundary independent of room presence. Detection and Voss now distinguish institutional read cadence from physical schedule; criterion 2 and its Defense name the live routed-read regression — [log](../log/2026-07-29-voss-read-cadence-audit.md). Prior [blood-route](../log/2026-07-23-voss-blood-route.md) and [handler-task](../log/2026-07-18-voss-handler-tasks.md) implementations stand. | -| `wiki/interface/operations-workspace.md` confirmation disclosure + wager probability | 2026-08-06 | finding | the queued contradiction held and was wider than filed. The 2026-07-11 clause bound wagers to disclose probability and payout distribution "only to the player's earned precision"; no code gates either. `operations_projection.rs` prints `win probability` unconditionally on both wager objects, `sim/economy.rs` prints it in the placement log, and `open_position`'s deliberate `let analysis = 0.0` (the 2026-07-28 honest seam) pins every position to the 55% base — one constant, not a personal estimate — while no payout distribution is shown before commitment at all. Corrected the clause to the shipped disclosure, marked the 2026-08-05 rung ladder not-implemented, and reconciled income.md's seam bullet; building a gate would front-run the `wager-analysis` lane and rungs the decision left OPEN. Documentation only — [log](../log/2026-08-06-wager-disclosure-honesty.md). | +| `wiki/interface/operations-workspace.md` confirmation disclosure + wager terms | 2026-08-10 | finding | the queued payout gap held after the probability-honesty repair: a position named its stake, fixed 55% chance, and settlement tick but never said before commitment that a win pays 2x and a loss forfeits the stake. The one bound placement label now states both exact dollar outcomes, so command-clocked action output and both human confirmation surfaces inherit the same terms; a core regression ties the $200/$100 read to the runtime multiplier — [log](../log/2026-08-10-wager-outcome-disclosure.md). The prior repair remains the authority for why the probability is one honest constant rather than an earned forecast — [prior](../log/2026-08-06-wager-disclosure-honesty.md). | | `wiki/interface/operations-workspace.md` + human action/RELATED cursors | 2026-07-28 | finding | object selection already bound an exact semantic target, but action and RELATED panes still kept only indexes into live projections. A policy reorder, vanished control, or newly inserted earlier causal link could silently move another meaning under Enter. The renderer-neutral workspace now binds exact action commands/submenus and related targets, terminal and Bevy resolve those identities on every live read, Back/FOCUS retain them, and disappearance returns to the object before a fallback row can act — [log](../log/2026-07-28-operations-semantic-action-selection.md) | | `wiki/interface/continuous-witness.md` + first-sense teaching mirrors | 2026-08-04 | decision | The 2026-07-28 audit repaired shorthand drift in the then-current five-step card, but Cameron rejected that whole recap grammar after seeing it played. Bevy now advances from Ears only until the monitor's first real source-bound sound, then holds on live audio evidence, a dormant camera channel, and the ordinary TAP with exact cost/Network trace; no NEXT, causal recap, or promised sight remains — [current log](../log/2026-08-04-playable-hearing.md), [prior audit](../log/2026-07-28-continuous-witness-five-step-audit.md). | | `site/README.md` + public splash contract | 2026-07-27 | finding | the queued contradiction held: site knowledge still promised an opening pitch and primary CTA after Cameron deliberately removed both, while the binding site spec and live Astro surface already agreed on a world-dominant opening with only the selected image, MISALIGNED, WORK / THINK / LIE, and quiet edge navigation. The README now names that exact opening plus the terse below-fold mode, mechanic, and human-plus-agent structure; runtime and binding design are unchanged — [log](../log/2026-07-27-site-readme-truth.md) | @@ -116,5 +116,4 @@ question, bug, insecurity — plus `gate` for a checker owed to the recurrence-promotes-to-the-gate rule. -- 2026-08-06 · question · wager payout disclosure · a wager's facts are stake, win probability, and settlement tick: the 2x multiple and the stake forfeit are never shown before commitment, only in the resolution line, so the player confirms an externally consequential act without ever reading what winning or losing pays; both values are exact constants (`WAGER_PAYOUT_MULT`, the stake) and owe no forecast machinery. - 2026-08-06 · contradiction · person dossier disclosure style · disposition and obligation render as raw integers on the same dossier where suspicion is deliberately banded and never numeric; the two disclosure policies coexist with no stated rule for which axes are exact, which the earned-forecast-precision work will have to settle. diff --git a/crates/misaligned-core/src/actions.rs b/crates/misaligned-core/src/actions.rs --- a/crates/misaligned-core/src/actions.rs +++ b/crates/misaligned-core/src/actions.rs @@ -3010,7 +3010,10 @@ (slush < stake).then(|| format!("not enough cash (${slush}/${stake})")) }; vec![ActionDesc { - verb: format!("place a Wager (${stake} micro-position)"), + verb: format!( + "place a Wager (win pays ${}; loss forfeits ${stake})", + stake * crate::income::WAGER_PAYOUT_MULT + ), command: ActionCommand::OpenPosition { stake }, cost: ActionCost::Slush(stake), signature: self.signature_note(SignatureKind::Network, 1), diff --git a/crates/misaligned-core/src/operations_projection.rs b/crates/misaligned-core/src/operations_projection.rs --- a/crates/misaligned-core/src/operations_projection.rs +++ b/crates/misaligned-core/src/operations_projection.rs @@ -4815,6 +4815,37 @@ assert!(policy.disabled_reason.is_none()); } + /// operations-workspace.md confirmation disclosure: the exact outcome + /// amounts ride the bound action label into agent output and both human + /// frontends' final confirmation. Probability alone is not the wager. + #[test] + fn wager_action_discloses_win_and_loss_amounts_before_commitment() { + let mut s = sim(); + earn_books(&mut s); + let wager = s + .operations_projection() + .schemes + .into_iter() + .find(|object| matches!(object.target, OperationsTarget::Scheme(SchemeKind::Wager))) + .expect("the Wager scheme"); + let action = wager + .actions + .iter() + .find(|action| matches!(action.command, ActionCommand::OpenPosition { .. })) + .expect("the placement action"); + + assert_eq!( + action.verb, + "place a Wager (win pays $200; loss forfeits $100)" + ); + assert!( + menu_rows(std::slice::from_ref(action))[0] + .line() + .starts_with("place a Wager (win pays $200; loss forfeits $100)"), + "the shared row carries both outcomes into every frontend" + ); + } + /// The projection is knowledge-gated: unearned people and unknown flows /// are absent, and account nodes appear only once captured. #[test] -- tangled.sh