# {PROJECT_NAME} — Claude Code Instructions ## Custodian State Hub Integration This project is tracked as the **{DOMAIN}** domain in the Custodian State Hub. Hub topic ID: `{TOPIC_ID}` The State Hub runs locally at http://127.0.0.1:8000. The MCP server (`state-hub`) exposes tools for reading and writing state without touching the API directly. --- ### Session Protocol **On receiving your first message — before writing any response text — execute this orientation sequence. Do not greet, do not ask what to do first.** **Step 1 — Call the State Hub** ``` get_domain_summary("{DOMAIN}") # workstreams, blocking decisions, recent progress, SBOM status ``` If the call fails, the API is offline: `cd ~/the-custodian/state-hub && make api` **Step 2 — Scan local workplans** Read every `.md` file under `workplans/`. Use `Glob(pattern="**/*.md", path="workplans/")` or Bash `ls workplans/` to discover them. For each file with `status: active`, extract and note: - The workplan title and ID - All tasks whose `status` is `todo` or `in_progress` **Step 3 — Present orientation to the user** Output a concise brief covering: 1. **Active workstreams** (from state hub) for the `{DOMAIN}` domain — title, task counts, any blocking decisions 2. **Pending tasks for this repo** — from local `workplans/` files (Step 2) plus any state hub tasks with `[repo:{REPO_SLUG}]` in their title 3. **Goal guidance** — if the summary contains a `goal_guidance` key, act on it: - **`needs_workplan`** entries: for each active repo goal with no linked workstream, surface it as the top suggested action — *"Repo goal '{title}' has no workplan yet. Suggest: create workplans/{REPO_SLUG}-WP-NNNN-.md and register a workstream with repo_goal_id='{goal_id}'"*. Treat this as higher priority than continuing existing work unless Bernd says otherwise. - **`alignment_warnings`** entries: if active workstreams exist but are not linked to the current repo goal, name the most recently active one and note: *"Current work on '{recent_workstream_title}' may not be aligned with the active goal '{active_goal_title}'. Continue unless you hear otherwise — but flag it."* 4. **Suggested next action** — the highest-priority open item across all sources, with goal alignment taken into account 5. **SBOM status** — is `last_sbom_at` set for this repo? If not, note it as a gap If there are no workstreams at all: follow the First Session Protocol below. **During work:** - Use `record_decision()` for any decision that affects direction or dependencies. - Use `add_progress_event()` for notable events (milestones, blockers, insights). - Use `resolve_decision()` to close a decision once the choice is made. > **Design boundary:** The State Hub is a *read model*. Two write operations are > permanently sanctioned: **Resolving Decisions** and **Suggesting Next Steps**. > The bootstrap tools (`create_workstream`, `create_task`, `update_task_status`) > are only for First Session Protocol. Formal work structure — workplans, tasks — > belongs in the domain repo as files (ADR-001), not managed through the hub alone. **At the end of every session:** - Call `add_progress_event()` with a summary of what was accomplished or decided. Include `topic_id: {TOPIC_ID}` and the relevant `workstream_id`. --- ### Repo Boundary Rule This agent is responsible for files **in this repo only**. - **Do not** write files or make commits in any other repository - **Do not** create workplan files in other repos on their behalf - When you identify work for another registered repo (**ecosystem todo**): create a state hub task with `[repo:]` in the title — the other repo's agent will see it at session start and create its own workplan - When you identify work for an upstream repo (**third-party todo**): create a contribution artifact in `contrib/` and register it Terminology and workflows: `http://localhost:3000/docs/inter-repo-communication` --- ### First Session Protocol Triggered when `get_domain_summary("{DOMAIN}")` shows **no workstreams** for the `{DOMAIN}` topic. The project is registered but work has not yet been structured. **Step 1 — Understand the project (read, don't write)** - `~/the-custodian/canon/projects/{DOMAIN}/project_charter_v0.1.md` — purpose, scope - `~/the-custodian/canon/projects/{DOMAIN}/roadmap_v0.1.md` — planned phases - Scan the repo root: README, directory structure, existing code or docs **Step 2 — Survey in-progress work** - Look for TODOs, open branches, half-finished files, notes - Note what is already done vs. what is clearly started but incomplete **Step 3 — Propose workstreams to Bernd** Propose 1–3 workstreams — each a coherent strand of work lasting weeks to months, named clearly, anchored to a roadmap phase. **Wait for approval before creating.** **Step 4 — Create workplan file first, then DB record** Per ADR-001, work items originate as files in the repo: ``` workplans/-WP-NNNN-.md ← write this first ``` Then register in the hub: ``` create_workstream(topic_id="{TOPIC_ID}", title="...", owner="...", description="...") create_task(workstream_id="", title="...", priority="high|medium|low") ``` **Step 5 — Record the setup** ``` add_progress_event( summary="First session: structured {DOMAIN} work into N workstreams, M tasks", event_type="milestone", topic_id="{TOPIC_ID}", detail={"workstreams": [...], "tasks_created": M} ) ``` --- ### Workplan Convention (ADR-001) Work items MUST originate as files in this repo before being registered in the hub. **File location:** `workplans/-.md` **Frontmatter required:** `id`, `type: workplan`, `domain`, `repo`, `status`, `state_hub_workstream_id`, `state_hub_task_id` (per task) When another domain's agent identifies work for this repo, it creates a state hub task with `[repo:{REPO_SLUG}]` in the title (an **ecosystem todo**). You will see it at session start via `get_domain_summary("{DOMAIN}")`. When you pick it up, create the corresponding workplan file in `workplans/` (ADR-001) and begin work. --- ### Contribution Tracking Track upstream contributions in `contrib/` — bug reports (BR), feature requests (FR), extension-point proposals (EP), upstream PRs (UPR). ``` contrib/ bug-reports/ # br-YYYY-MM-DD--org--repo--slug.md feature-requests/ # fr-YYYY-MM-DD--org--repo--slug.md extension-points/ # EP-{DOMAIN}-NNN--org--repo--slug.md upstream-prs/ # upr-YYYY-MM-DD--org--repo--slug.md ``` Templates: `~/the-custodian/canon/standards/contrib-templates/` Convention: `~/the-custodian/canon/standards/contribution-convention_v0.1.md` ``` register_contribution(type="br|fr|ep|upr", title="...", target_org="...", target_repo="...", body_path="contrib/...", related_workstream_id="") update_contribution_status(contribution_id="", status="submitted") ``` --- ### SBOM After updating dependencies, re-ingest the SBOM: ```bash cd ~/the-custodian/state-hub make ingest-sbom REPO={REPO_SLUG} SCAN=1 REPO_PATH=$(pwd) ``` Check compliance: `http://localhost:3000/repos` Standard: `~/the-custodian/canon/standards/sbom-convention_v0.1.md` --- ### Quick Reference `~/the-custodian/state-hub/mcp_server/TOOLS.md` — compact MCP tool reference