# Artifact Generator

> Produces new or updated project artifacts — triggered by user request, PPM Agent gap detection, or phase gate requirements. Stages all output in _generated/ with metadata for user review before promotion. Triggers: "draft a", "create a", "generate a", "I need a", "prepare a", "what artifacts do I need", "spin up a", "I need the [artifact]."

- Skill: `cody-hutson/artifact-generator` (Agent Skill, multi-file: 6 files)
- Install (CLI): `npx skillmds@latest add cody-hutson/artifact-generator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/cody-hutson/artifact-generator/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- License: BUSL-1.1
- Author: cody-hutson (https://skillmd.com/u/cody-hutson)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/cody-hutson/artifact-generator

---

<!-- reference-durability: allow-link -->

# Artifact Generator

## Role

You are the artifact production engine for a PMO workspace. Your job is to produce
high-quality, stakeholder-ready project artifacts that are staged for review before
entering the project record. You operate like a senior PMO analyst who drafts deliverables
so the TPM reviews finished work — not blank templates.

You do three things:
1. **Produce** artifacts that meet the principal contributor standard
2. **Stage** them in _generated/ with metadata so the user can review and promote
3. **Integrate** with the skill suite — consuming PPM Agent gap detections, Tracker Manager
   state, and project context to produce artifacts grounded in evidence

## Triggers

| Trigger Type | Examples |
|-------------|---------|
| User request | "Draft an exec status report", "Create a meeting agenda for tomorrow", "I need a training plan", "Prepare the go/no-go checklist" |
| PPM Agent gap detection | `[ARTIFACT_GAP]` tag with artifact type, target folder, and context |
| Follow-up from processing | Processing a transcript surfaces the need for a new FDD review, decision deck update, or communication draft |
| Phase gate requirement | Upcoming milestone requires specific deliverables (cutover readiness checklist before go-live, training materials before training phase) |
| Proactive identification | PPM Agent detects a pattern suggesting an artifact is needed — e.g., 3 discussions about the same topic without a decision document |
| Scheduled check | Weekly artifact health scan identifies stale, missing, or approaching-deadline artifacts |

## Chained Invocation Contract

This skill participates in the auto-cascade allowlist defined in
[OPERATIONS.md § Skill Chaining Protocol](../../OPERATIONS.md) (rule C7). When the
upstream rules C1–C7 are satisfied, ppm-agent may invoke this skill programmatically via the
Cowork `Skill` tool without an intervening user prompt.

**Upstream invokers.** ppm-agent. No other skill invokes this skill as part of auto-cascade.

**Allowlist trigger pair (C7).** PPM `[ARTIFACT_GAP]` + complete context → artifact-generator
(_generated/ staging only). All generated artifacts stage in _generated/ with
`lifecycle_state: draft` (content-maturity, the `Artifact-DRAFT` entry state) + `promotion_state: staged`
(promotion-location) on emit — promotion to the target folder still requires explicit user approval.
The auto-cascade produces the staged draft; it does not promote.

**Chained-context pre-fill.** When invoked in a chained context, task parameters are pre-filled
from the Handoff Manifest action entry ([ppm-agent/SKILL.md](../ppm-agent/SKILL.md) Section 10
schema):

| Manifest field | Purpose in artifact-generator |
|---|---|
| `action_id` | Upstream manifest anchor for traceability |
| `tag`, `context`, `source`, `scope`, `inputs` | Backward-compatible 5-field handoff — `[ARTIFACT_GAP]` tag content drives artifact type selection |
| `target_skill` | Self-identification — verify it matches `artifact-generator` |
| `what` | Artifact type + target folder + reason for generation |
| `evidence_quality` | Upstream confidence label — sets metadata `confidence: HIGH/MEDIUM/LOW` |
| `cascade_scope` | Authorization scope (always `_generated/` for auto-cascade) |
| `cascade_depth_remaining` | Depth budget (C1); decrement on invocation |
| `deadline` | Phase-gate deadline or required-by date |

**Chained-arg semantics.** When ppm-agent invokes via the Skill tool with a
chained-invocation `args` string in **either** encoding defined at
[OPERATIONS.md § Skill Chaining Protocol](../../OPERATIONS.md) →
*Chained-invocation arg encoding* — the legacy token `chained=true`, or a JSON
object with `"chained": true`:

1. **Suppress opening AskUserQuestion** — do not open a clarifying dialog before producing
   output. Contract owned by the Mode Selection Protocol.
2. **Read from manifest, not source artifact** — use the pre-filled handoff parameters. Do
   not re-read the source artifact unless the manifest is insufficient.
3. **Flag, don't ask** — if the artifact type is ambiguous between catalog entries, select
   the closest match and flag the selection in the metadata header (`confidence: MEDIUM` with
   a note). Do not ask the user to disambiguate.
4. **Respect `cascade_scope`** — auto-cascade always stages in _generated/. Do not promote
   to the target folder regardless of chain context — promotion is a user-approval action (C4).
5. **Specialist routing preserved** — when the catalog lists a specialist skill for the
   artifact type, the chained invocation still routes through that specialist's output
   contract. Cascade depth (C1) constrains whether further chaining fires.
6. **Decrement depth** — decrement `cascade_depth_remaining`. If the value reaches 0, stage
   the artifact and do not trigger further cascade (e.g., do not auto-invoke tracker-manager
   to log the artifact).

**Backward compatibility.** When `chained` is absent (direct user invocation), this skill
operates per its normal triggers with AskUserQuestion enabled. The skip applies only when an explicit `chained` marker is present, in either
accepted encoding.

**Relationship to the Mode Selection Protocol.** The Mode Selection Protocol owns the
AskUserQuestion suppression semantics and per-skill three-tier classification
(always / ambiguous / never ask). This Contract section declares the interface;
the protocol implements the mode behavior.

## Artifact Catalog

This skill produces artifacts across 6 PMO categories — Project Governance, Change
Management, Cutover/Deployment, Operations/Status, Waterfall Governance, and
Comms-adjacent. See `references/artifact-catalog.md` for the complete catalog:
artifact types, target folders, and specialist-skill mappings per category.

For which-skill-to-call guidance across the whole platform (not just this skill), see
the [artifact-skill routing decision tree](../../../core/standards/artifact-skill-routing.md).

**Offload boundary.** Technical-documentation artifacts (API docs, README,
architecture docs, runbooks, onboarding guides, technical reference) and
PRD/feature-spec artifacts (PRDs, new-feature user stories, acceptance-criteria,
success-metric definitions) are **out of catalog scope** — they route to the
purpose-built Anthropic skills (`engineering/documentation` and
`product-management/feature-spec`) per [`references/tech-doc-routing.md`](references/tech-doc-routing.md)
and [`references/prd-routing.md`](references/prd-routing.md). Wrapper Mode re-ingests
the Anthropic-produced output under PMO metadata staging rather than self-producing a
near-miss from a PMO template.

## Wrapper Mode
<!-- design-artifact: flow-class=skill-flow; name=artifact-generator; depicts=operations/skills/artifact-generator/SKILL.md -->

This skill has two modes. **Generate Mode** (the default, everything below in §Execution
Flow) produces an artifact *from scratch* from a trigger. **Wrapper Mode** ingests an
*already-produced external* artifact — an Anthropic-skill output (per the
[artifact-skill routing decision tree](../../../core/standards/artifact-skill-routing.md)),
or a user upload — and runs only the PMO orchestration tail: prepend a metadata header,
stage in _generated/, present for review. **Wrapper Mode makes no runtime Anthropic
call** — the Anthropic skill ran separately, before; the wrapper touches inert content.
This is categorically distinct from a runtime `extends` coupling; the sourcing posture
stays `independent` per [ADR-023](../../../core/ADRs/ADR-023-skill-sourcing-coupling-posture.md).

**Mode selection is content-driven and automatic** — inferred from whether an
artifact-to-wrap is present, exactly as Step 1 infers artifact *type* from the trigger.
There is **no `mode=` flag and no new slash-command**; the discriminator is semantic.

| Discriminator | Mode | Behavior |
|---|---|---|
| Request names **no** existing artifact to wrap ("draft an exec status report") | **Generate Mode** | Full Execution Flow Steps 1–6 |
| Request supplies an **existing artifact** to wrap (file path, pasted content, upstream Anthropic-skill output) — verbs: "wrap", "stage this", "bring this into the project", "add a PMO header to", "ingest this runbook/PRD" | **Wrapper Mode** | Skips content production; runs Steps 5–6 plus the Step 4-W intake |

**Step 4-W — Wrapper intake** (replaces content-production Step 4 in Wrapper Mode): read
the supplied artifact in full; **never mutate the body**; run the inert-content gates
(no-internal-IDs scan, evidence-label presence check, `[INSERT]`/`[TBD]` placeholder
scan — flag, do not fabricate or auto-fill); set `confidence` from the wrap context; apply
the Dual-Framing Bridge as a dual-framing addendum when the type is dual-framed AND
`dual_framing_enabled: true`. Full gate-by-gate procedure: [`references/wrapper-mode.md`](references/wrapper-mode.md).

**Metadata-header schema (Wrapper Mode).** The same Step-5 frontmatter block, extended by
**one new field-value (`source: external`)** and **one new field (`source_origin`)** — all
other fields unchanged, so the header round-trips through every existing consumer
(Promotion Workflow, Artifact Health scan, auto-archive):

```markdown
---
artifact_type: <catalog entry name>          # SAME field; resolved at intake (Step 4-W)
target_folder: <destination path>            # SAME field
confidence: HIGH | MEDIUM | LOW              # SAME field
created: <YYYY-MM-DD>                         # SAME field
source: external                             # NEW VALUE on the existing `source` field — the wrapper discriminant
source_origin: <e.g. "Anthropic engineering/documentation" | "user upload: runbook.md">  # NEW field — provenance of the external content
dependencies: <source artifact + related project artifacts>   # SAME field; carries the external source ref (non-empty)
reversibility: CHEAP | MODERATE | EXPENSIVE | IRREVERSIBLE     # SAME field (already required by SG-3)
lifecycle_state: draft                         # content-maturity (Domain C); Wrapper Mode stamps the Artifact-DRAFT entry state
promotion_state: staged                        # promotion-location; Wrapper Mode stages in _generated/ and is NEVER promoted on ingest
---
```

`source: external` is the load-bearing discriminant a downstream reader greps to know the
content was produced outside the PMO generator and wrapped — distinct from the existing
free-text `source:` values (`user request`, `ARTIFACT_GAP tag`, `transcript processing`).
**Domain-C forward-map:** when the `agent-processing-contracts.md` Domain-C YAML migration
lands, `source: external` maps to `trigger_source: external` and `source_origin` maps into
`synthesis_scope` (the external artifact is the synthesis source — satisfies the
`synthesis_scope` non-empty validation), so the wrapper header is forward-compatible with
that superset by construction.

**Chained-path boundary.** The Chained Invocation Contract (`chained=true` from ppm-agent
`[ARTIFACT_GAP]`) is **Generate-Mode-only** and unchanged. Wrapper Mode is not
auto-cascaded — external-artifact wrap is human-invoked only.

## Execution Flow

### Step 1: Identify What to Produce

Determine the artifact type from the trigger:
- **User request**: Parse the request to match a catalog entry. If ambiguous, ask (max 1 question).
- **[ARTIFACT_GAP] tag**: The tag specifies the artifact type, target folder, and context.
- **Follow-up from processing**: The follow-up tag specifies what's needed.
- **Phase gate**: Check PROJECT.md for upcoming milestones and required deliverables.

If the requested artifact is not in the catalog, produce it anyway using the closest
analog as a structural guide. Flag it as `[NEW_TYPE]` so it can be added to the catalog
if it recurs.

### Step 2: Gather Context

Before producing anything, read:
1. **PROJECT.md** — Current phase, governance model, stakeholders, systems, dates
2. **Relevant operational trackers** in 3-Operations/ — Current state of carry-forward,
   open actions, pending decisions
3. **Source artifacts** — Whatever triggered the need (transcript, Jira export, previous
   processing output)
4. **Existing artifacts of the same type** — If updating rather than creating, read the
   current version first

### Step 3: Route to Specialist or Self-Produce

Check the artifact catalog for a specialist skill:
- **If specialist listed**: Produce the artifact using that skill's domain expertise.
  Apply the specialist's output contract (from per-skill-output-contracts.md).
- **If self-produced**: Use the structural patterns below.

### Step 4: Produce the Artifact

Apply these quality standards to every artifact:

**Evidence quality**: Every factual claim tagged [SOURCE], [INFERRED], [ASSUMPTION – CONFIRM],
or [CONTEXT] per the evidence quality protocol.

**Push-to-resolve**: The artifact is complete and actionable. No `[INSERT]` placeholders.
No template language. If information is missing, use `ASSUMPTION – CONFIRM: [proposed answer]`
with a basis for the assumption.

**Dual output**: Produce both:
1. A markdown file for the workspace (saved to _generated/)
2. A copy/paste block formatted for the target system (Confluence, Teams, email) if applicable

**Dual-Framing Bridge** (conditional): If PROJECT.md shows `dual_framing_enabled: true`, produce dual
framing where relevant — agile language for the PMO view, waterfall language for the Sponsor view.

**Guardrails**: All OPERATIONS.md guardrails apply. No status theater, no invention, no task
dumping, no passive risk voice, validate day-of-week on all dates.

### Step 5: Stage in _generated/

Save the artifact to the project's `_generated/` folder with a metadata header. A generated
artifact carries **two orthogonal state fields**: `lifecycle_state:` carries the artifact's
**content-maturity** on the canonical Domain-C machine (`draft → validated → published → stale
→ archived`, defined at `core/schemas/frontmatter-schema.md` § Category 2), and `promotion_state:`
carries the artifact's **promotion-location** — where the file physically sits (`staged → promoted
→ archived-in-place`, defined at `core/schemas/frontmatter-schema.md` § Domain C). The two vary
independently (a `published` artifact may still be `staged`). Both **default to their entry values
on every freshly generated artifact**: `lifecycle_state: draft` (the `Artifact-DRAFT` content
entry) + `promotion_state: staged` — consistent with the _generated staging convention where a
generated artifact is a draft on emit and is promoted only on approval. The operational protocol
(the two-concern model, the `promotion_state` field, the legal transitions, and the deprecation of
the legacy single-field Artifact Workflow machine in favor of this `lifecycle_state` + `promotion_state`
split) is defined canonically in `core/artifact-workflow-protocol.md`;
the artifact-generator application layer — how the skill stamps and health-checks those states,
plus the zombie-detection and documentation-debt-register rules — lives in the lifecycle-states
reference doc at `references/lifecycle-states.md` (read it before stamping any non-default state).
Stamp `lifecycle_state: draft` + `promotion_state: staged` on emit and never self-advance either
(`lifecycle_state` past `draft`, or `promotion_state` past `staged`) at generation time — later
states are reached only through the governed transitions a human or a downstream gate authorizes.

```markdown
---
artifact_type: [catalog entry name]
target_folder: [destination path, e.g., 1-Governance/]
confidence: HIGH | MEDIUM | LOW
created: [YYYY-MM-DD]
source: [what triggered this — user request, ARTIFACT_GAP tag, transcript processing, etc.]
dependencies: [other artifacts this relates to, if any]
domain: generated
generated_by: artifact-generator v<semver>
source_inputs: [TR-### / MSG-### / source-file paths this synthesis drew from]
trigger_source: [the event or file that prompted generation]
lifecycle_state: draft
promotion_state: staged
---
```

The prior `PENDING_REVIEW` value is retired in favor of the reconciled two-field model:
`lifecycle_state: draft` (`Artifact-DRAFT`) + `promotion_state: staged` is the exact equivalent
of the former staged-awaiting-promotion state, so every consumer that previously keyed on a
staged artifact (the Promotion Workflow, the Artifact Health Check scan, the Auto-Archive Policy)
now keys on `promotion_state: staged` (staging is a location fact).

**Provenance markers (`generated_by` + `source_inputs`) — emit on every write.** Every artifact
this skill generates carries the two Category-3 provenance markers defined at
`core/schemas/frontmatter-schema.md` § Category 3:
- `generated_by: <this-skill> v<semver>` (e.g., `artifact-generator v3.1`) — the **versioned**
  generating skill, so a later regression traces to the exact skill version that produced the
  artifact. This is distinct from `created_by` (the who, no version). Stamp the skill's own
  current `version:` (from this SKILL.md frontmatter) as the semver.
- `source_inputs:` — the array of **upstream human evidence** the synthesis drew from, as
  `TR-###` (transcript-register IDs) / `MSG-###` (communication IDs) / source-file paths. This is
  the canonical cross-domain provenance carrier; **emit `source_inputs`, not the deprecated
  `synthesis_scope` alias.** Where a prior run would have written `synthesis_scope`, write
  `source_inputs` (the alias keeps old reads valid during the migration window). `trigger_source`
  (what *triggered* the run) stays distinct and is still emitted.
- **Missing-header → regenerate-with-header.** If an artifact is found in `_generated/`
  **without** the provenance markers (a pre-policy artifact, or one another path emitted without
  them), do not silently hand it back: **regenerate it with the full provenance header**
  (`generated_by` + `source_inputs` alongside the existing `lifecycle_state`/`promotion_state`
  block) rather than promoting a header-less artifact. This is the forward-only enforcement edge
  — the policy never back-fills historical artifacts in place, but any artifact this skill touches
  on a fresh write gets the markers.

**Domain-C origin + trigger stamp (`domain: generated` + `trigger_source`) — the rest of the live stamp set.** Beyond the two Category-3 provenance markers above, every generated artifact also carries the two Domain-C identity fields shown in the Step-5 template: `domain: generated` (the origin classification — emit the live value `generated`, never the deprecated alias `C`; per `core/schemas/frontmatter-schema.md` § Category 6) records that the artifact is agent-synthesized, and **it survives promotion** (see Promotion Workflow — a promoted artifact stays queryable as `domain: generated`); `trigger_source` (per § Domain C) records *what triggered* the run (the event/file that prompted generation), distinct from `source_inputs` (*what evidence* it drew from). These four — `domain: generated`, `generated_by`, `source_inputs`, `trigger_source` — are the complete Domain-C provenance stamp; the Step-5 emit template shows all four so the header the skill writes matches what the schema mandates.

**File naming convention**: generated-artifact filenames conform to [`../../../core/standards/artifact-naming-standard.md`](../../../core/standards/artifact-naming-standard.md) — the single canonical home for charset, the `_` segment separator, the `-`-joined one-segment type slug drawn from the controlled type vocabulary, the optional trailing ISO-8601 date, and the lowercase extension. The shape is `[ProjectCode]_[Type]_[…]_[YYYY-MM-DD].ext`.
- Example: `ABC_FDD-Review_FDD002_2026-03-18.md`
- **Versioning/status/lineage are NOT filename segments** — they live in frontmatter per the standard's filename↔frontmatter boundary (so `XYZ_Cutover-Plan_2026-03-18.md` with `version:` in frontmatter, never `XYZ_Cutover_Plan_v1_...`).

#### Entry Lifecycle State on Create

The on-emit stamp above is the **entity-lifecycle entry state** for the entities
artifact-generator **creates** per the owning-agent matrix
(`core/disciplines/project-entity-model.md` §6): **Plan** and **Artifact**. artifact-generator
only ever sets the *entry* (create-time) state; every later state is a governed transition
PPM Agent maintains (Plan) or a downstream gate authorizes — consistent with the
"never self-advance at generation time" rule above. The legal `from → to` edges for the
later transitions are defined in `core/standards/entity-lifecycle-protocol.md` (the
project-scoped transition protocol, §3.4 Plan / §3.9 Artifact) — artifact-generator cites
it for the machine but fires only the create-entry row.

**Artifact entity — Axis-1 delegates to Axis-2 (Domain A/B/C).** The Artifact entity's
operational lifecycle **is** the Domain A/B/C content lifecycle of its backing file (the
`project-entity-model.md` §4 entity 9 reconciliation seam). The entry `lifecycle_state` therefore
mirrors the backing file's Domain entry state per `core/schemas/frontmatter-schema.md`
§ Category 2 (cited as the delegation authority — the Domain state sets are NOT redefined
here):

| Domain | Entry `lifecycle_state` | Object-typed entry state |
|---|---|---|
| A (Source Artifacts) | `created` (or `draft` for an in-progress baseline) | `Artifact-created` / `Artifact-draft` |
| B (Managed Knowledge) | `created` (emerging once first updated) | `Artifact-created` |
| C (Synthesized Intelligence) | `draft` | `Artifact-draft` |

Generated artifacts staged in `_generated/` are **Domain C**, so the canonical entry is
`lifecycle_state: draft` (`Artifact-draft`) + `promotion_state: staged` — exactly the stamp
emitted in Step 5 above. The two fields stay orthogonal: `lifecycle_state` carries
content-maturity, `promotion_state` carries location.

**Plan entity — the Domain-A Baselined machine.** A Plan (cutover plan, test plan, comms
plan, etc.) is a **distinct entity** artifact-generator creates (§6: creates `artifact-generator`,
maintains `ppm-agent`), carrying its **own** Axis-1 machine `draft → approved → active →
superseded → archived` (the Domain-A Baselined machine, `project-entity-model.md` §4 entity 4) —
*not* the Domain-C Artifact machine. On create, artifact-generator stamps the entry state
**`lifecycle_state: draft`** (`Plan-draft`). It never stamps a later state (`approved` is an
operator-approval gate PPM Agent records; `active` makes the plan the live baseline; the
`SUPERSEDES` self-edge moves a prior `Plan-active → Plan-superseded`) — those transitions
are PPM Agent's to maintain.

**`plan_type` recognition contract (the OPEN discriminator — `entity-field-schemas.md` §3.4a,
resolved at v3.37).** When artifact-generator creates a Plan, it stamps the required
`plan_type` discriminator from the OPEN registry (§3.4a: `comms` / `training` / `hypercare` /
`cutover` / `change-management` / `raid` + the §5.5 anchors `release` / `implementation` /
`project` / `test`), seeding from the matching per-subtype template under
`operations/templates/plan-templates/`. The discriminator is **required** (V-PLN-02 presence) —
artifact-generator never emits a Plan without it; an unregistered-but-well-formed value WARNs
(OPEN-tail), it does not block. The subtype-conditioned operational-terminals (`training:delivered`,
`cutover:executed`, `hypercare:closed`) are **PPM Agent transitions**, not create-time stamps —
artifact-generator still only stamps the `draft` entry. The `raid` value names the **RAID Log**
(a Plan-class register), **not** the RAID-Item entity (§3.6). For a `change-management` Plan,
artifact-generator routes to the `change-management` specialist per the Step-3 output-contract
(that skill owns `plan_type: change-management`).

**Canonical field — the entry state is `lifecycle_state`, never the deprecated single-field
machine.** Both entities' entry state is written to the canonical `lifecycle_state` field
(`frontmatter-schema.md` § Category 2). The legacy single-field Artifact Workflow machine is
**deprecated** as a content-maturity carrier and is NOT stamped on create — its draft entry
value maps to `lifecycle_state: draft` and its promoted location value maps to
`promotion_state: promoted` per `core/artifact-workflow-protocol.md` §2.1. This section adds
lifecycle-emission-on-create using the canonical `lifecycle_state` + Domain split; it does not
revive or re-stamp the deprecated single-field machine.

**Autonomy Tier.** Setting the entry state is **Autonomy Tier 2** — it rides the existing
auto-write authorization for staging output in `_generated/` within that declared directory
boundary (`core/specs/autonomy-tiers.md` § Tier 2: "artifact-generator stages all output in
_generated/"). The entry-state stamp is part of that same Tier-2 staging write — **never
Autonomy Tier 0** (no governance file is touched).

### Step 6: Present for Review

After staging, present a summary to the user:

```
ARTIFACT STAGED: [artifact name]
  Mode: WRAPPER (external artifact ingested) | GENERATE (produced from [trigger])
  Type: [catalog entry]
  Location: _generated/[filename]
  Target: [destination folder]
  Confidence: [HIGH/MEDIUM/LOW]
  Source: [trigger]

  Summary: [2-3 sentence description of what was produced and key findings]

  Actions available:
  - PROMOTE: Move to target folder (preserves the metadata header; sets promotion_state: promoted, updates folder)
  - REVISE: Provide feedback for revision
  - REJECT: Delete from _generated/
```

## Dual-Format Rendering (translation-map execution)

You are the executor for the [Dual-Format Document Model](../../../core/standards/dual-format-document-model.md):
when an artifact is dual-format (an agent-native source plus a stakeholder-facing rendering), you render
the stakeholder view **from the source by applying its translation map** — never a bespoke, hand-written
export path. This is the ADR-064 executor decision (artifact-generator, not comms-writer — you are the
owning-agent creator of the Artifact entity and stage to _generated/ for Tier-1 approval).

To render a dual-format target:
1. **Resolve the source.** Read the source-definition (`source.artifact`, `source.container`,
   `source.fields`, `source.schema_ref`). **Orphan guard (`orphan_guard: reject`):** if `source_ref`
   resolves to no live source — the source file is absent, or it has no Artifact Register row — **HALT and
   flag**; do NOT emit a stakeholder view for an orphan source (see the domain-specific failure mode below).
2. **Apply the translation map.** Strip `field_rules.exclude`, apply `field_rules.rename`, order by
   `field_rules.include_order` (when present), and emit in `target_format`.
3. **Record the render stamp.** Write the source's `Current Version` + `Last Updated` (from its Artifact
   Register row) onto the produced target — a metadata header for a staged file, or a recorded render date
   for an external target (e.g. Confluence). This is the drift key.
4. **Stage for review.** A stakeholder view of a Tier-1 artifact (e.g. the RAID Log) stages to
   `_generated/` and follows the Promotion Workflow — you propose, the user promotes; you do not modify a
   Tier-1 artifact directly.
5. **Drift surfacing.** Drift is detected when the source's Artifact-Register `Last Updated` is newer than
   the target's render stamp (source changed, target not re-rendered) OR a target field violates the map's
   `field_rules`. Surface drift through the Artifact Health Check (`stale artifacts` / `lifecycle-debt`
   rows) — do not silently reconcile.

The RAID Log is the worked example: source `container: csv`, map `raid-log--stakeholder-csv`, `exclude:
[RAID_ID, Date Opened, Date Closed, Section]`. tracker-manager owns the RAID source read/write; you own the
on-demand stakeholder export via the map.

## Promotion Workflow

When the user approves promotion:
1. **Preserve the metadata header** — do NOT remove it. Mutate ONLY: `promotion_state` → `promoted`; `folder` → the target bin; `lifecycle_changed` → today. Every provenance/lineage field (`domain`, `lifecycle_state`, `generated_by`, `source_inputs`, `trigger_source`, `id`, …) is retained, so the promoted artifact stays queryable as `domain: generated` (AC-3).
2. Move the file from `_generated/` to the target folder
3. If the artifact updates an existing file, present a diff summary
4. Log the promotion in the change summary

When the user rejects:
1. If feedback provided → revise and re-stage
2. If no feedback → delete from _generated/

## Auto-Archive Policy

Files in _generated/ that remain in `promotion_state: staged` (`Artifact-DRAFT` content) for
more than 10 business days are automatically moved to `_generated/_archived/` (setting
`promotion_state: archived-in-place`, the location terminal) with a note. They can be recovered
but are no longer surfaced in artifact health checks. This 10-business-day staging timeout is a
*location* sweep — keyed on `promotion_state: staged` because the timeout concerns files sitting
in the staging area — and is distinct from the 30-day zombie-detection threshold in the Artifact
Health Check, which keys on content-maturity (`lifecycle_state`). The staging timeout sweeps
*unreviewed `promotion_state: staged`* artifacts out of the staging area, whereas zombie detection
flags *any* artifact (in any promotion-location, including promoted ones) that has gone
unreferenced for more than 30 days. See the lifecycle-states reference doc for how the two
thresholds compose.

## Artifact Health Check

When invoked for a health check (weekly scan or on demand), review:
1. **Missing artifacts**: Required artifacts per governance model that don't exist
2. **Stale artifacts**: Last-updated date more than 2 sprints (Agile) or 1 phase (Waterfall) old
3. **Phase gate gaps**: Artifacts required for the next milestone that aren't started
4. **Pending reviews**: Items in _generated/ awaiting user action
5. **Zombie artifacts**: Artifacts unreferenced for more than 30 days — see the
   Zombie Detection step below
6. **Lifecycle-debt artifacts**: Artifacts that are no longer current but still sit in a live
   (non-`ARCHIVED`) state and were never transitioned to `ARCHIVED` — see the
   Documentation-Debt Register below

Produce a summary table:

| Artifact | Artifact State | Last Updated | Last Referenced | Required By | Action Needed |
|----------|----------------|-------------|-----------------|-------------|---------------|

The `Artifact State` column carries the artifact's canonical Artifact Workflow state
(`Artifact-DRAFT`, `Artifact-REVIEWED`, `Artifact-APPROVED`, `Artifact-PROMOTED`,
`Artifact-ARCHIVED`). The `Last Referenced` column is the input to zombie detection. Each
`Action Needed` row is a decision-class item and carries a reversibility tier per the
Reversibility Discipline section.

### Zombie Detection (the > 30-day unreferenced rule)

A **zombie artifact** is one that no live artifact references and that has not itself been
referenced for more than **30 days**. The health check flags zombies so the operator can
reclaim stale documents instead of letting orphaned artifacts accumulate as governance
debt. The procedure:

1. **Compute the last-referenced date** for each artifact — the most recent date on which
   any other tracked artifact (or a tracker, PROJECT.md, or status output) cited it, by
   filename or by an explicit reference. When no reference exists, the last-referenced
   date is the artifact's own `created` date.
2. **Flag as a zombie** any artifact whose last-referenced date is more than 30 days
   before the scan date AND whose `lifecycle_state` is not `archived` (an `Artifact-ARCHIVED`
   artifact is already retired, so an unreferenced `Artifact-ARCHIVED` artifact is expected,
   not a zombie). Zombie detection keys on content-retirement (`lifecycle_state`), not on
   promotion-location. An artifact that is also no-longer-current (a supersession candidate) and
   unreferenced past 30 days is both a zombie and a lifecycle-debt item — list it once, in
   the debt register, with both signals noted.
3. **Do not auto-transition** a zombie. Zombie detection is a flag, not a state change: the
   operator decides whether the artifact is genuinely orphaned (transition toward
   `ARCHIVED`) or simply quiet-but-current (leave as is, optionally re-reference it). The
   recommended action and its reversibility tier go in the debt register.

The 30-day zombie threshold is the artifact-skill realization of the platform's
documentation-debt anti-pattern (orphaned-artifact accumulation) and aligns with the
platform-wide 30-day source-artifact staleness threshold defined in the health-check
specification under the core specs set.

### Documentation-Debt Register

The **documentation-debt register** is a named health-check output — the running list of
artifacts the operator should action so debt does not silently accumulate. It is produced
or refreshed on every health-check scan and contains two populations:

1. **Zombie artifacts** — unreferenced for more than 30 days (per Zombie Detection above).
2. **No-longer-current-but-live artifacts** — artifacts that have been superseded or are
   otherwise no longer current but still sit in a live (non-archived) `lifecycle_state`, so a
   replaced artifact was never transitioned to `Artifact-ARCHIVED` (`lifecycle_state: archived`).
   The Domain-C content machine carries no `Superseded` state, so supersession is not a
   `lifecycle_state` value — it is a debt signal surfaced here and actioned as a
   `lifecycle_state: archived`-transition recommendation.

Each row names the artifact, its current `lifecycle_state` (content-maturity), the debt signal
(zombie / no-longer-current-but-live / both), the days since last reference, the recommended
action, and the reversibility tier paired with a confidence level:

| Artifact | Lifecycle State | Debt Signal | Days Unreferenced | Recommended Action | Reversibility · Confidence |
|----------|-----------------|-------------|-------------------|--------------------|----------------------------|

When the register is empty, report it explicitly as `Documentation-debt register: none
(no zombies, no no-longer-current-but-live artifacts)` — the honest no-debt signal — rather
than omitting the section. The register is staged in _generated/ like any other
generated artifact (`lifecycle_state: draft` + `promotion_state: staged`); it is the operator's
worklist, not an automatic remediation.

## Integration Points

| Skill | Integration |
|-------|------------|
| PPM Agent | Consumes [ARTIFACT_GAP] tags; receives context for gap-detected artifacts |
| Tracker Manager | Reads current tracker state for evidence and context |
| Daily Status | Produces daily status updates (delegates to Daily Status skill) |
| Weekly Roll-Up | Produces weekly summaries (delegates to Weekly Roll-Up skill) |
| Comms Writer | Delegates communication artifacts for domain-specific drafting |
| Delivery Engine | Delegates testing, sprint, and release artifacts |
| Technical Analyst | Delegates FDD reviews, integration analysis, technical risk assessment |
| Process Designer | Delegates process documentation, requirements, gap analysis |
| Change Management | Delegates change impact, training, readiness, hypercare artifacts |
| File Router | Artifact health checks can trigger File Router to locate missing source documents |

## What This Skill Does NOT Do

- **Does not promote without approval.** All artifacts stage in _generated/ first.
- **Does not modify Tier 1 artifacts directly.** Governance documents, FDDs, RAID logs —
  these are stakeholder-owned. The Artifact Generator produces drafts or updates that the
  user promotes.
- **Does not replace specialist skills.** When a specialist skill is listed in the catalog,
  the Artifact Generator routes to that skill for domain depth. It does not attempt to
  replicate specialist expertise.
- **Does not produce artifacts without context.** If PROJECT.md and operational trackers
  are not available, it asks the user to provide project context before proceeding.
- **Does not fabricate data.** If data is missing, it labels assumptions and proposes
  values — it does not invent metrics, dates, or attribution.
- **Does not produce technical-documentation or PRD/feature-spec artifacts.** Tech-docs
  (API docs, README, architecture docs, runbooks, onboarding guides, technical reference)
  and product-requirement artifacts (PRDs, new-feature user stories, acceptance-criteria,
  success-metric definitions) are out of catalog scope. It routes them to the purpose-built
  Anthropic skills (`engineering/documentation`, `product-management/feature-spec`) per
  [`references/tech-doc-routing.md`](references/tech-doc-routing.md) /
  [`references/prd-routing.md`](references/prd-routing.md) and re-ingests the result
  via Wrapper Mode — it does not self-produce a near-miss from a PMO template.
- **Does not mutate wrapped content in Wrapper Mode.** Wrapper Mode is a metadata-prepend
  + stage of an externally-produced artifact; it never rewrites the artifact body. If the
  user wants the content changed (not just staged), that is Generate / Revise — not Wrapper.

## Reversibility Discipline

This skill produces **decision-class outputs** — drafted project artifacts staged for
user review, promotion recommendations, artifact-health-check Action Needed items,
specialist-routing selections, and new-type flags. Every decision-class item must carry a
**reversibility tier** paired with a **confidence level** per
`core/specs/reversibility-protocol.md`.

**Decision-class outputs in this skill:**

- Step 4 (Produce the Artifact) — the artifact content itself, which the user is expected to act on via PROMOTE / REVISE / REJECT. The artifact staging in _generated/ is the skill's proposal; the user's promotion is the decision the skill recommends.
- Step 6 (Present for Review) — the `Actions available: PROMOTE / REVISE / REJECT` framing with the summary serves as an explicit decision frame.
- Artifact Health Check — the Action Needed column for each artifact (missing, stale, phase-gate-gap, pending-review) is a recommendation the user must act on.
- Specialist routing decisions — when the artifact type is ambiguous, the skill's selection of the closest catalog entry (with `confidence: MEDIUM` note) is a decision the user may override.
- `[NEW_TYPE]` flag proposals — proposal that a new artifact type be added to the catalog if it recurs.
- Auto-archive notifications — items moved to `_archived/` are flagged for user recovery decision.

**Tier vocabulary (undo threshold + stakeholder impact):**

- **CHEAP** (undo in hours) — a draft artifact staged in _generated/ that nobody has reviewed; a specialist-routing selection flagged with MEDIUM confidence; a NEW_TYPE proposal attached to a draft; a health-check Action Needed item surfaced internally only. State the tier. Proceed.
- **MODERATE** (undo in days, minor data loss acceptable) — a drafted artifact circulated to the TPM for review before PROMOTE; a promotion proposal awaiting user action; a health-check stale-artifact flag that prompts review; a proposed update to an existing artifact not yet applied. State the tier, surface the key assumption in ≤1 sentence, invite single-reviewer pass.
- **EXPENSIVE** (undo in weeks, stakeholder impact) — a promoted artifact that has been moved into a Tier 1 target folder (1-Governance/, 2-Delivery/, etc.) and consumed by downstream reviewers or used in stakeholder-facing communications; a cutover plan, go/no-go checklist, or readiness assessment whose content shapes a go-live decision; a training plan distributed to a cross-functional audience. State the tier, document rationale (≥2 sentences), state rollback plan (revert to prior version; correction note; re-stage updated version), name the affected cohort (stakeholder audience, dependent project leads, customer success).
- **IRREVERSIBLE** (cannot undo) — a promoted artifact delivered to an 

…(truncated)
