7 Commits
Author SHA1 Message Date
fez5587andClaude Fable 5 eff5cb4510 Live worker logs: see what an in-progress worker is doing/thinking
- GET /companies/{slug}/work-items/{id}/log proxies the Hermes task log
  (agent reasoning blocks + tool calls), tail-limited, served as text
- dashboard: every dispatched work item row gets a "log" link
- office: click a working employee sprite to open their live log

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:08:07 -05:00
fez5587andClaude Fable 5 027e7458f4 Manager status updates + workspace demo links
- While work is in flight, the manager posts a 2-4 sentence shareholder
  status update (what's moving, risks, next step) digested from real
  events via one pool call — at most one per 2h per company, skipped
  when a milestone update already covered the window. Shows in the CEO
  updates feed as status.update.
- Workspace demos: engine proxies top-level company workspace files from
  Hermes (GET /companies/{slug}/files[/{name}]); dashboard lists them
  with links so deliverables like index.html render live in the browser.
- Engine logs at info level so dispatcher activity is visible.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 14:43:06 -05:00
fez5587andClaude Fable 5 4796274ea5 Consultant path + per-company pause
- create_profile accepts a provider; non-custom providers (anthropic,
  openai-codex) skip the pool base_url and use Hermes GUI credentials —
  externally billed consultants
- consultant role charter; EmployeeSpec carries model+provider;
  POST /companies/{slug}/employees hires into an existing company
- decomposition may assign role consultant, with explicit cost guidance
- POST /companies/{slug}/pause|/resume flips lifecycle_state; dispatcher,
  standups and directives already filter on active, in-flight work
  finishes; dashboard gets a per-company pause button

Verified: ChatGPT OAuth consultant (gpt-5.4-mini) completed a kanban task
end-to-end via Hermes credential pool; pause/resume roundtrip with 409
guard on double-pause.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 14:28:29 -05:00
fez5587andClaude Fable 5 9a1b03b15e Fix workspace dispatch: kanban workspace_kind is 'dir', block on dispatch 4xx
- 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>
2026-08-04 10:15:05 -05:00
fez5587andClaude Fable 5 4fd6f3fd1d Slice 1: engine dashboard + persistent company workspaces
- 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>
2026-08-04 10:08:58 -05:00
fez5587andClaude Fable 5 9b6e7a23f6 Slice 1: dispatcher loop + objective decomposition — first live objective completed
- engine/dispatcher.py: 10s tick, bounded in-flight (3), ready->kanban dispatch
  with budget mapping (goal_max_turns/max_runtime_seconds), poll->AgentMessage
  extraction->events, wall-clock cap with run termination, blocked triage state.
- engine/protocol.py: schema-enforced pool calls — raw report -> AgentMessage,
  objective brief -> task decomposition (3.6s live).
- engine/main.py: POST /companies/{slug}/objectives (manager decompose ->
  child work items, role-matched round-robin), GET work-items.
- schema: work_item.hermes_task_id/dispatched_at, employee.role.
- Hermes integration fixes discovered live:
  * profiles must use the pool custom endpoint (provider config written into
    per-profile config; 'ollama' provider = Ollama Cloud, wants API key)
  * kanban toolset was globally disabled in deployed Hermes config — removed
    from agent.disabled_toolsets (backup in scratchpad)
  * no_skills profiles (73 bundled skills drowned 9B tool discipline)
  * souls spell out kanban_show first, kanban_complete/kanban_block with
    required args last — after this, tasks complete reliably.
- Live result: GasWatch objective decomposed into 3 tasks, all completed by
  qwen3.5:9b employees (mvp_features.md, onepager.md, report.md), 4 cost
  entries totaling ~24 min wall, full event trail.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 09:49:26 -05:00
fez5587andClaude Fable 5 d05004e9cd Slice 1: Hermes adapter with live-verified round-trips
- engine/hermes_client.py: cookie-auth async client — profiles (create/soul/
  model/delete), kanban tasks (create with tenant + runaway budget mapping,
  idempotency via work-item UUID, update/delete), dispatch, runs, workers.
- engine/config.py: env-driven settings (.env stays gitignored).
- tests/test_hermes_live.py: live smoke against Hermes 0.19.0 — all pass:
  profile round-trip, task create (t_*), idempotent re-create, status patch,
  cleanup. No dispatch triggered (no GPU burn).
- Discovery: kanban responses wrap in {task}; webhooks are inbound triggers,
  so engine polls run/task status (ADR-001 fallback is the primary channel).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 00:34:20 -05:00