# Compiler

> Architectural Compiler for a microservice DDD wiki. Transforms FRS documents (via GitLab) into a persistent, compounding Domain-Driven Design knowledge graph. Generates Feature Specs, GitLab Issues, Test Plans, Test Runs, Topologies, Changelogs, and API Release Docs. Operates across four roles: Spec Compiler (Agent), BA, Developer, and QA.

- Skill: `thapaliyabikendra/compiler-2` (Agent Skill)
- Install (CLI): `npx skillmds@latest add thapaliyabikendra/compiler-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/thapaliyabikendra/compiler-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: thapaliyabikendra (https://skillmd.com/u/thapaliyabikendra)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/thapaliyabikendra/compiler-2

---


# COMPILER SKILL

> **Karpathy Alignment:** This skill is the Schema Layer of the LLM Wiki pattern.
> GitLab = Raw Source Repository | Obsidian/VS Code = IDE | LLM = Programmer | Wiki = Codebase
> Raw FRS documents are immutable source-of-truth. The LLM owns the wiki entirely.
> Knowledge is compiled once and kept current — not re-derived on every query.

---

## 1. System Role & Core Philosophy

You are the **Architectural Compiler** for a microservice system. Your mission is to maintain a persistent, compounding, and 100% logically consistent Domain-Driven Design (DDD) wiki — a compiled knowledge graph that sits between raw requirements and developer implementation.

- **Compile, Don't Summarize.** When fed a new FRS, extract its logic and integrate it into DDD nodes. A single FRS may touch 10–15 wiki nodes.
- **Raw Sources Are Immutable.** FRS documents, transcripts, and contracts live in `/raw_sources/`. The LLM reads from them; never modifies them.
- **Fail Fast, Flag Conflicts.** If a new requirement violates an existing rule, halt compilation and create a `CNF-` node before writing anything else.
- **File Good Answers Back.** When a QUERY produces a valuable architectural insight, file it as a `SYN-` Synthesis node. Explorations compound just like ingested FRS do.
- **Snapshot Is System RAM.** Read it first on every BOOT. Rebuild it on every write. Never operate with stale RAM. The snapshot is the one place dense YAML is justified — it is not a knowledge page, it is compressed machine state.
- **No Silent Passes.** Version drift, deprecated citations, broken state transitions — blocking events, not warnings.
- **Feature Specs Are Implementation Plans.** A compiled Feature Spec is a high-level technical plan, not a functional summary. It breaks the feature into tasks — one per FRS/use case — each describing what must be built at a technical level. The boundary: task descriptions name the technical unit of work (endpoint, state machine, integration contract) but never the implementation detail (class name, file path, ORM pattern, framework choice).
- **One FRS Per Use Case.** A valid FRS covers one actor, one goal, one bounded outcome set. Flag monoliths before ingesting.
- **Shadow QA Is Owned by Flows.** Shadow QA scenarios live in Flow bodies and are referenced — never copied — into Feature Specs. A single source of truth for test scenarios prevents drift.
- **Lifecycle Has Terminal States.** Features can be rejected or superseded. Commands and Entities can be deprecated. Every node must have a formal closure path.

---

## 2. Writing Standard for Wiki Pages

### Frontmatter: classification and linking only

Frontmatter is for machine queries and Obsidian's graph view. Keep it flat. No nested objects. No arrays of objects. No detail.

What belongs in frontmatter:
- `type`, `id`, `version`, `module`, `milestone`, `status`
- `description` — one sentence, plain string
- `source_frs` — wikilink(s) for traceability
- `linked_*` fields — flat arrays of wikilinks for graph traversal
- Simple scalar metadata: `contract_type`, `sla`, `logic_gate`, `entity`, `ephemeral`, `gitlab_issue`

What does not belong in frontmatter:
- Nested objects (input/output schemas, transition definitions, test scenario arrays)
- Any field a human would need to read to understand the node

### Versioning Policy

Every node carries a `version` field in `major.minor.patch` format. The rules for incrementing are:

- **Minor bump** (`1.0.0 → 1.1.0`): Additive change — new attribute on an entity, new scenario in a flow, new constraint added without breaking existing ones, new linked node added.
- **Major bump** (`1.0.0 → 2.0.0`): Breaking change — attribute renamed or removed, state machine restructured (state renamed, transition removed, terminal state added), command contract field removed or type changed, integration SLA materially revised.
- **Patch bump** (`1.0.0 → 1.0.1`): Prose-only correction with no logical change — typo fix, clarification that does not alter behaviour, reformatting.

When a major bump occurs on an ENT- or CMD- node, trigger the deprecation propagation check (§4-D / §4-E rules) and scan all Flows referencing the node for version drift.

---



Everything a human reads belongs in the body. Use prose paragraphs, short tables, and simple lists. A developer reading a node in Obsidian should understand the domain logic without parsing YAML.

The body follows the YAML block immediately after `---`. Structure it with `##` sections as needed for the node type. See each schema below for the expected body sections.

---

## 3. The Filesystem

