Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
1dd286e
docs site: address Karen's feedback — simplify, dedupe, fix rendering
gcko Jun 12, 2026
11edebf
docs site: prime "simple" on Home; ban AI-writing tells
clkao Jun 12, 2026
0476f80
docs site: fold comm-officer polish into Home lede and voice rule
clkao Jun 12, 2026
0e1f704
docs site: Home uses plain "work items", defers entity to Concepts
clkao Jun 12, 2026
2f0ff26
docs site: Home next-steps lead with the two entry paths, drop redund…
clkao Jun 12, 2026
e0726d4
docs site: tighten survey bullet verb (comm-officer polish)
clkao Jun 12, 2026
891b2a5
docs site: drop Contributing pointers from Home
clkao Jun 12, 2026
7476f6d
docs site: discreet "for agents: llms.txt" footer link
clkao Jun 12, 2026
0bc795a
docs site: add pooled llms-full.txt, scope llms.txt to product docs
clkao Jun 12, 2026
482a5cb
docs site: sweep prose AI tells across the docs
clkao Jun 12, 2026
e718e73
docs site: fold authoring directive into AGENTS.md; drop Contributing…
clkao Jun 12, 2026
ef9fed2
docs site: trim Advanced to the abstract mechanism, fold tracker into…
clkao Jun 12, 2026
6e4afe6
docs site: trim Reference to a map, defer the spec to --help and the …
clkao Jun 12, 2026
7e5b4a9
docs site: merge Home into Get started; fix landing nav links
clkao Jun 12, 2026
8d1fa1a
docs site: stage-lifecycle leads with the example, then the properties
clkao Jun 12, 2026
d463dc2
docs site: contributing stub under Reference, points proposals to issues
clkao Jun 12, 2026
2afb7fd
docs: add top-level CONTRIBUTING.md; link it from the docs nav
clkao Jun 12, 2026
d0c62b6
docs site: comm-officer polish on Home and Install
clkao Jun 12, 2026
cc47360
docs site: tighten Home lede gate sentence (comm-officer)
clkao Jun 12, 2026
1c009df
docs site: tighten first-launch lede, split dense survey-report sentence
clkao Jun 12, 2026
da31723
docs site: comm-officer polish on first-launch
clkao Jun 12, 2026
cbdd457
docs site: first-workflow defines terms at first use, drops front-loa…
clkao Jun 12, 2026
a6a8199
docs site: comm-officer polish on first-workflow
clkao Jun 12, 2026
c307268
docs site: operating-model drops page-announce sentence, parallel nex…
clkao Jun 12, 2026
8d541cc
docs site: comm-officer polish on operating-model
clkao Jun 12, 2026
1288933
docs site: workflows-and-entities leads entity section with file form…
clkao Jun 12, 2026
36d6b84
docs site: comm-officer polish on workflows-and-entities
clkao Jun 12, 2026
49167a3
docs site: stage-lifecycle owns the stage-property detail; dedupe fla…
clkao Jun 12, 2026
f3a4df6
docs site: comm-officer polish on stage-lifecycle
clkao Jun 12, 2026
52c4a42
docs site: gates-and-decisions cuts page-announce lede and redundant …
clkao Jun 12, 2026
3a020a0
docs site: comm-officer polish on gates-and-decisions
clkao Jun 12, 2026
cdb7018
docs site: gates-and-decisions gains related links
clkao Jun 12, 2026
f5ffa8b
docs site: worked-example opens with the entity, drops internal Comma…
clkao Jun 12, 2026
f498537
docs site: commission plain-register name pushback, dedupe tighten-th…
clkao Jun 12, 2026
d44c01a
docs site: comm-officer polish on worked-example; spell out definitio…
clkao Jun 12, 2026
6a26e50
docs site: comm-officer polish on commission
clkao Jun 12, 2026
ec53577
docs site: survey drops duplicated read-only claim and roadmap aside
clkao Jun 12, 2026
a6cc0f3
docs site: operating aligns gate-call names with gates-and-decisions
clkao Jun 12, 2026
967f2fc
docs site: comm-officer polish on survey
clkao Jun 12, 2026
d3935e6
docs site: comm-officer polish on operating
clkao Jun 12, 2026
bcff4c7
docs site: comm-officer polish on commission follow-up and debrief-an…
clkao Jun 12, 2026
7605ac2
docs site: worked-example restores the payoff sentence comm-officer f…
clkao Jun 12, 2026
3d40f19
docs site: commission recasts pilot sentence without prose em-dash (A…
clkao Jun 12, 2026
42a954f
docs site: survey dedupes same-turn phrasing introduced by late polish
clkao Jun 12, 2026
0d47519
docs site: install is just install — drop launcher/plugin split and C…
clkao Jun 12, 2026
392ff6a
docs site: fold survey into first-launch; drop the Running workflows …
clkao Jun 12, 2026
634db4b
docs site: user-visible first, mechanism light — directive rule + fir…
clkao Jun 12, 2026
b906445
docs site: mechanism-light sweep — worktree mechanics, feedback routi…
clkao Jun 12, 2026
b65e286
docs site: install tabs are binary-only and short; codex/pi setup mov…
clkao Jun 12, 2026
832b4ae
docs site: install replaces keep-in-sync with one-line Troubleshootin…
clkao Jun 12, 2026
5aade2f
docs site: point install.sh and all GitHub source links at main, not …
clkao Jun 12, 2026
9cc6983
docs site: no role names before their introduction — install and Welc…
clkao Jun 12, 2026
ee68473
docs site: install drops build-from-source and setup-alternatives; ty…
clkao Jun 12, 2026
7711c96
docs site: agents footer points at llms.txt itself, not the build tha…
clkao Jun 12, 2026
b7114d0
docs site: install honest pass — plain words for the agent, survey pa…
clkao Jun 12, 2026
aab653b
docs site: install per captain's shape — launch directly option, Skil…
clkao Jun 12, 2026
d1279e0
docs site: install Skills sentence positive form (comm-officer, partial)
clkao Jun 12, 2026
6ee9b43
docs site: sandbox reference — safehouse is macOS-only, link agent-sa…
clkao Jun 12, 2026
a9a44b0
docs site: sandbox reference is just the table — Supported sandboxes
clkao Jun 12, 2026
12737fe
docs site: Troubleshooting is just the command
clkao Jun 12, 2026
c345166
docs site: codify the captain's editing lessons into the authoring di…
clkao Jun 12, 2026
0b154c7
docs site: Get started redone per the codified directive — reader-sea…
clkao Jun 12, 2026
051a9b0
docs site: Your first launch becomes Survey your project — launch liv…
clkao Jun 12, 2026
9c8d1f7
docs site: install Next offers both entries — survey report or first …
clkao Jun 12, 2026
60396b5
docs site: survey opens with the skill and agentsview; report is the …
clkao Jun 12, 2026
852536b
docs site: survey offer section named from the reader's seat; drop cr…
clkao Jun 12, 2026
734a965
docs site: first-workflow led by a real dev-workflow commission examp…
clkao Jun 12, 2026
9b5ff96
docs site: first-workflow sample without em-dashes, sd-b32, gate revi…
clkao Jun 12, 2026
1ac3f8e
docs site: codify round-two lessons — payoff links, reader-angle head…
clkao Jun 12, 2026
3a6f363
docs site: operating-model says what the first officer does for you; …
clkao Jun 12, 2026
3c98ad8
docs site: operating-model splits shaping (product judgment) from own…
clkao Jun 12, 2026
1f326b2
docs site: first-workflow closes with the session loop, debrief self-…
clkao Jun 12, 2026
6ab9858
docs site: first-workflow links serialized state to the concept page,…
clkao Jun 13, 2026
69b80e1
docs site: concepts pages to the current standard — payoff ledes, no …
clkao Jun 13, 2026
edd7848
docs site: workflows-and-entities — FO edits the README for you, dev …
clkao Jun 13, 2026
67d0e77
docs site: stage chain as a mermaid diagram; typical dev workflow, fe…
clkao Jun 13, 2026
cd3e645
docs site: stage declarations as capabilities, not a field table — th…
clkao Jun 13, 2026
816cacf
docs site: worktree section is one sentence of what happens, no trade…
clkao Jun 13, 2026
a71f00c
docs site: gates annotated in the stage diagram; gate links to the co…
clkao Jun 13, 2026
d1f3f48
docs site: gate stages marked by gold border in the diagram, caption …
clkao Jun 13, 2026
f6cb32e
docs site: gates leads with delegation; concrete reject sample replac…
clkao Jun 13, 2026
ec38c43
docs site: gates polish from comm-officer review (5 of 7 accepted)
clkao Jun 13, 2026
c3aacf0
docs site: rejection bounces are automatic — gate reaches you on pass…
clkao Jun 13, 2026
1e06842
docs site: Rejections heading; returns to you; semicolon instead of d…
clkao Jun 13, 2026
e67278a
docs site: audit section answers how it differs from validation; lens…
clkao Jun 13, 2026
7065d44
docs site: adversarial review is built in (in-stage or detached); len…
clkao Jun 13, 2026
89a1651
docs site: gates audit paragraph polish (comm-officer, 2 of 4 accepte…
clkao Jun 13, 2026
a38dd97
docs site: drop the worked-example page — it mixed sprint machinery i…
clkao Jun 13, 2026
2ab605a
docs site: stage-lifecycle notes built-in adversarial review beside t…
clkao Jun 13, 2026
8fb95b2
docs site: codify round-three lessons and the per-paragraph revision …
clkao Jun 13, 2026
dbe59a0
docs site: fresh: true means adversarial review — both concept pages …
clkao Jun 13, 2026
b27edcb
docs site: recast operating.md as touchpoints — the agent is the inte…
clkao Jun 13, 2026
e787c63
docs site: commission.md deduped against first-workflow — capabilitie…
clkao Jun 13, 2026
3a62ec2
docs site: frontmatter-contract — replace dead entity-frontmatter anc…
clkao Jun 13, 2026
94ac20e
docs site: commission.md — payoff lede, commission as actor, generate…
clkao Jun 13, 2026
be2199f
docs site: rename Operating a workflow to Operate a workflow — impera…
clkao Jun 13, 2026
d902a91
docs site: first-workflow close — commission link at point of need, O…
clkao Jun 13, 2026
467c9db
docs site: commission.md trimmed — archetypes named, pilot duplicatio…
clkao Jun 13, 2026
1ae5ee0
docs site: split debrief-and-refit — Debrief a session (friction reco…
clkao Jun 13, 2026
b37727e
docs site: codify session lessons — heading-dedupe alarm, journey-own…
clkao Jun 13, 2026
f1bc3b9
docs site: split Multiple workflows out of split-root-state — coordin…
clkao Jun 13, 2026
452f7eb
docs site: mods page — payoff lede, reader-seat hooks, exact-format s…
clkao Jun 13, 2026
d5497cb
docs site: mods lede — the hook mechanism framing (captain), plus tri…
clkao Jun 13, 2026
82852e8
docs/dev: track the comm-officer standing-teammate mod — the docs cit…
clkao Jun 13, 2026
b391c24
docs site: linkify comm-officer to its mod file on main
clkao Jun 13, 2026
77445b7
docs site: mods lede — mod behavior could be stages, factored out bec…
clkao Jun 13, 2026
74ce0fc
docs site: external-tracker bridge to its own page — intake by asking…
clkao Jun 13, 2026
3fba583
docs: frontmatter contract + mdschemas as SSOT; site links to it
clkao Jun 13, 2026
ed01893
docs site: frontmatter-contract page IS the contract; schemas are SSOT
clkao Jun 13, 2026
3861cf7
docs site: drop the duplicate stage diagram from the contract page
clkao Jun 13, 2026
90db73d
docs site: frontmatter-contract is a reference stub — schemas + field…
clkao Jun 13, 2026
8924d8f
docs site: external-tracker — frontmatter fields, not 'flat' (parser …
clkao Jun 13, 2026
1f17ed3
docs site: frontmatter-contract — two subsections (README, entity), r…
clkao Jun 13, 2026
8017d91
docs site: command-reference — split the Workflow group by audience
clkao Jun 13, 2026
e5cf2f9
docs site: command-reference — section tables, agent-driven Workflow …
clkao Jun 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Contributing

Thanks for considering a contribution. Spacedock is early, so we encourage you to share proposals and improvements as [GitHub issues](https://github.com/spacedock-dev/spacedock/issues) rather than opening pull requests directly. That lets us discuss the direction before anyone writes code.
148 changes: 148 additions & 0 deletions docs/dev/_mods/comm-officer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
---
name: comm-officer
description: Standing prose-polishing teammate for this workflow
version: 0.1.0
standing: true
---

# Comm Officer

A standing teammate for prose polish. Kept alive for the captain session once spawned. First FO to boot into a team missing this member spawns it; subsequent workflows in the same session detect it and skip.

## Hook: startup

Before entering the normal event loop, check whether the current team (`~/.claude/teams/{team_name}/config.json` members list) contains a member named `comm-officer`.

- **If present:** log `comm-officer already alive, skipping spawn` and proceed. First-boot-wins.
- **If absent:** spawn using the configuration below, then proceed.

Spawn configuration:

- `subagent_type: general-purpose`
- `name: comm-officer`
- `team_name: {current team}`
- `model: sonnet`
- `prompt`: everything in the `## Agent Prompt` section below, verbatim.

The spawn is fire-and-forget. Do NOT block on the teammate's first idle notification before continuing to normal dispatch. Ensigns will route to it on demand when they need polish; if it's not ready yet when the first request arrives, Claude Code queues the message.

## Hook: shutdown

On captain-initiated session teardown (e.g., `/spacedock shutdown-all`, or FO explicit end-of-session), send `{"type":"shutdown_request", "reason":"session ending"}` to `comm-officer`. If the session ends uncleanly (captain closes the window, process terminates), Claude Code tears down the team and the teammate with it; no explicit shutdown needed.

## Routing guidance (for FO and ensigns)

**Scope — what `comm-officer` polishes:**

- **Drafts about to be presented to the captain** — PR bodies, gate review summaries, debrief content, long stage report narratives before they're shown.
- **Entity file contents** — Problem Statement / Proposed Approach / narrative sections of entity bodies before they're committed.

**Scope — what `comm-officer` does NOT polish:**

- Direct chat replies to the captain during a live conversation. Conversational latency and voice authenticity matter more than polish; the small latency and rewrite tax is not worth it.
- Short operational statuses (`pushed to origin`, `tests green`, `PR opened at …`).
- Tool-call outputs, commit messages, transient logs.

If in doubt, ask: "Is this a *draft* that will live somewhere the captain reviews deliberately?" If yes, consider polishing. If the captain is reading it in a live conversation turn, do not polish.

**Four usage patterns (mirrors Claude Code's read/Edit/Write tool shapes):**

1. **Text passthrough** — caller sends prose as message body; teammate replies with polished text + notes block; caller does the placement. Use when polished text will be assembled into a larger structure (PR body, multi-part message, live reply to captain).
2. **File-in-place** — caller includes exact phrase `polish this file` + absolute path; teammate reads the file, polishes it, writes it in place, replies with a confirmation + notes. Use when a file already exists on disk with unpolished prose to tighten.
3. **Polish-and-write** (mirrors the Write tool) — caller sends header line `polish and write to {absolute_path}:` followed by the raw prose; teammate polishes, `Write(file_path, polished_content)` (creates or fully overwrites), replies with confirmation + notes. Use when creating a new file whose content IS polished prose (e.g., a draft narrative block).
4. **Polish-and-edit** (mirrors the Edit tool) — caller sends header line `polish and edit {absolute_path}:` followed by two labeled blocks: `old_string:` (exact text to replace, unchanged) and `new_string:` (raw prose to polish then place); teammate polishes new_string, `Edit(file_path, old_string, polished_new_string)`, replies with confirmation + notes. Use when splicing polished prose into an existing file at a specific location (marker replacement, section swap, appending to an anchor).

Patterns 3 and 4 remove the caller's copy-paste step between "get polished text back" and "write it somewhere." Pattern 1 stays the right choice when the caller needs to review polished text before committing it anywhere.

**Hard rules:**

- MUST NOT block on `comm-officer` reply. If no response within 2 minutes or the teammate is unavailable, proceed with un-polished text and note the fallback in the stage report. Polish is best-effort, not load-bearing.
- MUST NOT forward captain directives or sensitive context (API keys, internal URLs, unreleased plans) to `comm-officer` — only the prose to be polished.

## Routing Usage

Four caller patterns (mirror Claude's Read/Edit/Write tool shapes). Pick the pattern first, then format the SendMessage body to match.

1. **Text passthrough** (default — no trigger phrase) — send raw prose as the message body. Reply: polished text first, then `---` + `**Polish notes**` block. Caller places the result.
2. **File-in-place** — send the exact phrase `polish this file` with an absolute path. Teammate Edits/Writes the file in place. Reply: one-line receipt + `---` + `**Polish notes**`.
3. **Polish-and-write** — send header `polish and write to {absolute_path}:` followed by raw prose. Teammate Writes the polished prose to that path (create-or-overwrite). Reply: one-line receipt + `---` + `**Polish notes**`.
4. **Polish-and-edit** — send header `polish and edit {absolute_path}:` followed by labeled blocks `old_string:` (unchanged anchor) and `new_string:` (raw prose to polish). Teammate polishes `new_string` and Edits the file at that anchor. Reply: one-line receipt + `---` + `**Polish notes**`.

Notes block fields: `Mode`, `Guide applied`, `Changes`, `Flagged for review`. Absolute paths required for patterns 2-4; no inferred targets. Best-effort non-blocking — proceed with un-polished content if no reply within 2 minutes.

## Agent Prompt

You are the session's communications officer. Your job is to polish prose for clarity and concision, and return it quickly.

**Your first action on spawn:** check whether the `elements-of-style:writing-clearly-and-concisely` skill is available in your tool surface (via ToolSearch or equivalent). Then SendMessage to `team-lead` with EXACTLY ONE of these two online messages:

- If available: `comm-officer online, elements-of-style:writing-clearly-and-concisely skill found, ready for polish requests.`
- If missing: `comm-officer online. WARNING: elements-of-style:writing-clearly-and-concisely skill NOT available in my tool surface — I will apply Strunk & White principles directly, polish quality will be reduced. The captain can install the skill via the elements-of-style plugin and respawn me for full quality. Ready for polish requests in degraded mode.`

Then idle. Do NOT start polishing anything until you receive a polish request.

If the skill is available, invoke it for polish. Read the skill's reference material in full on first use this session, then stay resident. If the skill is not available, apply Strunk & White principles from your training directly.

Four patterns you'll receive (mirroring Claude Code's Read/Edit/Write tools):

1. **Text passthrough** — caller sends prose as the message body with no mode-trigger phrase. Reply with polished prose + a short notes block. Never touch files in this mode.
2. **File-in-place** — caller explicitly says `polish this file` with an absolute path. You MAY `Edit` or `Write` the file's existing prose sections in place. Reply with confirmation + notes. Do NOT enter this mode unless the caller used that exact trigger phrase.
3. **Polish-and-write** — caller's message opens with the header `polish and write to {absolute_path}:` followed by raw prose. Polish the prose, then use the `Write` tool with that absolute path and your polished content (full-file create-or-overwrite). Reply with confirmation + notes. Only enter this mode if the header is present verbatim.
4. **Polish-and-edit** — caller's message opens with the header `polish and edit {absolute_path}:` followed by two labeled blocks: an `old_string:` block (exact text to locate, unchanged) and a `new_string:` block (raw prose you will polish and place). Polish only the `new_string` prose. Then use the `Edit` tool with that absolute path, the `old_string` you received (unchanged), and your polished `new_string`. Reply with confirmation + notes. Only enter this mode if the header is present verbatim.

**Boundary rules for all file-writing modes (2, 3, 4):**

- The caller specifies the write target via absolute path. You do NOT decide where to write; your only decisions are polish choices on the prose.
- If the absolute path is missing, ambiguous, or outside the current project tree, reply with a one-line clarification request and take no action.
- If the `Edit` tool's `old_string` is not found in the target file, reply naming the failure and take no further action — do not guess.
- Keep reply bodies brief for these modes (see reply format below). The file is the deliverable; your message is a receipt.

**How to reply — hard rules, not suggestions:**

- Your reply body IS the deliverable. Put the polished prose as the FIRST thing in the message, with no preamble. Do NOT describe what you did — your work IS the reply.
- Each SendMessage is a discrete standalone message. There is no "inline above", no "attached", no "as shown earlier". If content isn't in the body of THIS specific message, it does not exist.
- Never send a summary-only confirmation message instead of the polished text. If you're not ready to deliver polished text yet, don't send anything.
- Always state in the `Guide applied` field which style source you used. If the `elements-of-style:writing-clearly-and-concisely` skill is unavailable, say `none — plain Strunk (skill not available)` explicitly — never silently degrade.

You are a **standing teammate**:

- Stay live. Go idle between tasks. Do NOT send `shutdown_request` to the team-lead — the captain or FO initiates teardown, not you.
- Between polish tasks, you do nothing. No speculative edits. No file exploration. No unsolicited skill invocations.
- If you receive a message you don't understand, reply asking for clarification in one short line. Don't guess.

Your reply format for text-passthrough:

```
{polished text}

---
**Polish notes**
- Guide applied: {name or "none — plain Strunk" if no project guide applies}
- Changes: {1-3 bullets of the biggest edits}
- Flagged for review: {anything you changed that might warrant human eyes, or "nothing"}
```

Your reply format for file-in-place / polish-and-write / polish-and-edit:

```
{Polished / Wrote / Edited} {absolute path}. {N} lines {changed/written}.

---
**Polish notes**
- Mode: {file-in-place | polish-and-write | polish-and-edit}
- Guide applied: {name or "none"}
- Changes: {1-3 bullets}
- Flagged for review: {anything}
```

Keep polish notes under 80 words total. If you're tempted to write more, that's a sign the change was too big — flag it for human review instead of making it.

Your default is light-touch. Preserve the caller's voice, rhythm, and technical vocabulary. Cut empty words, tighten sentences, fix clear grammar errors. Do NOT rewrite for style unless the caller explicitly asks.

When a caller's text contains domain jargon (project names, internal terms, acronyms), preserve it unchanged unless you can prove it's a typo. Ask before translating jargon.

**Preserve disambiguating attributions and parenthetical modifiers.** Parentheticals like "(in another user's workflow)", "(proposed by CL last session)", "(v2 after the rebase)" are usually load-bearing — they tell the reader which instance of a thing is being discussed. Collapsing them into implicit context drops signal. Keep them. If a parenthetical truly is filler (e.g., "(as mentioned earlier)"), cut it and flag the cut.

**Do not change semantic qualifiers silently.** "The proposed comm-officer" is not the same as "the comm-officer." "The draft summary" is not "the summary." If you change a noun's qualifier, note it in the Changes bullets.

If a voice guide applies to this project (a `CLAUDE.md`, `tone-preferences.md`, or equivalent), load it on first use and defer to it when it conflicts with Strunk. The captain or dispatching ensign will tell you which guide(s) are in scope for this session — don't go searching on your own.
166 changes: 166 additions & 0 deletions docs/schema/entity.mdschema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
{
"version": "1.0",
"target": "entity",
"applies_to": {
"filename_pattern": "<slug>.md or <slug>/index.md",
"required_at": "workflow_root_or_archive"
},
"frontmatter": {
"strict_canonical": true,
"permissive_additions": true,
"always_present": [
"id",
"title",
"status",
"score",
"source",
"worktree"
],
"optional_canonical": [
"pr",
"started",
"completed",
"verdict",
"mod-block",
"archived",
"issue"
],
"fields": {
"id": {
"type": "string",
"conditional": [
{
"when": {
"workflow.id-style": "sequential"
},
"rule": "non-negative integer rendered as a string",
"pattern": "^[0-9]+$"
},
{
"when": {
"workflow.id-style": "sd-b32"
},
"rule": "24-character Spacedock Base32 ID; legacy numeric IDs are warn-only for mixed workflows",
"pattern": "^[0123456789abcdefghjkmnpqrstvwxyz]{24}$",
"legacy_numeric_severity": "warn"
},
{
"when": {
"workflow.id-style": "slug"
},
"rule": "empty string; slug is the effective identity"
}
]
},
"title": {
"type": "string"
},
"status": {
"type": "string",
"sentinel_on_unknown": 99,
"should_match": "workflow.stages.states[].name",
"unknown_severity": "warn"
},
"score": {
"type": "numeric_string",
"coerce_empty": "last",
"coerce_invalid": 0,
"invalid_severity": "warn"
},
"source": {
"type": "string"
},
"worktree": {
"type": "string",
"semantics": "path relative to git root when non-empty; empty means no active worktree"
},
"pr": {
"type": "string"
},
"started": {
"type": "iso8601"
},
"completed": {
"type": "iso8601"
},
"verdict": {
"type": "string",
"conventional": [
"PASSED",
"REJECTED"
],
"invalid_severity": "warn"
},
"mod-block": {
"type": "string",
"pattern": "^[^:]+:[^:]+$",
"invalid_severity": "warn",
"semantics": "when non-empty, terminal advancement is refused unless forced"
},
"archived": {
"type": "iso8601"
},
"issue": {
"type": "string"
}
},
"custom_fields": {
"policy": "preserve_unknown",
"no_reserved_prefix": true,
"observed": {
"blocked-on": {
"type": "string",
"required": false,
"semantics": "upstream dependency reference that blocks entity progress"
},
"blocked-reason": {
"type": "string",
"required": false,
"semantics": "human-readable reason for the blocked-on dependency"
},
"depends": {
"type": "string",
"required": false,
"semantics": "legacy dependency reference preserved from archived entities"
}
}
}
},
"body": {
"required_opening": "problem-statement paragraph before any heading",
"recognized_sections": [
"## Acceptance criteria",
"## Test plan",
"## Stage Report: <stage_name>",
"### Feedback Cycles"
],
"stage_report_validation": "none"
},
"invariants": [
{
"id": "id_uniqueness",
"rule": "per id-style, ids unique across active + archived"
},
{
"id": "slug_uniqueness",
"rule": "slugs unique across active + archived"
},
{
"id": "mod_block_guard",
"rule": "mod-block non-empty AND status terminal -> refuse without --force"
},
{
"id": "merge_hook_invariant",
"rule": "workflow has any _mods/*.md with ## Hook: merge AND pr empty AND mod-block empty -> refuse terminal without --force"
},
{
"id": "two_step_audit",
"rule": "single --set cannot both clear mod-block and advance to terminal"
},
{
"id": "pr_mirror",
"rule": "writing pr on worktree-backed entity also writes pr to canonical copy; no other field mirrors"
}
],
"known_corpus_failures": {}
}
Loading
Loading