# Spec: schedules and presence ``` Type: spec Status: IMPLEMENTED Status 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 Basement Design: - 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-scale Depends on: - wiki/mechanics/social.md#spec-social - wiki/world/places/basement-map.md#spec-the-basement-map - wiki/mechanics/detection.md#spec-detection ``` ## Dependency notes The structured references above identify the contracts to re-verify. Relationship context: social.md, basement-map.md (rooms), detection.md ## 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 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 1. Persons have schedules and derived positions on the shared day clock; off-site blocks exist; save/load round-trips schedule state. 2. 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). 3. 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). 4. 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 `?` until `Knowledge::Schedule` (`Sim::person_glyph`); initials appear only after identity is earned. 5. All schedule data is per-instance `Person` data (no hardcoded five-person switch) — the same fields must serve Act Two hires.