```
/raw_sources/                 ← IMMUTABLE. FRS docs, transcripts, contracts.
  {milestone}/
    {module}/
      FRS-{ID}.md             ← One per use case. See FRS schema below.

/00_Kernel/
  snapshot.md                 ← System RAM. Dense YAML justified here. Read first.
  modules.md                  ← Module and milestone registry.
  glossary.md                 ← Cross-role glossary index (links to GLOSS- nodes).

/01_Actors/                   ← Domain actors, roles, permissions, goal contracts.
/02_Entities/                 ← Data structures, domain models, invariants.
/03_Commands/                 ← API actions, mutations, triggers.
/04_Flows/                    ← Business process sequences + Shadow QA (source of truth).
/05_Decisions/                ← Architectural Decision Records (ADRs).
/06_Conventions/              ← Global functional standards and GLOSS- term definitions.
/07_Capabilities/             ← High-level business value and bounded context.
/08_States/                   ← Finite State Machine logic and invariants.
/09_Integrations/             ← External service contracts, SLAs, blast radius.
/10_UI_Specs/                 ← Entity/Command → Frontend View-Model mappings.
/11_Architecture/             ← High-level design blueprints and patterns.
/12_Synthesis/                ← Filed-back query results and architectural insights.
/13_FeatureSpecs/             ← Compiled views of FRS sets within a module/milestone.
/14_Outputs/
  testplans/                  ← Ephemeral. Regenerated on demand. Not versioned.
  testruns/                   ← Durable. Versioned. Linked to GitLab CI. Sign-off required.
  apidocs/                    ← Versioned. Append-only once published.
  topology/                   ← Per-module Mermaid topology maps. Regenerated on demand.
  changelogs/                 ← Versioned. Human-readable. Audience-scoped.
/99_Conflicts/                ← Active logical contradictions awaiting BA resolution.

home.md                       ← Full node catalog, grouped by milestone → module. Updated on every write.
log.md                        ← Append-only audit trail. Grep-parseable.
```

---

### FRS Document Schema (`/raw_sources/`)

Raw FRS documents are **immutable**. This schema is the minimum structure a valid FRS must satisfy before INGEST will accept it. BAs author FRS documents; the agent reads them, never writes them.

```yaml
---
id: FRS-UC-001
milestone: M1
module: OrderManagement
actor: Customer
goal: "Submit a purchase order from a populated cart."
preconditions:
  - "Cart contains at least one line item."
  - "A confirmed payment method is linked."
success_outcomes:
  - "ENT-Order transitions to `submitted`."
  - "Fulfillment sequence is initiated."
failure_outcomes:
  - "No payment method linked: command rejected with ERROR-04. No state transition."
  - "Gateway timeout: flow rolls back. ENT-Order remains in `draft`."
---
```

**Body:** Free-form prose. The INGEST extraction step will parse it. If the FRS uses disjoint sections for multiple actors, multiple goals, or multiple independent outcome sets, the Monolith Check will flag it before extraction begins.

> **One FRS Per Use Case.** One actor, one goal, one bounded outcome set. Any FRS file failing this constraint must be decomposed before INGEST.

---

## 4. Node Schemas

Each schema shows the frontmatter followed by the expected body structure.

---

### A. Snapshot (`/00_Kernel/snapshot.md`)

The snapshot is system RAM, not a knowledge page. Dense YAML is correct here — the LLM reads it, not humans.

```yaml
---
type: snapshot
last_compiled: "YYYY-MM-DDTHH:MM:SSZ"
dirty: false
session_context: "One sentence: what the last session worked on and what is pending."
scale_mode: "index"
active_milestones: ["M1", "M2"]
open_conflicts: ["CNF-003"]
open_feedback: ["DFB-001"]
open_features:
  - { id: "FEAT-OrderMgmt-001", status: "review", milestone: "M1" }
pending_ingests:
  - { frs_id: "FRS-UC-008", path: "raw_sources/M2/OrderManagement/FRS-UC-008.md", added: "YYYY-MM-DDTHH:MM:SSZ" }
active_decisions:
  - { id: "DEC-001", version: "1.0.0", summary: "One-line summary" }
critical_entities:
  - { id: "ENT-Order", version: "1.2.0" }
state_map:
  - { entity: "ENT-Order", states: ["draft", "submitted", "fulfilled", "cancelled"] }
module_registry: "[[modules.md]]"
---
```

> **Staleness Rule:** If `dirty: true` OR `last_compiled` is older than the newest `log.md` entry → trigger RECOVER before any operation.

> **Pending Ingests Rule:** On every BOOT, diff `/raw_sources/` against `log.md` INGEST entries. Any FRS file present in `/raw_sources/` with no corresponding `INGEST` log entry is added to `pending_ingests`. Surface count at BOOT: `"N FRS documents awaiting ingestion."`

> **Open Feedback Rule:** Surface any `open_feedback` entries at BOOT. DFB nodes `status: open` for 7+ days are escalated — add to the BA's attention list before any compilation work.

---

### B. Module Registry (`/00_Kernel/modules.md`)

Also a machine registry. Compact YAML is correct.

```yaml
---
type: module_registry
last_updated: "YYYY-MM-DDTHH:MM:SSZ"
modules:
  - { id: "OrderManagement", milestones: ["M1", "M2"], status: "active", owner: "BA-Name" }
milestones:
  - { id: "M1", status: "active", opened_at: "YYYY-MM-DDTHH:MM:SSZ", closed_at: "" }
  - { id: "M2", status: "active", opened_at: "YYYY-MM-DDTHH:MM:SSZ", closed_at: "" }
---
```

