Loop-2 Critical finding CS-01 from docs/ui-audit/screens/camp-sidebar.md (new standalone audit). Parent epic: #249 (Atlas — Camp Sidebar lives inside Atlas via campMode).
Symptom
The entire Camp screen culminates in a "Begin Resting" CTA that is permanently disabled with title="Display-only — resting is not yet wired to the engine; nothing is saved". Every supporting control (Manage rations, Use rations checkbox, Healing radio, Recipes picker, Watch roles, Special roles, TALK_PROMPTS) feeds into a moment that never lands. The whole sidebar is theater.
File:line
viewer/openworlds/camp-sidebar.jsx:293-295 — the disabled CTA
viewer/openworlds/camp-sidebar.jsx:42-48 — local roles state never POSTed
viewer/openworlds/camp-sidebar.jsx:49-51 — recipe / healing local state, never sent
Acceptance criteria
- When
surface.can_act (live session attached), the CTA POSTs to /move with a payload like:
{
"kind": "rest",
"type": "long",
"watch": ["<heroId-watch1>", "<heroId-watch2>"],
"cook": "<heroId-cooking>",
"recipe": "hearty",
"hunting": "<heroId-hunting>",
"camouflage": "<heroId-camouflage>",
"healing": "spells",
"use_rations": true,
"campaign": "<campaign_id>"
}
- Engine resolves the rest (HP / spell slots / abilities / hit dice refreshed; rations consumed; watch perception rolls), narrates the morning, advances the clock.
- Toast confirms the rest landed.
- When
!can_act, the CTA remains preview-only with the existing title attr.
Why it matters
This is the single most felt missing wire on the whole Atlas screen — every other camp control was designed to flow into this one moment. Closing it converts the Camp UI from "honest preview" to "real game state change", which is the highest-leverage interaction in any session.
Adjacent: #268 (Spellbook browse — Rest & Prepare modal on Character has the same disabled-CTA shape and would land in the same family of changes).
Epic: #249. EPIC F (wire-prototypes). Umbrella: #242.
Loop-2 Critical finding CS-01 from
docs/ui-audit/screens/camp-sidebar.md(new standalone audit). Parent epic: #249 (Atlas — Camp Sidebar lives inside Atlas via campMode).Symptom
The entire Camp screen culminates in a "Begin Resting" CTA that is permanently
disabledwithtitle="Display-only — resting is not yet wired to the engine; nothing is saved". Every supporting control (Manage rations, Use rations checkbox, Healing radio, Recipes picker, Watch roles, Special roles, TALK_PROMPTS) feeds into a moment that never lands. The whole sidebar is theater.File:line
viewer/openworlds/camp-sidebar.jsx:293-295— the disabled CTAviewer/openworlds/camp-sidebar.jsx:42-48— localrolesstate never POSTedviewer/openworlds/camp-sidebar.jsx:49-51—recipe/healinglocal state, never sentAcceptance criteria
surface.can_act(live session attached), the CTA POSTs to/movewith a payload like:{ "kind": "rest", "type": "long", "watch": ["<heroId-watch1>", "<heroId-watch2>"], "cook": "<heroId-cooking>", "recipe": "hearty", "hunting": "<heroId-hunting>", "camouflage": "<heroId-camouflage>", "healing": "spells", "use_rations": true, "campaign": "<campaign_id>" }!can_act, the CTA remains preview-only with the existing title attr.Why it matters
This is the single most felt missing wire on the whole Atlas screen — every other camp control was designed to flow into this one moment. Closing it converts the Camp UI from "honest preview" to "real game state change", which is the highest-leverage interaction in any session.
Adjacent: #268 (Spellbook browse — Rest & Prepare modal on Character has the same disabled-CTA shape and would land in the same family of changes).
Epic: #249. EPIC F (wire-prototypes). Umbrella: #242.