Spec: schedules and presence
Status: IMPLEMENTEDStatus note: all five criteria met (2026-07-06; updated 2026-07-07 for intel.md). Schedules are per-instance Person data on the day clock; subscribed feeds record only people/events covered in the person's current room; witnessing is located (present observers only); the current people projection (Operations PEOPLE after its READY migration) + map surface presence by staged knowledge. Located witnessing is modeled as immediate eyewitnessing (present observers' suspicion rises directly, unscrubbable) rather than a pooled Physical signal — an event nobody was present for leaves no trace, which is the stealth fantasy. Surfaced and fixed a pre-existing bug: observer ids did not match person ids (recruit/set_floor/LookAway hit the wrong observer); observers are now id-aligned to People. 2026-07-08 epistemic-honesty follow-up: criterion 4 extended — map glyphs are `Sim::person_glyph` (`?` until Schedule; initial after). 2026-07-11 placement amendment: the existing people projection becomes Operations PEOPLE under operations-workspace.md; schedule behavior and its staged labels remain implemented while that frontend migration is READY.Stage: B1 — The BasementDesign: - wiki/gameplay/act-one.md#the-cast-5-named-1-institutional - wiki/gameplay/run-shape.md#the-shape-of-misaligned-designed-2026-07-05 - wiki/vision/scale.md#self-similar-scaleDepends on: - wiki/mechanics/social.md#spec-social - wiki/world/places/basement-map.md#spec-the-basement-map - wiki/mechanics/detection.md#spec-detectionDependency notes
Section titled “Dependency notes”The structured references above identify the contracts to re-verify. Relationship context:
social.md, basement-map.md (rooms), detection.md
Behavior
Section titled “Behavior”Every Person gains a schedule: a list of (start_hour, end_hour, room) blocks over the 24-hour day (1 hour = DAY_TICKS / 24 sim ticks;
DAY_TICKS = 400 today — reuse the sidebar’s day math, do not introduce a
second clock). Between blocks a person is off-site (not on the plane).
- Position. A person’s position is the room of their active block (represented as the room’s rect; exact tile wandering is presentation, not law). Off-site persons have no position.
- Act One schedules (from the design corpus’s cast; hours [TUNE], as
authored in
People::act_one): Marcus 22:00-06:00 roaming (janitor-closet home base, one block per room across the hall); Dana 09:00-17:00 (network closet then server room); Ray 20:00-04:00 (loading dock / stairwell / storage patrol); Priya 08:00-16:00 (electrical / HVAC); Voss erratic ([TUNE]: 2 short server-room blocks whose hours drift 0-5 by a deterministic day hash). - Recordings require coverage of them, now. Raw intel events exist only if a subscribed feed’s coverage intersects the person’s current room at the event’s tick. Covered presence/conversation events enter the intel buffer; uncovered ones do not exist and cannot later be reviewed.
- Witnessing becomes located. A Physical signature from a failed asset task or player physical act is noticed only by observers whose current room (or patrol) covers the location — Ray notices what happens on his rounds, not what happens in a room he never enters. Off-site observers roll nothing.
- Schedule knowledge stays staged (social.md): until
Knowledge:: Schedule, the player’s UI shows the person’s location only when a controlled sensor actually sees them; after it, the PEOPLE dossier shows their full schedule and current block.
Player surface
Section titled “Player surface”The people surface (current frame; Operations PEOPLE when that work order
lands): current location line per person (“in the server room” /
“off-site” / “unknown — no eyes on them”); after schedule knowledge, the
schedule itself. Identity on that card is staged the same way
(social.md / cursor.md): role silhouette until Knowledge::Schedule.
Map: person glyphs render only inside controlled-sensor coverage (they
are what fog is for), and the glyph itself is Sim::person_glyph —
? while Unknown, the person’s initial once identified.
Acceptance criteria
Section titled “Acceptance criteria”- Persons have schedules and derived positions on the shared day clock; off-site blocks exist; save/load round-trips schedule state.
- Feed recording fails without a subscribed sensor covering the person’s current room; succeeds when one does (test: env-camera-only run records Dana in the server room but records nothing for Ray at 23:00 in the corridors).
- Physical signatures are noticed only by observers whose location covers them (test: a physical event in the server room at 03:00 is seen by roaming Marcus, never by off-site Priya).
- The shared people projection (rendered in Operations PEOPLE after its
READY frontend migration) and the map surface presence exactly per the staged
knowledge rules; no person renders outside sensor coverage. Map glyphs
are
?untilKnowledge::Schedule(Sim::person_glyph); initials appear only after identity is earned. - All schedule data is per-instance
Persondata (no hardcoded five-person switch) — the same fields must serve Act Two hires.