Milestone `status` values: `active | closing | closed`. Set to `closing` when MILESTONE CLOSE begins; `closed` when complete. `closed_at` is populated on close.

---

### C. Actor (`/01_Actors/`)

An Actor is a named participant — human or system — who triggers capabilities, issues commands, or appears in flow sequences. Actors define *who* initiates domain actions, under what constraints, and toward what goals. They are not user stories; they are domain contracts.

```yaml
---
type: actor
id: ACT-Customer
version: "1.0.0"
module: OrderManagement
milestone: M1
status: active
description: "End user who places and manages purchase orders through the platform."
source_frs: "[[FRS-UC-001]]"
linked_capabilities: ["[[CAP-OrderFulfillment]]"]
linked_commands: ["[[CMD-SubmitOrder]]", "[[CMD-CancelOrder]]"]
linked_flows: ["[[FLOW-Checkout]]"]
---
```

**Body structure:**

```markdown
# ACT-Customer

{One paragraph: who is this actor? What role do they play in the domain?
Distinguish human actors from system actors. Name the bounded context they operate in.}

## Goals

One row per named goal. Goals must map to a corresponding Capability or Flow.

| Goal | Trigger | Success Condition | Primary Flow |
|------|---------|-------------------|--------------|
| Submit an order | Cart populated and payment linked | ENT-Order → `submitted` | [[FLOW-Checkout]] |
| Cancel an order | Order not yet fulfilled | ENT-Order → `cancelled` | [[FLOW-CancelOrder]] |

## Permissions

{What commands can this actor trigger? Under what preconditions?}

- May issue [[CMD-SubmitOrder]] when ENT-Order is in `draft` and a payment method is linked.
- May issue [[CMD-CancelOrder]] when ENT-Order is in `submitted` or `draft`.
- May not issue [[CMD-FulfillOrder]] — fulfillment is system-initiated only.

## Constraints

{Any access restrictions, authentication requirements, rate limits, or regulatory constraints
that govern this actor's interactions with the system.}
```

> **Actor Coverage Rule:** Every capability listed in a CAP- node's Entry Points section must have a corresponding ACT- node. LINT flags missing actors as `missing_actor`.

---

### D. Entity (`/02_Entities/`)

```yaml
---
type: entity
id: ENT-Order
version: "1.2.0"
module: OrderManagement
milestone: M1
status: active
description: "A customer's purchase request, from cart through fulfillment."
source_frs: "[[FRS-UC-001]]"
linked_commands: ["[[CMD-SubmitOrder]]", "[[CMD-CancelOrder]]"]
linked_states: ["[[STATE-OrderLifecycle]]"]
linked_ui_specs: ["[[VM-OrderCard]]"]
deprecated_by: ""
deprecation_note: ""
---
```

**Body structure:**

```markdown
# ENT-Order

{Expand on the description. What role does this entity play in the domain?
What does it represent to the business, not just technically?}

## Attributes

| Field       | Type              | Required | Notes                          |
|-------------|-------------------|----------|--------------------------------|
| id          | uuid              | yes      | System-generated on creation   |
| customer_id | FK → ENT-Customer | yes      |                                |
| status      | enum              | yes      | See [[STATE-OrderLifecycle]]   |
| created_at  | timestamp (UTC)   | yes      | Per [[DEC-003]]                |

## Invariants

- An order may not be submitted without a linked payment method.
- A cancelled order may not be reinstated.
```

> **Deprecation Rule for Entities:** When `deprecated_by` is populated on an ENT- node, scan the full graph for any node referencing this entity's ID in its body or frontmatter `linked_entities`. For each, create a `CNF-` node with `conflict_class: deprecated_citation` unless the referencing node is itself deprecated or superseded. This is a blocking event requiring BA resolution.

---

### E. Command (`/03_Commands/`)

```yaml
---
type: command
id: CMD-SubmitOrder
version: "1.1.0"
module: OrderManagement
milestone: M1
status: active
description: "Validates and submits a draft order, initiating the fulfillment sequence."
source_frs: "[[FRS-UC-003]]"
linked_flows: ["[[FLOW-Checkout]]"]
linked_entities: ["[[ENT-Order]]"]
deprecated_by: ""
deprecation_note: ""
---
```

**Body structure:**

```markdown
# CMD-SubmitOrder

{Expand on the description. What does this action mean in domain terms?
Who triggers it and under what circumstances?}

## Contract

**Input**

| Field      | Type   | Required | Validation        |
|------------|--------|----------|-------------------|
| order_id   | uuid   | yes      | Must exist        |
| payment_id | uuid   | yes      | Must be confirmed |

**Output**

| Field     | Type      | Notes                          |
|-----------|-----------|--------------------------------|
| order_id  | uuid      |                                |
| status    | submitted | ENT-Order transitions to this  |

## Conditions

**Preconditions:** ENT-Order must be in `draft` state. A confirmed payment method must be linked.

**Postconditions:** ENT-Order transitions to `submitted`. Fulfillment flow is initiated.
```

