Adopt govctl in an existing project. Discovers undocumented decisions, backfills ADRs/RFCs, annotates source code. Use when: (1) Project has no governance yet, (2) User mentions migrate, adopt, onboard, or brownfield
Scanned 6/5/2026
Install via CLI
openskills install govctl-org/govctl---
name: migrate
description: "Adopt govctl in an existing project. Discovers undocumented decisions, backfills ADRs/RFCs, annotates source code. Use when: (1) Project has no governance yet, (2) User mentions migrate, adopt, onboard, or brownfield"
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, TodoWrite
argument-hint: [optional scope hint, e.g. "focus on database decisions"]
---
# /migrate — Adopt govctl in an Existing Project
Migrate an existing codebase to govctl governance per [[ADR-0032]].
**Purpose:** Systematically discover undocumented decisions and specifications in an existing project, codify them as govctl artifacts, and annotate source code with cross-references.
**Outputs:** Discovery report, backfilled governance artifacts, annotated source references, and an initial governed baseline.
**Properties:**
- **Interactive** — Confirms discoveries with the user before creating artifacts
- **Incremental** — Each phase can be run independently; partial migration is valid
- **Non-destructive** — Never overwrites existing files; only adds governance artifacts
## Critical Rules
1. This is a historical backfill workflow, not an implementation workflow.
2. Do not create work items during discovery or backfill phases unless you are establishing baseline tracking for already in-progress work.
3. Ask permission before lifecycle-owned verbs used in migration: `govctl adr accept`, `govctl rfc finalize`, and `govctl rfc advance`.
4. Never edit governed files directly. Use `govctl` verbs only.
5. Use `/commit` to record migration milestones. Do not embed raw VCS procedures in this workflow.
6. If migration uncovers unresolved design questions for future work, hand them off to `/discuss` rather than inventing rationale.
---
## QUICK REFERENCE
```bash
# Scaffold
govctl init # Initialize governance structure
govctl status # Verify setup
# Backfill ADRs
govctl adr new "<decision title>"
govctl adr set <ADR-ID> context --stdin <<'EOF' ... EOF
govctl adr add <ADR-ID> alternatives "Chosen option: ..." --pro "..." --con "..."
govctl adr tick <ADR-ID> alternatives --at 0 -s accepted
govctl adr add <ADR-ID> alternatives "Rejected option: ..." --pro "..." --con "..." --reject-reason "Why this was not chosen"
govctl adr tick <ADR-ID> alternatives --at 1 -s rejected
govctl adr set <ADR-ID> decision --stdin <<'EOF' ... EOF
govctl adr set <ADR-ID> consequences --stdin <<'EOF' ... EOF
govctl adr accept <ADR-ID>
# Backfill RFCs (optional)
govctl rfc new "<spec title>"
govctl clause new <RFC-ID>:C-<NAME> "<title>" -s "Specification" -k normative
govctl clause edit <RFC-ID>:C-<NAME> text --stdin <<'EOF' ... EOF
govctl rfc finalize <RFC-ID> normative
govctl rfc advance <RFC-ID> impl
govctl rfc advance <RFC-ID> test
govctl rfc advance <RFC-ID> stable
# Validate
govctl check
```
---
## PHASE 0: SCAFFOLD
### 0.1 Initialize govctl
```bash
govctl init
```
This creates the `gov/` directory structure alongside existing project files. It is safe to run in an existing repo — it does not overwrite existing files.
### 0.2 Verify Setup
```bash
govctl status
```
Confirm the governance structure was created. Read `gov/config.toml` and adjust if needed (e.g., `source_scan.include` patterns for the project's language).
### 0.3 Detect VCS
If migration milestones should be recorded, `/commit` will choose the raw VCS workflow.
### 0.4 Initial Commit
If the user wants to record scaffold creation, use `/commit` with `chore(gov): initialize govctl governance structure`.
---
## PHASE 1: DISCOVER
Systematically scan the project to find implicit governance artifacts. **Do not create any govctl artifacts yet** — this phase is purely discovery.
### 1.1 Read Project Overview
Read these files (if they exist) to understand the project:
- `README.md` — Project purpose, tech stack, architecture overview
- `CONTRIBUTING.md` — Development conventions and processes
- `ARCHITECTURE.md` or `docs/architecture.md` — System design
- `CHANGELOG.md` — History of changes and decisions
- `Makefile`, `Justfile`, `package.json`, `Cargo.toml` — Build system and dependencies
### 1.2 Discover Architectural Decisions
Scan for implicit decisions in:
| Source | What to look for |
| ------------------- | ------------------------------------------------------------------------------------ |
| README/docs | "We chose X because...", "This project uses..." |
| Config files | Framework choices, database configs, deployment targets |
| Dependencies | Major library choices (ORM, web framework, test framework) |
| Directory structure | Architectural patterns (monorepo, microservices, MVC, hexagonal) |
| Code comments | "TODO: migrate to...", "HACK: because X doesn't support...", "We use X instead of Y" |
| Git/jj history | Large refactors, technology migrations, design pivots |
For each discovered decision, note:
- **What** was decided
- **Why** (if discernible from context)
- **What alternatives** existed (if known)
- **Where** in the code this decision is implemented
### 1.3 Discover Existing Specifications
Look for documents that function as specifications:
- API contracts (OpenAPI specs, GraphQL schemas, protobuf definitions)
- Design docs or RFCs in markdown
- Interface definitions or type contracts
- Formal requirements documents
### 1.4 Discover In-Progress Work
Check for:
- Open issues in the repo (if accessible)
- TODO/FIXME/HACK comments in code
- Feature branches
- Draft PRs
### 1.5 Present Discovery Report
**Present findings to the user before proceeding.** Format:
```
=== MIGRATION DISCOVERY REPORT ===
Architectural Decisions Found: N
1. [Brief description] — source: [where found]
2. ...
Existing Specifications Found: N
1. [Brief description] — source: [file path]
2. ...
In-Progress Work Found: N
1. [Brief description] — source: [where found]
2. ...
Recommended migration scope:
- ADRs to create: [list]
- RFCs to create: [list or "none"]
- Work items to create: [list or "none"]
```
**Ask the user:** Which items should be backfilled? The user may choose to skip some or prioritize others. Respect their choices.
---
## PHASE 2: BACKFILL ADRs
For each decision the user confirmed, create an ADR.
### 2.1 Create ADR
Follow the **adr-writer** skill for quality guidelines.
```bash
govctl adr new "<decision title>"
```
### 2.2 Populate Context and Consequences
```bash
govctl adr set <ADR-ID> context --stdin <<'EOF'
[Problem statement and what prompted the decision]
EOF
govctl adr set <ADR-ID> consequences --stdin <<'EOF'
### Positive
- [Observed benefits]
### Negative
- [Observed downsides or trade-offs]
### Neutral
- [Side effects]
EOF
```
### 2.3 Add Alternatives (if known)
```bash
govctl adr add <ADR-ID> alternatives "Chosen: <what was adopted>" \
--pro "..." --con "..."
govctl adr add <ADR-ID> alternatives "Rejected: <what was not chosen>" \
--pro "..." --con "..." --reject-reason "..."
govctl adr tick <ADR-ID> alternatives --at 0 -s accepted
govctl adr tick <ADR-ID> alternatives --at 1 -s rejected
```
Preserve the normal ADR discussion order during backfill when possible:
1. Record the alternatives that are still recoverable
2. Mark the chosen option `accepted`
3. Mark non-chosen options `rejected` with reasons when known
4. Only then write or finalize the `decision` prose
If non-selected alternatives are not recoverable, it is acceptable to omit `alternatives` entirely and say so explicitly in the ADR context. Historical backfills may not be able to reconstruct rejected options, and reviewers should evaluate them with that limitation in mind.
### 2.4 Write the Decision Last
```bash
govctl adr set <ADR-ID> decision --stdin <<'EOF'
We will [what was decided].
[Rationale — why this was chosen]
EOF
```
Treat `decision` as the conclusion of the reconstructed alternatives discussion, not as the starting point.
### 2.5 Review Backfilled ADRs
Invoke the **adr-reviewer** agent on each newly created ADR. For large batches, review the most important 3-5 ADRs and spot-check the rest.
Fix Critical findings before accepting the ADRs.
### 2.6 Accept and Cross-Reference
Since these are historical decisions already in effect:
```bash
govctl adr accept <ADR-ID>
govctl adr add <ADR-ID> refs <related-ADR-or-RFC>
```
### 2.7 Commit Batch
Group related ADRs into logical commits:
Use `/commit` with `docs(adr): backfill ADRs for existing architectural decisions`.
---
## PHASE 3: BACKFILL RFCs (Optional)
**Only if the user confirmed existing specifications in Phase 1.** Most migrations skip this phase.
### 3.1 Create RFC from Existing Spec
```bash
govctl rfc new "<spec title>"
```
### 3.2 Create Clauses from Existing Requirements
For each requirement in the existing specification:
```bash
govctl clause new <RFC-ID>:C-<NAME> "<title>" -s "Specification" -k normative
govctl clause edit <RFC-ID>:C-<NAME> text --stdin <<'EOF'
[Clause text extracted from existing spec, rewritten with RFC 2119 keywords]
EOF
```
### 3.3 Review Backfilled RFCs
Invoke the **rfc-reviewer** agent on each newly created RFC. For large batches, review the most important RFCs first and spot-check the rest.
Fix Critical findings before making the RFC authoritative.
### 3.4 Finalize and Advance
Migration is a historical backfill workflow. Only finalize and advance the RFC after the user confirms the spec is already implemented and tested:
```bash
govctl rfc finalize <RFC-ID> normative
govctl rfc advance <RFC-ID> impl
govctl rfc advance <RFC-ID> test
govctl rfc advance <RFC-ID> stable
```
### 3.5 Commit
Use `/commit` with `docs(rfc): backfill RFCs for existing specifications`.
---
## PHASE 4: ANNOTATE SOURCE
Add `[[...]]` references to existing source code so `govctl check` can trace implementations to their governing artifacts.
### 4.1 Scan and Annotate
For each newly created ADR/RFC, find the source files that implement the decision or specification:
```bash
# Example: if ADR-0001 decided to use PostgreSQL
# Find database-related files and add reference comments:
```
Add comments in the project's comment style:
```python
# Per [[ADR-0001]], we use PostgreSQL for persistence
```
```rust
// Implements [[RFC-0001:C-VALIDATION]]
```
```typescript
// Per [[ADR-0003]], API responses use camelCase
```
### 4.2 Validate References
```bash
govctl check
```
Fix any broken references. All `[[...]]` references must resolve to existing artifacts.
### 4.3 Commit
Use `/commit` with `chore(gov): annotate source with governance artifact references`.
---
## PHASE 5: ESTABLISH BASELINE
Create work items for any in-progress work discovered in Phase 1.
### 5.1 Create Work Items
For each active task:
```bash
govctl work new --active "<task title>"
govctl work set <WI-ID> description "<what is being done>"
govctl work add <WI-ID> acceptance_criteria "add: <expected outcome>"
govctl work add <WI-ID> refs <related-ADR-or-RFC>
```
### 5.2 Establish Tag Vocabulary (Optional)
If the project benefits from cross-cutting categorization, set up a tag vocabulary and tag the backfilled artifacts:
```bash
govctl tag new "architecture"
govctl tag new "security"
govctl tag new "performance"
govctl adr add <ADR-ID> tags "architecture"
govctl rfc add <RFC-ID> tags "security"
```
Skip this step if tagging is not needed yet — it can be adopted incrementally later.
### 5.3 Final Validation
```bash
govctl check
govctl render
```
### 5.4 Final Commit
Use `/commit` with `chore(gov): establish govctl governance baseline`.
---
## PHASE 6: SUMMARY
Present the migration results:
```
=== MIGRATION COMPLETE ===
Project: <project name>
Artifacts created:
ADRs: N (documenting existing architectural decisions)
RFCs: N (codifying existing specifications)
Work Items: N (tracking in-progress tasks)
Source annotations: N files annotated with [[...]] references
Validation: govctl check passes
Next steps:
- Use /gov for all new work going forward
- Use /discuss for new design decisions
- Incrementally annotate more source files as you touch them
- Run govctl check in CI to enforce governance going forward
```
---
## TIPS
### Prioritization
Not everything needs an ADR. Focus on decisions that:
- **Affect multiple developers** (framework choice, API conventions)
- **Are hard to reverse** (database choice, authentication strategy)
- **Generate recurring questions** ("Why do we use X instead of Y?")
Skip trivial decisions (indentation style, variable naming) — those belong in a linter config, not an ADR.
### Handling Uncertainty
When discovering decisions:
- If you can identify the decision but not the rationale → say so in the context. "The rationale is not documented; this ADR records the current state."
- If alternatives are unknown → omit `alternatives` and say in the ADR context that non-selected options were not recoverable.
- If alternatives are known → capture them first and let the decision prose summarize the conclusion, rather than skipping straight to the final answer.
- If consequences are unclear → document what you can observe. "The negative consequences of this decision have not been formally evaluated."
### Incremental Migration
It's fine to migrate in stages:
- **Week 1:** Scaffold + top 5 most important ADRs
- **Week 2:** Annotate the most-touched modules
- **Later:** Backfill as you encounter undocumented decisions during regular work
The `/gov` workflow naturally extends migration — every new decision gets an ADR, every new feature gets a work item.
No comments yet. Be the first to comment!