What this skill does
factory-init orchestrates the unified brownfield bootstrap: one command that reverse-engineers an existing codebase onto all three project-memory layers and measures how well they align with the code.
It coordinates the leaf lifecycle skills directly — product-init, product-clarify, product-implement, product-analyze, architect-init, architect-clarify, architect-implement, architect-analyze, change-init, change-clarify, change-publish — never the peer orchestrators factory-product / factory-architect / factory-learn.
Its own final step, the sweep, is the only cross-layer analysis in the factory: it builds the coverage matrix (.adlc/coverage/coverage.md) — a feature-area pivot plus the four traceability relations PDR↔ADR, PDR↔code, ADR↔code, ChDR↔code — and diffs it against the previous sweep to detect drift.
It operates as a Kind-A DAG orchestrator in alignment with the shared executor engine contract in factory-mission/references/executor.md.
Scope boundary: project-local memory only (PDR, ADR, ChDR + code). Team context directives (CDR / team-init) are NOT bootstrapped here — they publish to the external team-ai-directives repo and are owned by factory-learn. The sweep's final output includes a prose recommendation to run factory-learn / /team-init for reusable patterns spotted during bootstrap.
When to use
- You adopt ADLC on an existing repo (code exists, no/partial PDRs, ADRs, ChDRs) and want the full bootstrap in one run.
- You want a recurring cross-layer alignment audit (
--refresh): which decisions are undocumented, which code is undecreed, where product and architecture disagree.
When NOT to use:
- Greenfield / empty project → run
factory-productandfactory-architect(specify routes) instead. - Single-layer work →
factory-product/factory-architect/factory-learndirectly. - CDR / team-directives contribution →
factory-learn. - Feature implementation →
factory-mission.
Route Classification
| Condition | Route |
|---|---|
| Code exists, no memory records | Bootstrap (full pipeline) |
.adlc/coverage/coverage.md exists, or --refresh |
Refresh (sweep only) |
| Partial state | Bootstrap with per-layer skip (below) |
| No code | Halt: greenfield — use factory-product / factory-architect specify routes |
Per-layer skip — each track classifies independently; a layer whose memory AND compiled artifact both exist skips its init/implement and runs only its analyze:
| Layer | Skip init/implement when | Always runs |
|---|---|---|
| product | docs/adlc/memory/pdr/ (legacy .adlc/memory/pdr/ fallback — either non-empty) AND docs/adlc/product/PRD.md exists |
product-analyze |
| architecture | docs/adlc/memory/adr/ (legacy .adlc/memory/adr/ fallback — either non-empty) AND docs/adlc/architect/AD.md exists |
architect-analyze |
| change | docs/adlc/memory/chdr/ (legacy .adlc/memory/chdr/ fallback — either non-empty) AND docs/adlc/memory/chdr.md exists |
(ChDRs feed the sweep directly) |
Lifecycle DAG & Step Resolution
factory-init implements a fixed named-skill DAG (fixed step resolution). Tracks run sequentially — each track completes before the next starts. Rationale: the human gets one coherent review session per domain; architect-clarify reads the accepted PDR decisions as context (architecture serves product); the sweep receives the most mature inputs.
Bootstrap Route (12 steps, 3 clarify gates + final matrix review)
| # | Step | Skill | Phase | output_type |
|---|---|---|---|---|
| 1 | product-init |
product-init | generate | draft (.adlc/drafts/pdr/) |
| 2 | product-clarify⭐ |
product-clarify | clarify | decision |
| 3 | product-implement |
product-implement | build | artifact-ref (docs/adlc/product/PRD.md) |
| 4 | architect-init |
architect-init | generate | draft (.adlc/drafts/adr/) |
| 5 | architect-clarify⭐ |
architect-clarify (reads accepted PDR list) | clarify | decision |
| 6 | architect-implement |
architect-implement | build | artifact-ref (docs/adlc/architect/AD.md) |
| 7 | change-init |
change-init | generate | draft (.adlc/drafts/chdr/) |
| 8 | change-clarify⭐ |
change-clarify | clarify | decision |
| 9 | change-publish |
change-publish | build | artifact-ref (docs/adlc/memory/chdr/) |
| 10 | product-analyze |
product-analyze | analyze | findings |
| 11 | architect-analyze |
architect-analyze | analyze | findings |
| 12 | sweep |
inline (this skill, §The Sweep Step) | analyze | findings (.adlc/coverage/coverage.md + history) |
Refresh Route (1 step + loop)
| # | Step | Phase | output_type |
|---|---|---|---|
| 1 | sweep (rescan + rebuild + drift diff) |
analyze | findings |
Correction Loops
product-analyze/architect-analyzeCRITICAL/HIGH → route back to their own track's clarify⭐ (executor default, bounded bymax_corrections, default 2).sweepCRITICAL/HIGH findings route by layer tag (ADR-361): every finding carries[layer: product|architecture|change|cross]and routes to the matching track's clarify (product-clarify/architect-clarify/change-clarify).crossfindings route to the track owning the cited record; ambiguous → halt for the human (hybrid gate). Bounded bymax_corrections.
The Sweep Step (inline composite step)
The sweep is executed by this orchestrator (step skill: factory-init, prompt = this section), not by a leaf skill.
Inputs (all read-only)
| Source | Yields |
|--|
| product-init + architect-init setup scripts (re-run; idempotent JSON scanners) | sub-systems, feature-areas, tech stack |
| docs/adlc/memory/{pdr,adr,chdr}/ (legacy .adlc/memory/ fallback, + indexes) | accepted decisions per layer |
| docs/adlc/product/PRD.md, docs/adlc/architect/AD.md | compiled artifacts |
| .adlc/coverage/coverage.md (if exists) | previous matrix → drift diff |
Output: .adlc/coverage/coverage.md (+ history/<date>-<run_id>.md)
1. Pivot: Area Coverage — row axis is the union of sub-systems ∪ feature-areas, reconciled by name/directory overlap with a mapping column; unreconciled rows stay separate and are flagged. Every cell cites evidence (record IDs, file paths) — no fabricated cells.
## Pivot: Area Coverage
| Area | Feature-Area | Sub-System | PDRs | ADRs | ChDRs | Code Evidence | Coverage |
|------|--------------|------------|------|------|-------|---------------|----------|
| payments | billing | payments | 3 | 1 | 4 | present (src/payments/) | 62% |
2. Relations — four pairwise, bidirectional; each section has a Coverage: N% line and gap lines citing record IDs or paths, each tagged [layer: ...]:
| Relation | Gap directions |
|---|---|
PDR↔ADR |
product decision with no architectural support; orphan ADR (no product grounding — MEDIUM, not auto-defect) |
PDR↔code |
decided-but-unimplemented; implemented-but-undocumented |
ADR↔code |
decided-but-not-reflected-in-code; code pattern without ADR |
ChDR↔code |
ChDR-dense area with no ADR (active change, no architectural record); ChDR describing code that no longer matches (superseded decision) |
PDR↔ADR mapping requires textual overlap between records — proposed, never asserted.
Every gap line uses the form:
- Gap: <description citing PDR-NNN / ADR-NNN / ChDR-NNN or a file path> [layer: product|architecture|change|cross]
3. Severity model (family standard): constitution violation = CRITICAL; accepted decision contradicted by code = HIGH; undocumented/undecided mismatches = MEDIUM; unreconciled areas, style = LOW.
4. Drift section — ## Drift vs <previous date> sweep (or ## Baseline on first sweep): new gaps, closed gaps, regressed areas. On refresh, this diff IS the report.
5. Findings output — severity-ranked summary published as output_type: findings (comment bus if tracker-integrated, else runs/<run_id>/findings/sweep.md); every finding tagged [layer: ...] for correction routing (ADR-361). The matrix file itself is the artifact; the matrix never edits records — it reports, clarify fixes.
Shared Executor Overrides
factory-init overrides the shared executor engine primitives as follows:
- Publish Target: Fixed to
local. Outputs are written to.adlc/(drafts, coverage) anddocs/adlc/(memory records,docs/adlc/product/PRD.md,docs/adlc/architect/AD.md). If tracker-integrated, atrackercompletion summary comment is also posted. - Output Types (per PDR-050): init steps →
draft; clarify⭐ →decision; implement/publish →artifact-ref; analyze + sweep →findings. - Supervision Default:
hybrid. Human gates hard-enforced at the three clarify⭐ steps (PDR, ADR, ChDR approvals) and at final coverage-matrix review. - Pre-flight Check: Verifies that the
product-*,architect-*, andchange-*lifecycle skills are installed. Team AI directives configuration is NOT required (CDR excluded);architect-init's team-directives dedup degrades gracefully if unconfigured. - Worktree / lease / heartbeat: follow the shared executor contract, as sibling orchestrators do.
- Route for CDR hand-off: after the sweep, present (prose only, no step): "Reusable patterns spotted during bootstrap → run
factory-learnor/team-init."
Deconfliction
factory-product/factory-architectbrownfield routes remain the single-layer entry points;factory-initis the unified one. Per-layer skip keeps a re-run cheap on repos that already have one layer documented.factory-learnHistorical Mining route = ongoing/incremental ChDR mining (post-incident, pre-refactor);factory-init= one-time deep bootstrap (full window). Both reuse the samechange-*leaf skills.team-init(brownfield CDR) has no factory route today — a known gap infactory-learn, out of scope here.
Red Flags
- Fabricating matrix cells — every coverage cell and gap must cite a record ID or file path. An uncited gap is context poisoning.
- Asserted PDR↔ADR mappings — mapping is proposed on textual evidence; "we think these relate" without overlap text is a fabrication.
- Silent reconciliation — merging a feature-area with a sub-system without flagging the mapping (or flagging unreconciled rows as gaps) hides product/architecture disagreement.
- Skipping clarify gates — the sweep is last because it audits ACCEPTED decisions; sweeping drafts or auto-accepted records defeats the pipeline.
- Blind correction routing — sweep findings must carry
[layer: ...]tags; routing everything to "the preceding clarify" sends product gaps to architecture review. - The matrix editing records — the sweep reports; only clarify⭐ steps modify decisions with human approval.
Verification
- All 12 bootstrap steps completed (or per-layer skip applied with reason recorded in state)
-
docs/adlc/product/PRD.md,docs/adlc/architect/AD.md,docs/adlc/memory/{pdr,adr,chdr}/populated per track -
.adlc/coverage/coverage.mdwritten with Pivot (all layer columns), four relations each withCoverage: N%, layer-tagged + cited gap lines, and Drift/Baseline section - Prior matrix archived to
.adlc/coverage/history/<date>-<run_id>.md - Every sweep finding tagged
[layer: ...]; CRITICAL/HIGH routed to the matching track's clarify (boundedmax_corrections) - Three clarify gates (product, architecture, change) plus the final matrix review fired in hybrid mode
- CDR hand-off recommendation presented in the final output
- Zero records modified by the sweep itself
Configuration
PDR_DRAFTS_DIR—{REPO_ROOT}/.adlc/drafts/pdrADR_DRAFTS_DIR—{REPO_ROOT}/.adlc/drafts/adrCHDR_DRAFTS_DIR—{REPO_ROOT}/.adlc/drafts/chdrCOVERAGE_DIR—{REPO_ROOT}/.adlc/coverage(coverage.md+history/)PRD_FILE—{REPO_ROOT}/docs/adlc/product/PRD.md|AD_FILE—{REPO_ROOT}/docs/adlc/architect/AD.md- Shared run state —
{REPO_ROOT}/.adlc/workflows/runs/<run_id>/state.jsonviaadlc-cli workflow statehelpers (ADR-395; lease/resume)
References
factory-mission/references/executor.md— shared executor contract (step schema, phases, correction loop, output types)factory-mission/references/tracker-integration.md— comment bus, marker comments, distributed lease- PDR-072 (factory-init skill — unified brownfield bootstrap + coverage matrix)
- ADR-361 (sweep layer-tagged correction routing)
- ADR-341 (workflows as graphs — fixed DAG chosen; declarative graphs remain an option)
- PDR-050 (output type classification — draft/decision/findings/artifact-ref)
factory-product/SKILL.md,factory-architect/SKILL.md,factory-learn/SKILL.md— sibling orchestrators; single-layer entry points