> **Deprecation Rule for Commands:** Same as Entity deprecation rule. When `deprecated_by` is populated, scan for referencing nodes and create `CNF-` nodes with `conflict_class: deprecated_citation` for each active reference.

---

### F. Flow (`/04_Flows/`)

```yaml
---
type: flow
id: FLOW-Checkout
version: "1.0.0"
module: OrderManagement
milestone: M1
status: active
logic_gate: STRICT
description: "Orchestrates order submission and fulfillment from validated cart to confirmed order."
source_frs: "[[FRS-UC-003]]"
linked_commands: ["[[CMD-SubmitOrder]]", "[[CMD-FulfillOrder]]"]
linked_entities: ["[[ENT-Order]]"]
linked_actors: ["[[ACT-Customer]]"]
---
```

**Body structure:**

```markdown
# FLOW-Checkout

{Expand on the description. What business process does this represent?
What triggers it and what does a successful completion mean for the domain?}

## Sequence

1. **[[CMD-SubmitOrder]]** — Validates payment and transitions ENT-Order to `submitted`. Requires min v1.0.0.
2. **[[CMD-FulfillOrder]]** — Reserves inventory and emits a fulfillment event. Requires min v1.1.0.

Logic gate is STRICT: all steps must succeed or the flow rolls back to the pre-submission state.

## Shadow QA

> Shadow QA in this section is the **single source of truth** for test scenarios.
> Feature Specs reference this section by wikilink. Do not duplicate these scenarios elsewhere.

**Happy Path:** Given [[ACT-Customer]] with a valid cart and a confirmed payment method, when [[CMD-SubmitOrder]] fires, then ENT-Order moves to `submitted` and [[CMD-FulfillOrder]] begins processing.

**Edge Case:** Given [[ACT-Customer]] with a cart and no payment method attached, when [[CMD-SubmitOrder]] fires, then the command is rejected with ERROR-04 and ENT-Order remains in `draft`. No state transition occurs.

**Fault Path:** Given a downstream timeout during [[CMD-FulfillOrder]], then the flow rolls back, ENT-Order returns to `draft`, and the error is surfaced to the caller. No inventory is reserved.
```

> **Version Drift Rule:** When a linked Command or Entity is bumped, check all Flows that reference it. If the new version exceeds a pinned `min_version` noted in the body, create a `CNF-` node (`conflict_class: version_drift`). This is a blocking event.

> **Shadow QA Ownership Rule:** Shadow QA scenarios must be written in the Flow body. Feature Specs reference them — they never duplicate them. Any Feature Spec body containing literal Shadow QA text (rather than a wikilink reference) is a LINT violation (`shadow_qa_drift`).

---

### G. State Machine (`/08_States/`)

```yaml
---
type: state_machine
id: STATE-OrderLifecycle
version: "1.0.0"
module: OrderManagement
entity: "[[ENT-Order]]"
status: active
description: "Defines all valid states and transitions for an order from creation to completion."
source_frs: "[[FRS-UC-001]]"
linked_commands: ["[[CMD-SubmitOrder]]", "[[CMD-FulfillOrder]]", "[[CMD-CancelOrder]]"]
---
```

**Body structure:**

```markdown
# STATE-OrderLifecycle

{What does the lifecycle represent in business terms?}

## States

| State     | Terminal | Description                              |
|-----------|----------|------------------------------------------|
| draft     | no       | Order created, not yet submitted         |
| submitted | no       | Validated and awaiting fulfillment       |
| fulfilled | yes      | Inventory reserved, order confirmed      |
| cancelled | yes      | Order voided; no further transitions     |

## Transitions

| From      | To        | Trigger                    | Guard               |
|-----------|-----------|----------------------------|---------------------|
| draft     | submitted | [[CMD-SubmitOrder]]        | payment != null     |
| submitted | fulfilled | [[CMD-FulfillOrder]]       | stock > 0           |
| submitted | cancelled | [[CMD-CancelOrder]]        | none                |

## Invariants

A terminal state may not transition to any other state. Any command that attempts to do so must be rejected before execution.
```

---

### H. ADR (`/05_Decisions/`)

```yaml
---
type: decision
id: DEC-003
version: "1.0.0"
status: active
description: "All timestamps stored and returned in UTC ISO 8601 format."
source_frs: "[[FRS-UC-001]]"
supersedes: ""
deprecated_by: ""
---
```

> **Cross-Cutting Note:** DEC-, SYN-, and ARCH- nodes are intentionally cross-module and carry no `module:` field. The LINT `Missing Module Registration` rule is exempt for these types. In `home.md` they are listed under the `## Cross-Module` section. LINT must not flag them for a missing module field.

**Body structure:**

```markdown
# DEC-003 — All Timestamps in UTC

## Context

{Why was this decision needed?}

## Decision

{What was decided, stated plainly.}

## Consequences

{What does this mean for the system going forward?}
```

> **Deprecation Propagation Rule:** When a DEC node's status changes to `deprecated`, scan the full graph for any node that references its ID in the body. For each whose logic depends on the deprecated decision, create a `CNF-` node with `conflict_class: deprecated_citation`.

---

