When get_state_summary() shows no workstreams for the domain, Claude
now has explicit instructions: read the canon charter + roadmap, survey
the repo for in-progress work, propose 1-3 workstreams to Bernd, wait
for approval, then create workstreams + tasks and record a milestone.
The "wait for approval before creating anything" gate keeps the human
in control while making the expected first-session behaviour unambiguous.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
MCP server: add create_workstream(topic_id, title, slug?, owner?,
description?, due_date?) — auto-generates slug from title if omitted;
emits workstream_created progress event. Now 12 tools total.
CLI: add two new subcommands —
custodian create-workstream --domain DOMAIN --title TITLE [--slug] [--owner] [--description]
custodian create-task --workstream ID_OR_SLUG --title TITLE [--priority] [--assignee]
create-task accepts workstream UUID or slug (resolves via API).
Dashboard: hint box below "Open Workstreams by Domain" chart listing
registered domains that have zero workstreams, with the exact
custodian create-workstream command to run.
TOOLS.md: updated tool count (11 → 12) and added create_workstream row.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CORS: add CORSMiddleware to FastAPI for localhost:3000 so browser fetch
works across ports without errors.
All four pages now use async generator cells that call the API directly
and re-yield every 15 s — no data loader cache, no manual cache clearing.
Each page shows a live status bar (● green/red · last updated time).
Offline state shows the `make api` hint inline.
index.md: add "Registered Projects" section — polls
/progress/?event_type=milestone&limit=500 and filters for
"Project registered with State Hub:" events; shows project name,
domain, path, and registration timestamp.
workstreams.md: fix broken domain column — now fetches /workstreams/
and /topics/ in parallel and joins on topic_id client-side.
Previously the domain column showed "unknown" for all rows because
WorkstreamRead schema doesn't include domain.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
custodian register-project [--domain DOMAIN] [--path PATH]
Defaults path to cwd; auto-detects domain from project charter if
--domain is omitted. Does: API health → topic lookup → MCP check →
CLAUDE.md from template → progress event.
custodian status
Prints API health + summary totals + blocking decisions.
Installed via: make install-cli (symlinks .venv/bin/custodian → ~/.local/bin/)
Entry point declared in pyproject.toml [project.scripts].
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
W1: Document user-scope MCP config location in ~/.claude/CLAUDE.md —
adds verification and re-registration commands, warns against
settings.json (saves ~12K tokens per registration session).
W2: scripts/register_project.sh + make register-project —
5-step automation: API health → topic lookup → MCP check →
CLAUDE.md from template → progress event.
W3: state-hub/scripts/project_claude_md.template —
parameterised CLAUDE.md with {PROJECT_NAME}/{DOMAIN}/{TOPIC_ID}
placeholders; used by register_project.sh.
W4: Add custodian_topic_id + domain to all 6 canon project charters —
lets agents grep for topic IDs without touching the API.
W5: state-hub/mcp_server/TOOLS.md — compact 30-line tool reference
card; replaces reading the full server.py (~350 lines).
W6: Switch .mcp.json to absolute path + PYTHONPATH env so cwd is not
required; add scripts/patch_mcp_cwd.py for post-registration fix.
Update ~/.claude.json to match (cwd kept for belt-and-suspenders).
W7 (SessionStart hook) deferred: no SessionStart hook type in Claude
Code; PreToolUse with empty matcher fires before every tool call.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>