- inConf() was x-only, so the break area routed through the conference door
- door crossings now go west-waypoint -> doorway -> target (no wall clipping)
- workers face the viewer at their desk; typing anim/monitor glow computed
from live state in the draw loop instead of waiting for the next poll
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- /office rebuilt Chrono Trigger style: tile map (work floor, walled
conference room with door, break area), 4-direction sprites with walk
cycles; employees path through the door and walk to their desk when
working (typing anim, lit monitor), to the conference room with a "?"
bubble when blocked on an answer, to the water cooler when idle. All
movement derives from polled engine state only.
- Dispatcher now appends completed-sibling task reports to each task body
so decomposed tasks are no longer blind to each other's output (fixes
the "apply the patch task A made" capability block).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- POST /companies/{slug}/work-items/{id}/answer: shareholder answers a
blocked item; answer is appended to the description and the existing
kanban task is rerun (status=ready + updated body), or the item goes
back to ready for fresh dispatch if it was never dispatched
- Dashboard: answer button on blocked work item rows (native prompt)
- /office: pixel-art 2D office view — one desk row per employee, avatar
color by role, LED/typing animation driven only by real engine status,
live event ticker (PRD 12: no fake activity)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- POST /companies/{slug}/directives: free-form shareholder message becomes
an objective (reuses manager decomposition), logs directive.received
- Objective rollup now emits a CEO-voiced milestone.update event via one
pool call (plain-text fallback if the LLM call fails)
- _chat_structured retries once on empty/invalid JSON from the pool
(observed empty-content responses breaking protocol extraction)
- Dashboard: per-company shareholder textarea + CEO updates feed; refresh
skips DOM rewrite while a textarea is focused
Verified end-to-end: directive -> 3 tasks -> rework after handoff block ->
rollup -> CEO milestone update; gaswatch index.html now on-brand.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Hermes rejects workspace_kind 'path' (valid: dir/scratch/worktree).
- Dispatch failure now blocks the work item with a dispatch.failed event
instead of retrying the same 400 every tick.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- engine/static/index.html served at /: companies, employees, objectives,
work items, live event feed (5s poll), global pause/resume button.
- Persistent per-company workspace on the Hermes host
(/opt/data/farmhouse/<slug>, created via files API at company creation);
dispatcher passes it as kanban workspace_path so artifacts persist across
tasks instead of dying in scratch dirs.
- hermes_client.mkdir; gaswatch backfilled.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- PRD v1.0 plus addendum with environment reality checks (qwen3.5:9b pool, runaway protection, MVP trim)
- Pre-implementation checklist and GitHub integration plan
- ADR-001: build on Hermes Agent 0.19.0 as agent runtime; engine stays source of truth
- ADR-002: engine stack (FastAPI, Postgres, Redis, React)
- Benchmark suites + results: all five capability gates PASS, pool scaling 1.92x at 4 concurrent
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>