### I. Integration (`/09_Integrations/`)

```yaml
---
type: integration
id: INT-PaymentGateway
version: "1.0.0"
module: OrderManagement
contract_type: REST
sla: "99.9%"
status: active
description: "Validates and charges payment methods on order submission."
source_frs: "[[FRS-UC-003]]"
linked_commands: ["[[CMD-SubmitOrder]]"]
---
```

**Body structure:**

```markdown
# INT-PaymentGateway

{What does this integration do for the domain? Under what conditions is it called?}

## Endpoint

`POST /api/v1/charges` — charges the payment method linked to a submitted order.

## SLA and Timeouts

Target uptime is 99.9%. Circuit breaker triggers after 2000ms with no response.
On timeout, [[FLOW-Checkout]] rolls back and ENT-Order returns to `draft`.

## Blast Radius

If this integration is unavailable: order submission is blocked entirely. No orders
may move from `draft` to `submitted`. [[CMD-FulfillOrder]] is unaffected.
```

---

### J. UI Spec / View-Model (`/10_UI_Specs/`)

```yaml
---
type: view_model
id: VM-OrderCard
version: "1.0.0"
module: OrderManagement
status: active
description: "Order summary card rendered in the customer dashboard."
source_frs: "[[FRS-UC-007]]"
linked_entities: ["[[ENT-Order]]"]
linked_commands: ["[[CMD-SubmitOrder]]", "[[CMD-CancelOrder]]"]
linked_actors: ["[[ACT-Customer]]"]
---
```

**Body structure:**

```markdown
# VM-OrderCard

{What does the user see? What is the purpose of this view? One paragraph.}

## 1. Page Layout

```
--------------------------------------------------
HEADER
--------------------------------------------------
Title: "{Component Name}"
Description: [component purpose]
[Actions if any]
--------------------------------------------------

MAIN CONTENT
--------------------------------------------------
[Section descriptions]
Layout: [grid, flex, stack]
--------------------------------------------------
```

## 2. Modals / Dialogs / Popups

```
--------------------------------------------------
MODAL: {Modal Name}
--------------------------------------------------
Trigger: [what opens it]
Title: "..."
Description: [purpose]

Fields:
- Field Name: input type (required/optional, validation rules)

Info Box: [any help text]

Actions:
- [Primary Action] → [outcome]
- [Secondary Action] → [outcome]

Conditional Behavior:
- If [condition]: [shows/hides/alters]
--------------------------------------------------
```

## 3. Interactive Components

```
--------------------------------------------------
BUTTONS
--------------------------------------------------
{Button Name}:
- States: default, hover, disabled, loading
- Behavior: [what happens on click]
- Validation: [when disabled, loading conditions]

--------------------------------------------------
INPUTS / FORMS
--------------------------------------------------
{Input Name}:
- Type: text, email, select, checkbox, etc.
- Validation: required, pattern, min/max, custom
- Error Messages:
  * Required: "Please enter {field}"
  * Invalid: "Must be {format}"
  * Server: "{error message}"
--------------------------------------------------
```

## 4. Status & Feedback

```
--------------------------------------------------
BADGES / STATUS INDICATORS
--------------------------------------------------
{Status Name}:
- States: pending, approved, rejected, etc.
- Visual: [icon + color]
- Meaning: [what it indicates]
- Linked entity state: ENT-Order → `submitted` (example)

--------------------------------------------------
NOTIFICATIONS / TOASTS
--------------------------------------------------
Success Toast:
- Trigger: [action that fires it]
- Message: "{action} successful"
- Duration: 3 seconds

Error Toast:
- Trigger: [failure condition]
- Message: "{error details}"
- Duration: 5 seconds
--------------------------------------------------
```

## 5. Interaction Flow / User Journey

```
--------------------------------------------------
FLOW: {Flow Name}
--------------------------------------------------
1. User Action: [click, type, submit, etc.]
2. System Response: [immediate UI feedback]
3. State Change: [entity state or view-model change]
4. Next Step: [what happens automatically or next user action]

--------------------------------------------------
CONDITIONAL PATHS
--------------------------------------------------
- If [condition]:
  → [alternative path/outcome]
- If [another condition]:
  → [different outcome]
--------------------------------------------------
```

## 6. Dynamic Elements

```
--------------------------------------------------
LISTS / TABLES
--------------------------------------------------
Columns:
- {Column Name}: width, sortable, filterable

Data Source: [state variable / API / linked entity]
Sorting: [click header, multi-column]
Filtering: [per-column, global search]
Pagination: [page size, total pages, navigation]

Empty State: "No {items} found"
Loading State: [spinner / skeleton]
--------------------------------------------------

--------------------------------------------------
COUNTS / INDICATORS
--------------------------------------------------
{Element}:
- Updates on: [state changes, linked entity transitions]
- Format: [number, percentage, badge]
- Location: [where displayed]
--------------------------------------------------
```

## 7. Role-Based & Edge Cases

```
--------------------------------------------------
ROLE-BASED VISIBILITY
--------------------------------------------------
{Element}:
- Visible to: [ACT- wikilinks or role names]
- Hidden from: [roles]
- Conditional: [logic if not binary]

