---
name: idc-schema-check
description: 'Use during Plan board admission to mechanically validate that an issue body is a complete, self-sufficient goal contract before it goes on the board.'
---
# idc-schema-check

The mechanical gate Plan runs on every issue body before admission (`WORKFLOW.md §3.2`,
§4.2). An issue is the glass-wall contract a builder works **cold**, so it must carry the
whole 6-element goal contract plus declared boundaries, dependencies, and trace. This is the
*only* structural plan review besides matrix deconfliction (`idc:idc-matrix-analysis`) — v2
deleted the multi-pass plan-review suite; content defects surface cheaply downstream as a
recirculation.

The board carries two shapes, told apart by the `Stage:` field, and the check validates each
on its own terms (`idc:idc-tracker-github` §schema).

## Buildable issue body (`Stage: Buildable`, or no Stage on a legacy 4-field repo)

```
GOAL: <single observable end-state>
VERIFICATION SURFACE: <runnable commands + what passing looks like — real functional tests>
CONSTRAINTS: <what must not regress; the no-punt rule>
BOUNDARIES: touch <owned surfaces> / off-limits <…>
ITERATION POLICY: record-and-vary
BLOCKED-STOP: <halt conditions + attempt ceiling>
ASSUMPTIONS: <inferred, vetoable>
---
Dependencies: <native blocked-by links>
Trace: <pillar file · consideration · PRD section>
```

## Pointer item body (`Stage: Consideration` | `Stage: Planning`)

An upstream artifact (consideration, in-flight plan, pillar) rides the board as a lightweight
pointer — a **reference + labels only**, never a copy of canonical file content:

```
Stage: Consideration            # or Planning
File: docs/considerations/<topic>.md   # the repo-file reference (source of truth)
Phase: Phase <N>
Domain: <domain>
```

## The check

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/idc_schema_check.py" <issue-body.md>
```

It dispatches on `Stage:`. For a **buildable** body it requires every labelled contract
element to be present, `GOAL` and `VERIFICATION SURFACE` to be non-empty, and `BOUNDARIES` to
declare both `touch` and `off-limits` (the deconfliction output). For a **pointer** body it
requires a `File:` repo-file reference plus `Phase`/`Domain`, and **rejects** any
goal-contract marker (`GOAL`/`VERIFICATION SURFACE`) — a pointer that duplicates canonical
content collapses the distinction. Exit non-zero with a reason list otherwise. It checks
**structure, not prose** — genuineness of the verification surface (real tests vs shallow) is
enforced later by the review engine's test-genuineness dimension at Build.

## Authority boundaries

- Validates issue-body structure only. Never admits the issue (the orchestrator does, via
  `idc:idc-tracker-adapter`), never writes canonical docs, never spawns teammates.
