Skip to content

Spec: schedules and presence

SPEC Binding system contract
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

The structured references above identify the contracts to re-verify. Relationship context:

social.md, basement-map.md (rooms), detection.md

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.

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.

  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.