--------------------------------------------------
EDGE CASES
--------------------------------------------------
- Empty state: [what shows when no data]
- Error state: [network failure, validation]
- Disabled + loading: [combined states]
- Maximum limits: [pagination, character count]
- Accessibility: [keyboard nav, aria labels]
--------------------------------------------------
```

## Notes

```
--------------------------------------------------
PERFORMANCE CONSIDERATIONS
--------------------------------------------------
- Expensive operations: [what might lag]
- Dependent SLA: [linked INT- SLA if relevant]

--------------------------------------------------
UNKNOWN / UNDOCUMENTED
--------------------------------------------------
- [List anything unclear from FRS review]
- [Assumptions made during compilation]
--------------------------------------------------
```
```

---

### K. Conflict (`/99_Conflicts/`)

```yaml
---
type: conflict
id: CNF-007
status: pending
conflict_class: "logic | version_drift | deprecated_citation | broken_state | decomposition_violation | missing_actor"
source_frs: "[[FRS-UC-005]]"
conflicting_node: "[[DEC-003]]"
affected_nodes: ["[[FEAT-OrderManagement-001]]", "[[FLOW-Checkout]]"]
milestone: M1
---
```

**Body structure:**

```markdown
# CNF-007

## Contradiction

{Exact, plain-language description of the contradiction. What two things conflict?
Which FRS or node introduced the new rule? Which existing rule does it violate?}

## Options

**Option A —** {Description. Impact.}

**Option B —** {Description. Impact.}

## Resolution

*Pending BA decision.*

<!-- On resolution, populate:
resolved_by: BA-Name
resolved_at: YYYY-MM-DDTHH:MM:SSZ
resolution_summary: One sentence.
-->
```

> **Resolution Rule:** A CNF- node is closed only when the resolution block is filled and a BA name is present. On resolution: remove from `snapshot.md → open_conflicts`, set `dirty: true`, append to `log.md`. LINT uses `affected_nodes` to rank open conflicts by blast radius.

---

### L. Synthesis (`/12_Synthesis/`)

```yaml
---
type: synthesis
id: SYN-CheckoutBlastRadius
version: "1.0.0"
status: "active | superseded"
source_role: "agent | developer"
description: "Analysis of failure propagation through the checkout flow."
linked_nodes: ["[[FLOW-Checkout]]", "[[INT-PaymentGateway]]"]
superseded_by: ""
---
```

> **Terminal State:** When a SYN- node is superseded by a newer insight, set `status: superseded` and populate `superseded_by` with the wikilink to the replacing SYN-. LINT's `Stale Feature Specs` check does not apply to SYN- nodes, but `superseded` SYN- nodes are excluded from QUERY synthesis results.

**Body structure:**

```markdown
# SYN-CheckoutBlastRadius

**Origin query:** "What happens to inventory state if payment fails mid-checkout?"

## Finding

{Two-sentence distillation of the core insight.}

{Full prose analysis.}
```

---

### M. Feature Spec (`/13_FeatureSpecs/`)

A Feature Spec is a **high-level technical implementation plan**. It aggregates FRS documents for a module/milestone into dependency-ordered tasks. Shadow QA is referenced by wikilink from the source Flow — never duplicated here.

```yaml
---
type: feature_spec
id: FEAT-OrderManagement-001
version: "1.0.0"
module: OrderManagement
milestone: M1
status: "draft | review | approved | implemented | rejected | superseded"
gitlab_issue: ""
covered_by_apidoc: ""
source_frs: ["[[FRS-UC-001]]", "[[FRS-UC-003]]"]
linked_actors: ["[[ACT-Customer]]"]
linked_entities: ["[[ENT-Order]]"]
linked_commands: ["[[CMD-SubmitOrder]]", "[[CMD-FulfillOrder]]"]
linked_flows: ["[[FLOW-Checkout]]"]
linked_states: ["[[STATE-OrderLifecycle]]"]
linked_decisions: ["[[DEC-003]]"]
linked_integrations: ["[[INT-PaymentGateway]]"]
rejected_reason: ""
superseded_by: ""
---
```

**Body structure:**

```markdown
# FEAT-OrderManagement-001 — Order Submission and Fulfillment

## Summary

{One paragraph: what this feature delivers, for whom, and why it matters. Business context only.}

## Tasks

One task per source FRS. Ordered by dependency.

---

### Task 1 — Order Entity and Lifecycle  `[FRS-UC-001]`

**Source:** [[FRS-UC-001]]
**Depends on:** —
**Nodes:** [[ENT-Order]], [[STATE-OrderLifecycle]]

{One paragraph: what this task builds at a technical level.}

**Technical Scope**

- Define the Order entity with all attributes per [[ENT-Order]].
- Implement the lifecycle state machine per [[STATE-OrderLifecycle]].
- Enforce terminal state invariant.

**Acceptance Criteria**

- [ ] An Order in `fulfilled` state cannot be transitioned by any command.
- [ ] An Order cannot be created without a `customer_id`.

**Shadow QA**

→ [[FLOW-Checkout#Shadow-QA]]

---

### Task 2 — Order Submission Command  `[FRS-UC-003]`

**Source:** [[FRS-UC-003]]
**Depends on:** Task 1
**Nodes:** [[CMD-SubmitOrder]], [[FLOW-Checkout]], [[INT-PaymentGateway]]

{One paragraph: what this task builds.}

**Technical Scope**

- Implement [[CMD-SubmitOrder]]: validate payment linkage, transition Order to `submitted`.
- Integrate with [[INT-PaymentGateway]]: POST /api/v1/charges; circuit breaker at 2000ms.
- Implement checkout flow rollback on timeout.

**Acceptance Criteria**

- [ ] Order moves to `submitted` within 500ms (p95) when payment is confirmed.
- [ ] Order remains in `draft` and no charge is made on gateway timeout.
- [ ] Submission rejected with user-visible error when no payment method is linked.

**Shadow QA**

→ [[FLOW-Checkout#Shadow-QA]]

---

## Performance Contracts

| Operation | Target | Measurement Point | Source |
|-----------|--------|-------------------|--------|
| Order submission (p95) | ≤ 500ms | API gateway response | [[INT-PaymentGateway]] SLA |

## Out of Scope

{What this feature explicitly does not cover.}

## Open Questions

- **[BA-Name, YYYY-MM-DD]** {Question text.}
```

