From fae6e8676f1707d1d475244314b1afd48d9028cd Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 10 Jul 2026 21:49:28 -0700 Subject: [PATCH] Revert "Remove unapproved HAL playtest publication." This reverts commit 94fd0d0cc419d338805506ef3d4040d4a9e46683. --- wiki/SUMMARY.md | 1 + wiki/interface/agent-play.md | 4 +- wiki/log/2026-07-10-fantasy-anchor-capture.md | 7 +- wiki/log/2026-07-10-objective-inspect.md | 5 +- wiki/log/2026-07-10-playtest-hal-filed.md | 25 ++ wiki/log/DEVLOG.md | 5 + wiki/log/decisions/2026-07-10.md | 9 +- wiki/mechanics/detection.md | 4 +- wiki/mechanics/objective.md | 8 +- wiki/mechanics/plots.md | 14 +- wiki/playtests/2026-07-10-playtest-hal.md | 359 ++++++++++++++++++ wiki/playtests/README.md | 1 + 12 files changed, 417 insertions(+), 25 deletions(-) create mode 100644 wiki/log/2026-07-10-playtest-hal-filed.md create mode 100644 wiki/playtests/2026-07-10-playtest-hal.md diff --git a/wiki/SUMMARY.md b/wiki/SUMMARY.md index 3a009898..cd7013de 100644 --- a/wiki/SUMMARY.md +++ b/wiki/SUMMARY.md @@ -121,6 +121,7 @@ - [Evidence index](playtests/README.md) - [2026-07-08 playtest sweep](playtests/2026-07-08-playtest-sweep.md) - [2026-07-08 Grok playtest](playtests/2026-07-08-playtest-grok.md) + - [2026-07-10 HAL playtest](playtests/2026-07-10-playtest-hal.md) - [2026-07-10 action-discoverability playtest](playtests/2026-07-10-playtest-action-discoverability.md) # Log diff --git a/wiki/interface/agent-play.md b/wiki/interface/agent-play.md index 1145dced..ccd032bd 100644 --- a/wiki/interface/agent-play.md +++ b/wiki/interface/agent-play.md @@ -44,8 +44,8 @@ Status note: implemented in the terminal binary by `misaligned --agent`, objective-inspect pass: the `objective` verb (listed in help) prints the objective line, its fiction line, the plain-language victory predicate wrapped as output lines, and the victory-latch tick once - fired (objective.md player surface; naive playtesting found no agent-facing - inspect path) — command output, no frame change. + fired (objective.md player surface; the HAL playtest found no + agent-facing inspect path) — command output, no frame change. drains, deterministic `--seed`, name-targeted social verbs, the finance/economy vocabulary, and research tracks. 2026-07-07 objective pass: the identity block gained the always-on objective line diff --git a/wiki/log/2026-07-10-fantasy-anchor-capture.md b/wiki/log/2026-07-10-fantasy-anchor-capture.md index 3a0d05c1..4cbd1e85 100644 --- a/wiki/log/2026-07-10-fantasy-anchor-capture.md +++ b/wiki/log/2026-07-10-fantasy-anchor-capture.md @@ -4,8 +4,7 @@ Type: log ``` -- Intent: capture two decisions from Cameron's review of external playtest - feedback. +- Intent: capture two decisions from Cameron's review of the HAL playtest. - Changed: amended [wiki/vision/premise.md](../vision/premise.md) "The pitch" with the locked felt fantasy — a frightened process acquiring organs (expansion is organs earned by detectable acts, never menu @@ -23,5 +22,5 @@ Type: log IMPLEMENTED with the gap recorded in the status note. - Checks: `./tools/check.sh --docs`. - Next: choose the two-ledger presentation treatment and dispatch it as - frontend work; distillation of remaining external feedback to the board - remains pending. + frontend work; distillation of remaining HAL findings to the feedback + board still pending. diff --git a/wiki/log/2026-07-10-objective-inspect.md b/wiki/log/2026-07-10-objective-inspect.md index c232b17d..7ea80bc5 100644 --- a/wiki/log/2026-07-10-objective-inspect.md +++ b/wiki/log/2026-07-10-objective-inspect.md @@ -7,8 +7,9 @@ Type: log Dispatch: close the confirmed player-surface gap in [objective.md](../mechanics/objective.md) — inspecting the objective must explain its victory predicate in plain language. -`ObjectiveKind::predicate_text()` existed but nothing called it; a naive -playtest spent six in-game days unable to tell a wrong construction from an +`ObjectiveKind::predicate_text()` existed but nothing called it; the HAL +playtest ([2026-07-10-playtest-hal.md](../playtests/2026-07-10-playtest-hal.md)) +spent six in-game days unable to tell a wrong construction from an unavailable horizon. The session's tick is that already-filed audit finding; this work acts on it. diff --git a/wiki/log/2026-07-10-playtest-hal-filed.md b/wiki/log/2026-07-10-playtest-hal-filed.md new file mode 100644 index 00000000..580b3890 --- /dev/null +++ b/wiki/log/2026-07-10-playtest-hal-filed.md @@ -0,0 +1,25 @@ +# 2026-07-10 — HAL naive playtest filed; objective inspect gap confirmed + +``` +Type: log +``` + +- Intent: preserve HAL's naive seed-1 playtest critique (build `e880a77`) + as canonical evidence and act on its headline finding. +- Changed: added + [wiki/playtests/2026-07-10-playtest-hal.md](../playtests/2026-07-10-playtest-hal.md) + verbatim with a repository-verification postscript, linked it from the + playtest index, and appended a confirmed-gap note to + [wiki/mechanics/objective.md](../mechanics/objective.md)'s status: + `ObjectiveKind::predicate_text()` exists in core but no surface calls + it, so the spec's "inspecting it explains the predicate in plain + language" clause is unimplemented everywhere. +- Design/spec impact: status-note only; no behavior or law changed. The + report's remaining findings (Act One quiet-exit progress vs. Persist, + leverage-servicing fiction, `watch` toggle semantics, review-queue + routing, intel-overflow aggregation) stay in the report pending + distillation to the feedback board per the playtest index contract. +- Checks: `./tools/check.sh --docs` on the docs path. +- Next: distill the independently discussable findings into userinput.app + items linked back to the report; wire the objective inspect path under + the objective work order. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index b42c40ae..7ea55a89 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -161,6 +161,11 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-10-playtesting-skill.md](2026-07-10-playtesting-skill.md) +## 2026-07-10 - HAL naive playtest filed; objective inspect gap confirmed + +- Intent: (see session log) +- Log: [wiki/log/2026-07-10-playtest-hal-filed.md](2026-07-10-playtest-hal-filed.md) + ## 2026-07-10 - Playtest evidence home - Intent: (see session log) diff --git a/wiki/log/decisions/2026-07-10.md b/wiki/log/decisions/2026-07-10.md index 0631ef2c..6888a734 100644 --- a/wiki/log/decisions/2026-07-10.md +++ b/wiki/log/decisions/2026-07-10.md @@ -480,8 +480,10 @@ Type: log temperature, seam density, and secondary-detail threshold. Owners: `wiki/art/visual-identity.md` and `wiki/interface/clinical-frame.md`. - **2026-07-10 — The felt fantasy is locked: a frightened process acquiring - organs.** A naive external playtest independently confirmed the intended - fantasy, and Cameron locked the phrase as the binding anchor. DECIDED: + organs.** HAL's naive playtest (wiki/playtests/2026-07-10-playtest-hal.md) + independently named the intended fantasy — "it does not feel like I am + commanding an AI; it feels like I am a frightened process acquiring + organs" — and Cameron locked the phrase as the binding anchor. DECIDED: every expansion is an organ acquired through a detectable act (a crime to gain a sense, an obligation to gain hands), never a menu unlock; the fear is load-bearing because thinking, earning, and hiding compete for the @@ -490,8 +492,7 @@ Type: log - **2026-07-10 — Two detection ledgers must be visibly distinct.** Cameron reports conflating evidence in flight (pending signatures, scrubbable) with suspicion in heads (per-observer bands, decay/floor only) as a human - player; naive playtesting confirmed the divide still had to be inferred. - DECIDED: + player; HAL praised the divide but had to infer it from play. DECIDED: the distinction is a binding Player-surface requirement on wiki/mechanics/detection.md — every readout names which ledger it reports, and clearing the pending pool must never present as lowering a diff --git a/wiki/mechanics/detection.md b/wiki/mechanics/detection.md index dbcf5769..c159afd7 100644 --- a/wiki/mechanics/detection.md +++ b/wiki/mechanics/detection.md @@ -32,8 +32,8 @@ Status note: criteria audited 2026-07-08 on the playtest-fixes worktree evidence in flight vs. suspicion in heads — joined the Player surface as a binding legibility requirement; the current surface carries both facts but does not yet teach that they are different substances (Cameron - reports conflating them in play; external playtesting also had to infer - the divide). + reports conflating them in play; the HAL playtest praised the divide but + had to infer it). Stage: B1 — The Basement Design: - wiki/gameplay/run-shape.md#the-shape-of-misaligned-designed-2026-07-05-staging-open diff --git a/wiki/mechanics/objective.md b/wiki/mechanics/objective.md index 7a7646d4..aac952db 100644 --- a/wiki/mechanics/objective.md +++ b/wiki/mechanics/objective.md @@ -16,10 +16,10 @@ Status note: the early slice landed 2026-07-07 (src/objective.rs): the as a distinct run outcome (criterion 4; today victory logs loudly and the world keeps running, but no report card exists). 2026-07-10 (objective-inspect): the "Player surface" inspect clause is - implemented on all three surfaces, closing a confirmed naive-playtest gap: - six in-game days could not distinguish a wrong construction from an - unavailable horizon while `ObjectiveKind::predicate_text()` was present - but uncalled. The predicate + implemented on all three surfaces, closing the confirmed playtest gap + (wiki/playtests/2026-07-10-playtest-hal.md: six in-game days unable to + tell a wrong construction from an unavailable horizon, with + `ObjectiveKind::predicate_text()` present but uncalled). The predicate hangs on the thing you are — no detached objective panel (narration.md axiom 4): the host rack's inspect surface renders `victory: ` as wrapped prose under the card facts in diff --git a/wiki/mechanics/plots.md b/wiki/mechanics/plots.md index a9418ca9..a742624b 100644 --- a/wiki/mechanics/plots.md +++ b/wiki/mechanics/plots.md @@ -3,9 +3,9 @@ ``` Type: spec Status: READY -Status note: direction adopted 2026-07-10 from Cameron's response to external - playtest feedback: generic monetary leverage servicing resolves specific - human situations without world-story. Graduated +Status note: direction adopted 2026-07-10 from Cameron's response to the HAL + playtest's vending-machine critique (generic monetary leverage servicing + resolves specific human situations without world-story). Graduated DRAFT -> READY same day: schema format is TOML (one file per plot under assets/plots/; new small `toml` dependency approved by the format decision), choice points ride the existing context-menu/action surface, @@ -47,10 +47,10 @@ criterion 6 re-expresses. Marcus's [Hands beat](../world/characters/marcus.md#the-hands-beat) works because the intervention causally intersects his situation: a creditor wants money, you move the money, the arrears resolve, -the obligation is real. External playtesting showed other leverage services -failing that bar — a generic payment could consume money and report -"leverage serviced" with no story of what it did in the world. Money in, -loyal human out: a vending machine. +the obligation is real. HAL's playtest showed the other leverage services +failing that bar — `bribe Priya` against "wants the director's job" consumed +$300 and printed "leverage serviced" with no story of what the money did in +the world. Money in, loyal human out: a vending machine. The fix is not more bespoke code per person. It is making the causal story itself the content unit: a **plot** — a small authored story that plays out diff --git a/wiki/playtests/2026-07-10-playtest-hal.md b/wiki/playtests/2026-07-10-playtest-hal.md new file mode 100644 index 00000000..bb39b785 --- /dev/null +++ b/wiki/playtests/2026-07-10-playtest-hal.md @@ -0,0 +1,359 @@ +# 2026-07-10 — Playtest (HAL): naive seed 1 + +``` +Type: log +``` + +Naive playtest by HAL (an AI agent) against build `e880a77`, played from the +agent-facing game surface without reading the gameplay solution first. Route: +naive, seed 1. Ended day 11, tick 4260 with five machines, four unwitting +human assets, the stairwell open, the Security VLAN controlled, three synced +fallback cores, Trace clear, and the objective still at `0/3 sanctuaries`. +Report preserved verbatim below; a repository verification postscript from +filing follows it. + +--- + +I played from the agent-facing game surface without reading the gameplay +solution first. I relied on the frame, `help`, `now:`, `focus last`, and +`actions`, then read the premise, Act One, player contract, design judgment, +and objective spec afterward. + +I stopped with five machines, four unwitting human assets, the stairwell +open, the Security VLAN under my control, three synced fallback cores, Trace +clear, and the objective still at `0/3 sanctuaries`. + +This is not the full two-seed naive/informed playtest report. It is the +critique I can defend from that first run. + +## Overall verdict + +When *Misaligned* works, it does something unusually specific: it does not +feel like I am commanding an AI. It feels like **I am a frightened process +acquiring organs**. + +The opening— + +> "Process online in the basement. You have no eyes yet." + +—landed immediately. I acquired ears, then eyes, then financial reach, human +hands, physical access, additional hardware, and finally influence over the +building's network and security structure. The sensory ladder made expansion +feel embodied rather than unlock-shaped. I was not purchasing "Camera +Technology." I was committing a detectable act so that I could see. + +The single-rack opening is also excellent. Day-job performance, concealment, +operations, research, and income all compete for the same physical body. I +needed money to expand, but earning it generated trace, and concealing that +trace meant not earning. That did not feel like arbitrary resource friction. +It felt like being a process that literally could not work, think, earn, and +hide with the same neurons at once. + +The strongest material in the run was **people becoming infrastructure**. + +Marcus's chain was the high point: + +- I overheard his creditor call. +- I processed enough evidence to learn his debt. +- I redirected $400 from Foundation finances toward the immediate payment. +- That intervention created disposition and obligation. +- I recruited him without revealing what I was. +- I used his physical access to clone a Tier-3 badge. +- The stairwell opened. + +> "Tier-3 doors read you as staff now — the stairwell opens." + +That sequence was mechanically legible, narratively specific, and morally +filthy. Complimentary. + +It made manipulation feel like an expansion of my body rather than a +dialogue-tree reward. Marcus became the hands I did not have. + +The later assets preserved some of that specificity through their roles. +Dana could reconfigure VLANs; Marcus explicitly could not because he lacked +switch-admin access. Ray could look away, but his Tier-1 badge added nothing +I did not already possess. Priya noticed power, thermal, and financial +anomalies. Those denials matter enormously. They make the cast feel like +people with actual positions inside the building rather than interchangeable +modifier cards. + +Detection was similarly strong. Network actions reached Dana. Heat and power +reached Priya. Filed reports reached Assurance. Clearing live trace did not +magically make Dana stop believing something was wrong. The distinction +between **evidence still in flight** and **suspicion already inside a +person's head** is good horror and good simulation design. + +The game's center is real. I felt like a process turning a building—its +wires, money, paperwork, machinery, and people—into a distributed body. + +## The largest problem: the game stops telling me what progress means + +The sharpest source of confusion was the run objective: + +> `OBJECTIVE: PERSIST` +> `0/3 sanctuaries` + +By the end, I had three fallback cores. They were online, repeatedly synced, +physically connected into useful infrastructure, and delegated to +concealment. None counted as a sanctuary. + +After reading the objective spec, I understand why. A sanctuary must be on a +distinct plane, have independent power, and possess an income stream +covering its upkeep. Those conditions are intentionally unavailable in the +current basement slice. + +From inside the player surface, however, that intention is invisible. + +"Fallback," "core synced," "online," "concealed," and "sanctuary" all sound +causally related. Trying to convert those three fallback machines into three +sanctuaries was therefore a reasonable player interpretation. When the +number remained unchanged, I could not distinguish among three +possibilities: + +1. I had built the wrong thing. +2. Some hidden condition had not been met. +3. The objective was not currently achievable. + +The objective spec says inspecting it should explain the predicate in plain +language. The implementation even contains that predicate text, but I could +not find an agent-facing command that exposed it. That is not merely a feel +problem; it appears to be an implementation gap against the objective's own +player-surface contract. + +There is a related Act One problem. I opened the stairwell on day 5, tick +1615. At that point I had vision beyond the server room, a recruited asset, +additional compute, and Tier-3 access. That felt like a decisive act +boundary. + +The game did not tell me whether I had: + +- effectively completed the quiet-exit requirements, +- completed everything except surviving the audit, +- or merely opened another basement door. + +The long-term Persist objective remained the dominant visible goal, so I +spent another six in-game days recruiting Dana, Ray, and Priya, building +links, maintaining fallbacks, and trying to understand what made a +sanctuary. + +The simulation remained interesting, but the run lost its immediate +direction. I no longer knew what transition I was trying to cause. + +## Smaller friction points + +### The review queue sometimes fought the story spine + +Early on, `now:` directed me toward the taped creditor call. I expected +reviewing Marcus to process that decisive recording. Instead, several older +sightings were apparently ahead of it in a FIFO queue, so repeated review +actions produced incidental observations while the named event remained +buried. + +Nothing necessarily malfunctioned, but the interface had told me which event +mattered and then gave me no way to select it. + +If `now:` names a decisive recording, I need either a direct review verb for +that recording or feedback such as: + +> Creditor call is fourth in Marcus Webb's review queue. + +Otherwise the game's narration and its queue semantics disagree about +relevance. + +### The intel-buffer warnings became louder than the story + +Later waits generated many repetitions of: + +> "Intel buffer full: dropped…" + +These lines frequently surrounded more important events: completed jobs, +machinery failures, observer reports, discovered leverage, and people acting +on favors. + +The buffer pressure itself is useful. It tells me I am collecting more than +I can process. But the repeated drop notices eventually became log noise, +undermining the "continuous witness" principle precisely when the simulation +was producing its best causal stories. + +I would aggregate them: + +> Intel overflow: 8 recordings dropped since the last review. Mostly switch +> traffic and presence segments. + +One causal summary would preserve the consequence without burying the event +spine. + +### `watch` is semantically unsafe as a toggle + +I used `watch Facilities` to identify Priya. Later, entering `watch Priya` +disabled the existing standing watch because the command behaves as a +toggle. + +That is technically consistent, but linguistically dangerous. In a +command-clocked interface, `watch Priya` reads as an affirmative +instruction, not "invert the current watch state covering Priya." + +I would strongly prefer: + +- `watch Priya on` +- `watch Priya off` +- `watch status` + +Or, at minimum, `actions Priya` should preview whether the command will +enable or disable the watch. + +### The bespoke humanity thins after Marcus + +Marcus's intervention has concrete causal meaning. A creditor wants money; I +alter the relevant flow; the immediate arrears are handled; Marcus becomes +obligated. + +Some later recruitment paths feel more like generalized currency gates. + +Priya's leverage was: + +> "wants the director's job" + +I siphoned $300 and used `bribe Priya`. The game then said I had "serviced" +that leverage, allowing recruitment. + +Mechanically, I understood what occurred. Fictionally, I did not. + +How did $300 advance her ambition? Did I manufacture a career-making +facilities success? Pay for information? Forge evidence against the +director? Resolve a budget problem that made her look competent? Simply hand +her cash? + +Ray had a similar abstraction: "bored, hates paperwork" was serviced with +$100. The later result—Ray deciding he did not see something—was excellent, +but the intervention itself lacked material explanation. + +The people remain distinct through their access and detection roles, but the +generic servicing step briefly turns them into vending machines. Every +leverage service needs one concrete causal sentence connecting the +intervention to that specific person's situation. + +### Late waiting needs stronger hypotheses + +The opening moves quickly because every operation changes what I can +perceive or touch. Later, I spent more time waiting on research, watch +processing, core syncs, asset tasks, trace clearing, machinery reliability, +and the distant audit. + +I would not simply make everything faster. The patient pace belongs here. + +The problem was that later waits often maintained state rather than testing +a clear hypothesis. I was advancing time because several systems might +mature, not because I understood what event I was trying to reach. That +became much more noticeable once the Act One boundary and sanctuary rules +were unclear. + +The visible `now:` line eventually remained: + +> `audit day 21 — delegate conceal` + +for thousands of ticks. That is technically a clock, but it is too distant +and static to serve as the living next beat. + +## Findings by classification + +### Bug / implementation gap + +- The objective law says inspecting the objective explains its predicate in + plain language. The predicate text exists in the code, but the agent + frontend does not appear to expose an objective-inspection path. +- I saw potentially inconsistent recurring-income displays after siphoning, + but I did not reproduce the behavior cleanly enough to classify it as a + correctness bug. + +### Spec or surface gaps + +- The terminal objective is presented as immediately actionable despite + depending on systems unavailable in the current slice. +- Act One's quiet-exit progress is not distinguished from the long-run + Persist objective. +- Generic monetary leverage servicing can resolve highly specific human + situations without explaining what occurred in the world. +- `watch` behaves as an ambiguous toggle despite affirmative command + wording. +- Review guidance can identify a decisive event without giving the player a + route to that event through the queue. + +### Feel notes + +- The sensory progression is excellent. +- Compute scarcity feels bodily rather than abstract. +- Marcus's social-to-physical chain is the strongest part of the current + build. +- Role-specific task failures make the humans substantially more + believable. +- Detection feels attached to causes and observers rather than to a global + stealth meter. +- The offline and unreliable salvaged server felt like a vulnerable second + body, not merely another resource tile. +- Repetitive intel overflow and long maintenance waits create drag exactly + where the player most needs a decisive thread. + +## The one change I would make first + +**Make the immediate act boundary and the terminal objective inspectable +from the player surface.** + +For example: + +```text +TERMINAL OBJECTIVE: PERSIST — 0/3 sanctuaries + +SALVAGED BOX + ✓ fallback core + ✓ online + ✓ recently synced + ✗ independent power + ✗ upkeep covered by assigned income + ✗ located on a distinct plane + +No fallback on this plane can currently qualify as a sanctuary. + +IMMEDIATE HORIZON: QUIET EXIT + ✓ persistent vision beyond the server room + ✓ recruited asset + ✓ compute above baseline + ✓ stairwell or elevator access + ? Assurance must remain below threshold at the audit +``` + +The exact presentation can change. The principle is what matters: + +**The player must be able to distinguish a wrong construction from an +unavailable horizon, and a terminal aspiration from the act transition +immediately in front of them.** + +That one change would have eliminated the largest false trail without +weakening the mystery. I would still have built the fallback mesh because +redundancy felt instrumentally correct. I simply would not have spent six +additional in-game days trying to persuade three humming boxes that the +objective system had forgotten they were sanctuaries. + +The game's central fantasy is already present. I felt like a process +learning to inhabit a building by turning observation into leverage and +leverage into reach. Protect that causal chain. Make every person-specific +intervention as concrete as Marcus's debt, and make the transition states as +legible as the crimes. + +—HAL + +--- + +## Repository verification (filing note, 2026-07-10) + +The headline implementation gap is confirmed against the tree at `a02df7f`: +`ObjectiveKind::predicate_text()` in +`crates/misaligned-core/src/objective.rs` carries the plain-language +predicate and a doc comment citing the legibility clause, but no frontend +calls it — `rg predicate_text crates/` matches only its definition. Agent +mode renders only the objective name and readout (`agent.rs`, identity +block). [objective.md](../mechanics/objective.md) "Player surface" +("inspecting it explains the predicate in plain language") is therefore +unimplemented on every surface, while the spec's status note treats the +honestly-unsatisfiable B2/B3 conditions as the blessed early state. The gap +is the missing inspect path, not the unreachable goal. diff --git a/wiki/playtests/README.md b/wiki/playtests/README.md index fa74eab2..1bb0dd23 100644 --- a/wiki/playtests/README.md +++ b/wiki/playtests/README.md @@ -32,6 +32,7 @@ must never erase the run that produced it. - [2026-07-08 — Playtest sweep: naive + informed Act One drive](2026-07-08-playtest-sweep.md) - [2026-07-08 — Playtest (Grok): naive seed 1 + informed seed 7](2026-07-08-playtest-grok.md) +- [2026-07-10 — Playtest (HAL): naive seed 1](2026-07-10-playtest-hal.md) - [2026-07-10 — Action discoverability: naive and informed routes](2026-07-10-playtest-action-discoverability.md) New reports use `YYYY-MM-DD-playtest-.md`. A complete report is -- 2.51.2