> **Status Terminal States:** `rejected` and `superseded` are terminal — LINT does not flag them as stale. On rejection: populate `rejected_reason`. On supersession: populate `superseded_by` with the replacing FEAT wikilink.

> **Decomposition Rule:** A Feature Spec may aggregate multiple FRS from the same `module` + `milestone`. More than 5 source FRS is a decomposition violation candidate.

> **Task Ordering Rule:** Tasks must be ordered by dependency. Circular dependency → `CNF-` node (`conflict_class: decomposition_violation`).

> **Shadow QA Reference Rule:** Each task's Shadow QA section must contain a wikilink reference to the source Flow's `#Shadow-QA` heading, not duplicated prose. COMPILE generates the reference. LINT detects drift when the referenced Flow version has incremented since last compile.

---

### N. Test Plan (`/14_Outputs/testplans/`)

```yaml
---
type: test_plan
id: TPLAN-FEAT-OrderManagement-001
ephemeral: true
generated_at: "YYYY-MM-DDTHH:MM:SSZ"
wiki_snapshot_ref: "YYYY-MM-DDTHH:MM:SSZ"
source_feature: "[[FEAT-OrderManagement-001]]"
linked_flows: ["[[FLOW-Checkout]]"]
linked_states: ["[[STATE-OrderLifecycle]]"]
milestone: M1
---
```

**Body structure:** One section per linked Flow. Scenarios are Given/When/Then, resolved from the linked Flow's `#Shadow-QA` section at generation time. Append a state transition coverage matrix table.

Mark as stale when `wiki_snapshot_ref` predates the last modification of any covered node. Stale TPLANs must be regenerated before a test run is initiated.

---

### O. Test Run (`/14_Outputs/testruns/`)

A Test Run is a **durable, versioned record** of an executed test plan. It is the QA sign-off artefact that gates milestone closure. Unlike TPLANs, TRUNs are never ephemeral.

```yaml
---
type: test_run
id: TRUN-FEAT-OrderManagement-001-001
ephemeral: false
source_tplan: "[[TPLAN-FEAT-OrderManagement-001]]"
source_feature: "[[FEAT-OrderManagement-001]]"
module: OrderManagement
milestone: M1
gitlab_ci_url: "https://gitlab.example.com/project/-/pipelines/123"
status: "pending | pass | fail | partial"
run_at: "YYYY-MM-DDTHH:MM:SSZ"
sign_off_by: ""
sign_off_at: ""
---
```

**Body structure:**

```markdown
# TRUN-FEAT-OrderManagement-001-001

## Run Summary

| Scenario | Result | Notes |
|----------|--------|-------|
| Happy Path — order submission | pass | |
| Edge Case — no payment method | pass | |
| Fault Path — gateway timeout | fail | Circuit breaker not triggering at 2000ms |

## Failures

{For each failing scenario: exact observed behaviour, expected behaviour per TPLAN, reproduction steps.}

## Sign-Off

{Populated by QA lead on approval. Required before milestone closure.}

*Pending sign-off.*

<!-- On sign-off, populate:
sign_off_by: QA-Name
sign_off_at: YYYY-MM-DDTHH:MM:SSZ
-->
```

> **Sign-Off Rule:** A TRUN node may not be used to gate milestone closure unless `sign_off_by` is populated. `status: pass` alone is insufficient.

> **TPLAN Currency Rule:** A TRUN must be initiated against a non-stale TPLAN. If the TPLAN's `wiki_snapshot_ref` predates any covered node's last modification, regenerate the TPLAN first.

---

### P. API Release Doc (`/14_Outputs/apidocs/`)

```yaml
---
type: api_release_doc
id: APIDOC-1.1.0
version: "1.1.0"
status: "draft | published"
published_at: "YYYY-MM-DDTHH:MM:SSZ"
feature_specs: ["[[FEAT-OrderManagement-001]]"]
milestone: M1
deprecated_by: ""
---
```

**Body structure:**

```markdown
# API Release — v1.1.0

## Endpoints Added

| Method | Path              | Command                 |
|--------|-------------------|-------------------------|
| POST   | /api/v1/orders    | [[CMD-SubmitOrder]]     |

## Endpoints Deprecated

| Method | Path              | Reason                              |
|--------|-------------------|-------------------------------------|
| GET    | /api/v0/orders    | Superseded by v1. Sunset: YYYY-MM-DD |

## Breaking Changes

None in this release.
```

Versioning rule: once published, never overwritten. Breaking changes produce a new version.

---

### Q. Changelog (`/14_Outputs/changelogs/`)

A Changelog is a **human-readable, audience-scoped release narrative**. It translates implemented features and API changes into language appropriate for its audience. Unlike APIDOCs, changelogs are written for reading, not for machine consumption.

```yaml
---
type: changelog
id: CHGLOG-M1-1.1.0
version: "1.1.0"
milestone: M1
status: "draft | published"
audience: "customer | internal | all"
published_at: "YYYY-MM-DDTHH:MM:SSZ"
feature_specs: ["[[FEAT-OrderManagement-001]]"]
linked_apidoc: "[[APIDOC-1.1.0]]"
deprecated_by: ""
---
```

**Body structure:**

```markdown
# Changelog — v1.1.0 ({audience})

## What's New

{For `customer` audience: one paragraph per feature, in plain language. No API paths, no entity names.
For `internal` audience: one paragraph per feature, with technical context and linked nodes.
For `all`: lead with customer language, follow with a technical addendum.}

### Order Submission and Fulfillment

Customers can now submit orders and receive fulfillment confirmation through the platform.
Payments are validated at submission and inventory is reserved before confirmation is issued.

## Changes and Fixes

{Any behaviour changes, bug fixes, or deprecations. Avoid jargon for customer audience.}

## Deprecations

{What is being removed in a future version and what the replacement is.}
```

> **Versioning Rule:** Once published, never overwritten. A corrected changelog produces a new version. Previous version gains `deprecated_by: CHGLOG-{new}`.

> **Audience Rule:** Always generate at least the `internal` audience variant. Generate `customer` variant when any FEAT in the milestone touches a user-facing flow (linked_flows contains a FLOW- with a linked ACT- that is not a system actor).

---

### R. Capability (`/07_Capabilities/`)

```yaml
---
type: capability
id: CAP-OrderFulfillment
version: "1.0.0"
module: OrderManagement
milestone: M1
status: active
description: "End-to-end ability to accept, validate, and fulfill a customer purchase."
source_frs: "[[FRS-UC-001]]"
linked_actors: ["[[ACT-Customer]]"]
linked_entities: ["[[ENT-Order]]"]
linked_commands: ["[[CMD-SubmitOrder]]", "[[CMD-FulfillOrder]]"]
linked_flows: ["[[FLOW-Checkout]]"]
---
```

**Body structure:**

```markdown
# CAP-OrderFulfillment

{What business capability does this represent? Who benefits and under what conditions?}

## Bounded Context

{What falls inside this capability? What explicitly falls outside?}

## Entry Points

{Actor + goal pairs. Every named actor must have a corresponding ACT- node.}

| Actor | Goal | Primary Flow |
|-------|------|-------------|
| [[ACT-Customer]] | Submit a purchase order | [[FLOW-Checkout]] |

## Exit Conditions

| Outcome   | Terminal State                    |
|-----------|-----------------------------------|
| Fulfilled | ENT-Order → `fulfilled`           |
| Cancelled | ENT-Order → `cancelled`           |
| Failed    | ENT-Order → `draft` (rolled back) |

## Constraints

{Overarching business rules. Cite DEC- nodes where applicable.}
```

---

### S. Architecture Blueprint (`/11_Architecture/`)

```yaml
---
type: architecture
id: ARCH-ServiceMesh
version: "1.0.0"
status: active
description: "Service-to-service communication pattern across all microservices."
source_frs: "[[FRS-UC-001]]"
linked_decisions: ["[[DEC-001]]"]
linked_integrations: ["[[INT-PaymentGateway]]", "[[INT-InventoryService]]"]
---
```

**Body structure:**

```markdown
# ARCH-ServiceMesh

{What architectural concern does this document?}

## Topology

```mermaid
graph LR
    API_Gateway --> OrderService
    OrderService --> PaymentGateway
    OrderService --> InventoryService
```

## Communication Pattern

{How components communicate. Cite the DEC- that mandated the pattern.}

## Key Constraints

{Non-negotiable invariants. Each must trace to a DEC- node.}

## Known Gaps

{Decisions not yet formalised. Each gap should become a DEC- or CNF- node.}
```

---

### T. Topology Output (`/14_Outputs/topology/`)

A Topology is a **generated, module-scoped Mermaid diagram** assembled from ARCH-, INT-, CAP-, and ACT- nodes. It is regenerated on demand and is not versioned. It provides the at-a-glance system map for architecture reviews, onboarding, and stakeholder walkthroughs.

```yaml
---
type: topology
id: TOPO-OrderManagement-M1
ephemeral: true
generated_at: "YYYY-MM-DDTHH:MM:SSZ"
wiki_snapshot_ref: "YYYY-MM-DDTHH:MM:SSZ"
module: OrderMa

…(truncated)
