@warpgogol/forge 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +33 -3
- package/dist/bin/cli.js +1 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +66 -0
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/core/handlers/release-publish.js +4 -4
- package/dist/os/core/handlers/release-publish.js.map +1 -1
- package/dist/os/exploration/exploration.module.d.ts +3 -0
- package/dist/os/exploration/exploration.module.d.ts.map +1 -0
- package/dist/os/exploration/exploration.module.js +82 -0
- package/dist/os/exploration/exploration.module.js.map +1 -0
- package/dist/os/exploration/frontmatter-io.d.ts +13 -0
- package/dist/os/exploration/frontmatter-io.d.ts.map +1 -0
- package/dist/os/exploration/frontmatter-io.js +63 -0
- package/dist/os/exploration/frontmatter-io.js.map +1 -0
- package/dist/os/exploration/handlers/archive.d.ts +4 -0
- package/dist/os/exploration/handlers/archive.d.ts.map +1 -0
- package/dist/os/exploration/handlers/archive.js +135 -0
- package/dist/os/exploration/handlers/archive.js.map +1 -0
- package/dist/os/exploration/handlers/list.d.ts +4 -0
- package/dist/os/exploration/handlers/list.d.ts.map +1 -0
- package/dist/os/exploration/handlers/list.js +56 -0
- package/dist/os/exploration/handlers/list.js.map +1 -0
- package/dist/os/exploration/handlers/show.d.ts +4 -0
- package/dist/os/exploration/handlers/show.d.ts.map +1 -0
- package/dist/os/exploration/handlers/show.js +91 -0
- package/dist/os/exploration/handlers/show.js.map +1 -0
- package/dist/os/exploration/index.d.ts +7 -0
- package/dist/os/exploration/index.d.ts.map +1 -0
- package/dist/os/exploration/index.js +17 -0
- package/dist/os/exploration/index.js.map +1 -0
- package/dist/os/exploration/types.d.ts +38 -0
- package/dist/os/exploration/types.d.ts.map +1 -0
- package/dist/os/exploration/types.js +23 -0
- package/dist/os/exploration/types.js.map +1 -0
- package/dist/os/rfc/handlers/validate-rules.d.ts +5 -4
- package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
- package/dist/os/rfc/handlers/validate-rules.js +41 -6
- package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
- package/dist/os/rfc/handlers/validate.d.ts.map +1 -1
- package/dist/os/rfc/handlers/validate.js +5 -2
- package/dist/os/rfc/handlers/validate.js.map +1 -1
- package/dist/os/rfc/index.d.ts +2 -2
- package/dist/os/rfc/index.d.ts.map +1 -1
- package/dist/os/rfc/index.js +1 -1
- package/dist/os/rfc/index.js.map +1 -1
- package/dist/os/rfc/types.d.ts +13 -0
- package/dist/os/rfc/types.d.ts.map +1 -1
- package/dist/os/rfc/types.js +1 -0
- package/dist/os/rfc/types.js.map +1 -1
- package/dist/os/spec/live-spec-list.d.ts +4 -0
- package/dist/os/spec/live-spec-list.d.ts.map +1 -0
- package/dist/os/spec/live-spec-list.js +64 -0
- package/dist/os/spec/live-spec-list.js.map +1 -0
- package/dist/os/spec/live-spec-merge.d.ts +4 -0
- package/dist/os/spec/live-spec-merge.d.ts.map +1 -0
- package/dist/os/spec/live-spec-merge.js +345 -0
- package/dist/os/spec/live-spec-merge.js.map +1 -0
- package/dist/os/spec/live-spec-show.d.ts +4 -0
- package/dist/os/spec/live-spec-show.d.ts.map +1 -0
- package/dist/os/spec/live-spec-show.js +99 -0
- package/dist/os/spec/live-spec-show.js.map +1 -0
- package/dist/os/spec/live-spec-types.d.ts +71 -0
- package/dist/os/spec/live-spec-types.d.ts.map +1 -0
- package/dist/os/spec/live-spec-types.js +14 -0
- package/dist/os/spec/live-spec-types.js.map +1 -0
- package/dist/os/spec/live-spec-validate.d.ts +4 -0
- package/dist/os/spec/live-spec-validate.d.ts.map +1 -0
- package/dist/os/spec/live-spec-validate.js +140 -0
- package/dist/os/spec/live-spec-validate.js.map +1 -0
- package/dist/os/spec/spec.module.d.ts.map +1 -1
- package/dist/os/spec/spec.module.js +54 -2
- package/dist/os/spec/spec.module.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/os/rfc/rfc-0000-template.md +5 -0
- package/package.json +9 -1
- package/skills/fo/fo-design-summit/SKILL.md +240 -0
- package/skills/fo/fo-explore/SKILL.md +145 -0
- package/skills/fo/fo-idea/SKILL.md +10 -0
- package/skills/fo/fo-idea-audit/SKILL.md +1 -0
- package/skills/fo/fo-idea-create-rfc/SKILL.md +3 -0
- package/skills/fo/fo-idea-enhance/SKILL.md +3 -2
- package/skills/fo/fo-idea-implement/SKILL.md +9 -4
- package/skills/fo/fo-idea-plan/SKILL.md +10 -0
- package/skills/fo/fo-session-retro/SKILL.md +10 -5
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fo-design-summit
|
|
3
|
+
description: Simulate a multi-persona design discussion for complex RFCs. Each persona reviews from its professional perspective and raises concerns. Optional, invoked for high-risk architectural RFCs.
|
|
4
|
+
invocation: user
|
|
5
|
+
category: fo
|
|
6
|
+
concerns: document-only
|
|
7
|
+
dependsOn: ['my-preferences', 'fo-idea-audit']
|
|
8
|
+
languagePolicy: ref(PREFERENCES.md)
|
|
9
|
+
bindings:
|
|
10
|
+
requires: [paths.invariantsFile]
|
|
11
|
+
optional: []
|
|
12
|
+
triggers: ["design summit", "multi-persona review", "party mode"]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Design Summit
|
|
16
|
+
|
|
17
|
+
Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
|
|
18
|
+
|
|
19
|
+
See `_shared/fo-pipeline-conventions.md` §Language policy.
|
|
20
|
+
|
|
21
|
+
A multi-persona design review for complex RFCs. The summit simulates five professional perspectives — Architect, Security Engineer, QA Engineer, Product Manager, and Developer Advocate — to surface issues that a single-perspective review misses. Each persona reviews the RFC from its professional lens and raises concerns. The operator sees all perspectives and makes the final decision.
|
|
22
|
+
|
|
23
|
+
The summit is **optional** — invoked manually by the operator or suggested by `fo-idea-plan` for RFCs that meet complexity criteria. It is not part of the default pipeline.
|
|
24
|
+
|
|
25
|
+
The summit is `concern: document-only` — it writes a summit report to `docs/summits/` and does not modify the RFC or any source code.
|
|
26
|
+
|
|
27
|
+
## Process
|
|
28
|
+
|
|
29
|
+
### 1. Identify the RFC
|
|
30
|
+
|
|
31
|
+
The user may provide:
|
|
32
|
+
|
|
33
|
+
- **A single RFC**: `RFC-XXXX`, a filename, or a path.
|
|
34
|
+
- **Nothing**: if an RFC file is open in the IDE, use it. Otherwise, ask.
|
|
35
|
+
|
|
36
|
+
### 2. Prerequisite checks
|
|
37
|
+
|
|
38
|
+
Before running the summit, perform these checks **in order**:
|
|
39
|
+
|
|
40
|
+
1. **Prefix check** — if the id starts with `ADR-`, stop with message: `ADR-XXXX is an ADR. Design summits are for RFCs only. ADRs use the accepted-decision fast path.`
|
|
41
|
+
2. **RFC file exists** — look for `docs/rfcs/rfc-XXXX-*.md`. If no file is found, stop with message: `RFC-XXXX not found in docs/rfcs/.`
|
|
42
|
+
3. **Terminal status check** — read the RFC's `status` frontmatter. If the status is `implemented`, `rejected`, or `superseded`, stop with message: `RFC-XXXX is <status> (terminal). Terminal RFCs cannot be reviewed in a summit.`
|
|
43
|
+
|
|
44
|
+
If all checks pass, proceed to step 3.
|
|
45
|
+
|
|
46
|
+
### 3. Read the RFC and related context
|
|
47
|
+
|
|
48
|
+
Read the target RFC file and its related context:
|
|
49
|
+
|
|
50
|
+
- `ref(forge.yaml bindings.paths.invariantsFile)` — all DNA invariants referenced in the RFC's `satisfies[]` or `related[]`.
|
|
51
|
+
- Each RFC listed in `amends[]`, `supersedes[]`, `related[]` — read enough to understand what this RFC builds on or changes.
|
|
52
|
+
- The closest `AGENTS.md` for the RFC's scope.
|
|
53
|
+
|
|
54
|
+
### 4. Read the audit report (if available)
|
|
55
|
+
|
|
56
|
+
Look for `docs/audits/audit-rfc-XXXX-*.md`. If an audit report exists, read it to avoid duplicating findings. The summit complements the audit — it does not repeat it.
|
|
57
|
+
|
|
58
|
+
If no audit report exists, proceed without it. Note this in the summit report: persona findings may overlap with future audit findings.
|
|
59
|
+
|
|
60
|
+
### 5. Run each persona
|
|
61
|
+
|
|
62
|
+
For each of the five personas, the agent:
|
|
63
|
+
|
|
64
|
+
1. Adopts the persona's perspective and review focus.
|
|
65
|
+
2. Reads the RFC from that perspective.
|
|
66
|
+
3. Produces a persona report with findings (concerns, questions, recommendations).
|
|
67
|
+
|
|
68
|
+
#### Persona: Architect
|
|
69
|
+
|
|
70
|
+
**Focus:** Structural integrity, DNA alignment, coupling.
|
|
71
|
+
|
|
72
|
+
**Key questions:**
|
|
73
|
+
|
|
74
|
+
- Does this create hidden dependencies between packages or services?
|
|
75
|
+
- Which DNA invariants are affected? Does the RFC explain how it enforces or protects each one?
|
|
76
|
+
- Will this decision be reversible? If not, is the irreversibility justified?
|
|
77
|
+
- Does the RFC propose a new package, command, or lifecycle that could be a flag on an existing one?
|
|
78
|
+
|
|
79
|
+
#### Persona: Security Engineer
|
|
80
|
+
|
|
81
|
+
**Focus:** Attack surface, data exposure, trust boundaries.
|
|
82
|
+
|
|
83
|
+
**Key questions:**
|
|
84
|
+
|
|
85
|
+
- What new trust boundaries does this create?
|
|
86
|
+
- Are there unauthenticated paths to sensitive data?
|
|
87
|
+
- Does this leak sensitive data in logs, error messages, or generated artifacts?
|
|
88
|
+
- If the RFC touches persistence, does it introduce cookies or client-side storage outside the established policy?
|
|
89
|
+
|
|
90
|
+
#### Persona: QA Engineer
|
|
91
|
+
|
|
92
|
+
**Focus:** Testability, failure modes, edge cases.
|
|
93
|
+
|
|
94
|
+
**Key questions:**
|
|
95
|
+
|
|
96
|
+
- How do we test this? What is the test seam — unit, integration, or both?
|
|
97
|
+
- What are the failure modes? What happens under partial failure?
|
|
98
|
+
- Does the RFC consider empty states (new app with no content, package with no manifests)?
|
|
99
|
+
- Are acceptance criteria checkable by an agent or human?
|
|
100
|
+
|
|
101
|
+
#### Persona: Product Manager
|
|
102
|
+
|
|
103
|
+
**Focus:** User impact, rollout risk, scope.
|
|
104
|
+
|
|
105
|
+
**Key questions:**
|
|
106
|
+
|
|
107
|
+
- Does this solve the stated problem? Is the problem statement grounded in a real user need?
|
|
108
|
+
- What is the rollout impact on existing users? Is there a migration path?
|
|
109
|
+
- Is the scope right — too broad, too narrow, or correctly bounded?
|
|
110
|
+
- Are `nonGoals` explicit and meaningful?
|
|
111
|
+
|
|
112
|
+
#### Persona: Developer Advocate
|
|
113
|
+
|
|
114
|
+
**Focus:** Agent clarity, onboarding, documentation.
|
|
115
|
+
|
|
116
|
+
**Key questions:**
|
|
117
|
+
|
|
118
|
+
- Can a new agent understand and implement this RFC without external context?
|
|
119
|
+
- Is the RFC self-contained, or does it reference implicit assumptions?
|
|
120
|
+
- Are there terms or concepts that need a glossary entry?
|
|
121
|
+
- Does the RFC's `Implementation notes for agents` section provide explicit behavioral rules?
|
|
122
|
+
|
|
123
|
+
### 6. Synthesize
|
|
124
|
+
|
|
125
|
+
Present all persona reports in a single summit document, highlighting:
|
|
126
|
+
|
|
127
|
+
- **Consensus findings** — concerns raised by 2+ personas (high priority).
|
|
128
|
+
- **Unique findings** — concerns raised by a single persona (medium priority).
|
|
129
|
+
- **No concerns** — personas that found no issues (confidence signal).
|
|
130
|
+
|
|
131
|
+
Deduplicate overlapping concerns. When two personas raise the same issue from different angles, merge them into a consensus finding.
|
|
132
|
+
|
|
133
|
+
### 7. Persist the summit report
|
|
134
|
+
|
|
135
|
+
Write `docs/summits/summit-<rfc-id>.md` with the full discussion.
|
|
136
|
+
|
|
137
|
+
#### Summit report format
|
|
138
|
+
|
|
139
|
+
```markdown
|
|
140
|
+
---
|
|
141
|
+
rfc: RFC-XXXX
|
|
142
|
+
createdAt: YYYY-MM-DD
|
|
143
|
+
personas: [architect, security, qa, pm, dev-advocate]
|
|
144
|
+
consensusFindings: <count>
|
|
145
|
+
uniqueFindings: <count>
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
# Design Summit: RFC-XXXX
|
|
149
|
+
|
|
150
|
+
## Architect
|
|
151
|
+
|
|
152
|
+
### Findings
|
|
153
|
+
- **A1 (concern):** <finding text>
|
|
154
|
+
- **A2 (question):** <finding text>
|
|
155
|
+
|
|
156
|
+
### No concerns
|
|
157
|
+
- <what the architect found well-designed>
|
|
158
|
+
|
|
159
|
+
## Security Engineer
|
|
160
|
+
|
|
161
|
+
### Findings
|
|
162
|
+
- **S1 (concern):** <finding text>
|
|
163
|
+
|
|
164
|
+
## QA Engineer
|
|
165
|
+
|
|
166
|
+
### Findings
|
|
167
|
+
- **Q1 (concern):** <finding text>
|
|
168
|
+
|
|
169
|
+
## Product Manager
|
|
170
|
+
|
|
171
|
+
### Findings
|
|
172
|
+
- **P1 (concern):** <finding text>
|
|
173
|
+
|
|
174
|
+
## Developer Advocate
|
|
175
|
+
|
|
176
|
+
### Findings
|
|
177
|
+
- **D1 (question):** <finding text>
|
|
178
|
+
|
|
179
|
+
## Consensus findings
|
|
180
|
+
|
|
181
|
+
- **A1 + D1 (2 personas):** <merged finding and recommendation>
|
|
182
|
+
|
|
183
|
+
## Recommendation
|
|
184
|
+
|
|
185
|
+
<proceed to acceptance | revise the RFC | run fo-explore for unresolved questions>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
The report must include the disclaimer: "No findings does not mean no issues — it means no issues were found from these five perspectives."
|
|
189
|
+
|
|
190
|
+
### 8. Suggest actions
|
|
191
|
+
|
|
192
|
+
Recommend whether to:
|
|
193
|
+
|
|
194
|
+
- **Proceed to acceptance** — if no consensus findings and unique findings are minor.
|
|
195
|
+
- **Revise the RFC** — if consensus findings or significant unique findings exist. Route through `fo-idea-enhance` as audit-style findings.
|
|
196
|
+
- **Run `fo-explore`** — if unresolved questions require deeper exploration before revision.
|
|
197
|
+
|
|
198
|
+
### 9. Commit
|
|
199
|
+
|
|
200
|
+
Commit the summit report. This is **mandatory** — the report must be committed, not left in the working tree.
|
|
201
|
+
|
|
202
|
+
Commit message format:
|
|
203
|
+
|
|
204
|
+
```txt
|
|
205
|
+
summit: RFC-XXXX <short description>
|
|
206
|
+
|
|
207
|
+
Multi-persona design summit for RFC-XXXX (<title>). <count> consensus findings, <count> unique findings.
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Stage only the summit report file — do not stage unrelated changes.
|
|
211
|
+
|
|
212
|
+
### 10. Stop
|
|
213
|
+
|
|
214
|
+
Do not modify the RFC or any other file. Do not run `/fo-idea-enhance` or `/fo-idea-plan` — those are separate skills. Present the summit report and stop. If the user asks to fix findings, suggest running `/fo-idea-enhance`.
|
|
215
|
+
|
|
216
|
+
## Invocation criteria
|
|
217
|
+
|
|
218
|
+
`fo-design-summit` is invoked explicitly by the operator or suggested by `fo-idea-plan` when the RFC meets **any** of these criteria:
|
|
219
|
+
|
|
220
|
+
- `kind: architecture` AND `scope: workspace`
|
|
221
|
+
- `satisfies[]` includes 2+ DNA invariants
|
|
222
|
+
- The RFC introduces a new package, new command family, or new lifecycle
|
|
223
|
+
- The RFC supersedes an implemented RFC
|
|
224
|
+
- The operator explicitly requests it
|
|
225
|
+
|
|
226
|
+
## Failure modes
|
|
227
|
+
|
|
228
|
+
- **RFC not found:** The skill errors if the target RFC does not exist.
|
|
229
|
+
- **Audit not run yet:** The skill proceeds without the audit report — persona findings may overlap with future audit findings. The skill notes this in the report.
|
|
230
|
+
- **RFC is too small for a summit:** If the RFC body is less than 500 words, the skill warns that a summit may be overkill and proceeds only if the operator confirms.
|
|
231
|
+
- **Persona findings overlap:** Multiple personas may raise the same concern. The synthesis step deduplicates and marks consensus findings.
|
|
232
|
+
|
|
233
|
+
## Constraints
|
|
234
|
+
|
|
235
|
+
- The summit is `concern: document-only` — it must not modify the RFC, source code, or any file except the summit report in `docs/summits/`.
|
|
236
|
+
- **Commit only your own files.** Stage only the summit report. Do not stage unrelated changes. `git add -A` or `git add .` is forbidden.
|
|
237
|
+
- Personas are **simulated** by a single agent in one session. This is not multi-agent infrastructure. Each persona is a perspective shift, not a separate process.
|
|
238
|
+
- The summit report is an informational artifact, not a governance document. It does not block RFC acceptance — the operator decides whether to act on its findings.
|
|
239
|
+
- Summit findings that warrant RFC changes should be routed through `fo-idea-enhance` as audit-style findings, not applied directly by the summit skill.
|
|
240
|
+
- **No pauses for recoverable tool errors.** If a tool call fails with a recoverable error, recover autonomously: split content into smaller writes, use `edit`/`multi_edit`, and retry immediately.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fo-explore
|
|
3
|
+
description: Explore an idea in the codebase without creating an RFC or ADR. Produces a markdown exploration note in docs/explorations/. Use when weighing options before committing to a specification.
|
|
4
|
+
invocation: user
|
|
5
|
+
category: fo
|
|
6
|
+
concerns: document-only
|
|
7
|
+
dependsOn: ['my-preferences']
|
|
8
|
+
languagePolicy: ref(PREFERENCES.md)
|
|
9
|
+
bindings:
|
|
10
|
+
requires: [paths.invariantsFile]
|
|
11
|
+
optional: []
|
|
12
|
+
triggers: ["explore this idea", "let me think about this", "what are the options for", "what if we"]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Explore an idea before specification
|
|
16
|
+
|
|
17
|
+
Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
|
|
18
|
+
|
|
19
|
+
> **This is a document-only skill.** It produces exploration notes in `docs/explorations/` — nothing else. It must never modify, create, or delete source code files. It must not run build commands, tests, or validation suites. Exploration notes are not governance documents — they have no status transitions, no validation, and no acceptance step. They are informational artifacts that may precede an RFC or ADR.
|
|
20
|
+
|
|
21
|
+
## Process
|
|
22
|
+
|
|
23
|
+
### 1. Read the idea
|
|
24
|
+
|
|
25
|
+
The operator describes what they want to explore. Identify:
|
|
26
|
+
|
|
27
|
+
- **What is being explored** — the core question or idea.
|
|
28
|
+
- **Why exploration is needed** — is the operator unsure about approach, feasibility, or scope?
|
|
29
|
+
- **What constraints are known** — packages, DNA invariants, existing RFCs, timeline.
|
|
30
|
+
|
|
31
|
+
### 2. Explore the codebase
|
|
32
|
+
|
|
33
|
+
Search for relevant code, existing patterns, constraints, and dependencies. This is interactive — ask clarifying questions if the idea is vague. Use `code_search`, `grep_search`, and `read_file` to understand the current state of the codebase.
|
|
34
|
+
|
|
35
|
+
If the codebase is empty or inaccessible, document the constraint and focus on option analysis without codebase findings.
|
|
36
|
+
|
|
37
|
+
### 3. Weigh options
|
|
38
|
+
|
|
39
|
+
Present 2–5 options with trade-offs. For each option:
|
|
40
|
+
|
|
41
|
+
- **Approach** — a brief description of how the idea would be implemented.
|
|
42
|
+
- **Trade-offs** — pros and cons.
|
|
43
|
+
- **DNA alignment** — which invariants from `ref(forge.yaml bindings.paths.invariantsFile)` are relevant.
|
|
44
|
+
- **Blockers** — what needs to be resolved first (missing schema, missing command, conflicting RFC).
|
|
45
|
+
- **Estimated effort** — small / medium / large.
|
|
46
|
+
|
|
47
|
+
### 4. Assess feasibility
|
|
48
|
+
|
|
49
|
+
For each option, identify:
|
|
50
|
+
|
|
51
|
+
- **Blockers** — missing infrastructure, conflicting decisions, missing RFCs.
|
|
52
|
+
- **Required RFCs** — does this option need a new RFC or ADR before implementation?
|
|
53
|
+
- **Estimated effort** — small / medium / large.
|
|
54
|
+
|
|
55
|
+
### 5. Persist the exploration note
|
|
56
|
+
|
|
57
|
+
Write `docs/explorations/<slug>.md` using the exploration note format below. The slug must be kebab-case, lowercase, latin-only (matching the project naming convention).
|
|
58
|
+
|
|
59
|
+
If the file already exists, append a new exploration section with a timestamp header instead of overwriting.
|
|
60
|
+
|
|
61
|
+
After persisting, transition the note's `status` from `open` to `explored` by editing the frontmatter directly. This skill is `concern: document-only` and may edit `.md` files — no separate command is needed for this transition.
|
|
62
|
+
|
|
63
|
+
### 6. Suggest next steps
|
|
64
|
+
|
|
65
|
+
Recommend whether to:
|
|
66
|
+
|
|
67
|
+
- **Create an RFC** — the exploration identified a cross-workspace change that needs governance.
|
|
68
|
+
- **Create an ADR** — the exploration identified a local decision that needs recording.
|
|
69
|
+
- **Shelve the idea** — the exploration revealed blockers or insufficient value.
|
|
70
|
+
- **Explore further** — the exploration raised more questions than it answered.
|
|
71
|
+
|
|
72
|
+
## Exploration note format
|
|
73
|
+
|
|
74
|
+
```markdown
|
|
75
|
+
---
|
|
76
|
+
id: <slug>
|
|
77
|
+
title: "<exploration title>"
|
|
78
|
+
createdAt: YYYY-MM-DD
|
|
79
|
+
status: open
|
|
80
|
+
related: []
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
# Exploration: <title>
|
|
84
|
+
|
|
85
|
+
## Idea
|
|
86
|
+
|
|
87
|
+
<operator's description>
|
|
88
|
+
|
|
89
|
+
## Codebase findings
|
|
90
|
+
|
|
91
|
+
<what the agent found in the codebase — relevant files, existing patterns, constraints>
|
|
92
|
+
|
|
93
|
+
## Options
|
|
94
|
+
|
|
95
|
+
### Option 1: <name>
|
|
96
|
+
- **Approach:** <description>
|
|
97
|
+
- **Trade-offs:** <pros/cons>
|
|
98
|
+
- **DNA alignment:** <which invariants are relevant>
|
|
99
|
+
- **Blockers:** <what needs to be resolved first>
|
|
100
|
+
- **Estimated effort:** <small/medium/large>
|
|
101
|
+
|
|
102
|
+
### Option 2: <name>
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
## Recommendation
|
|
106
|
+
|
|
107
|
+
<agent's recommendation with rationale>
|
|
108
|
+
|
|
109
|
+
## Open questions
|
|
110
|
+
|
|
111
|
+
- <unresolved questions for the operator>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Frontmatter fields
|
|
115
|
+
|
|
116
|
+
| Field | Type | Description |
|
|
117
|
+
| --- | --- | --- |
|
|
118
|
+
| `id` | string | Kebab-case slug, matches filename |
|
|
119
|
+
| `title` | string | Human-readable title |
|
|
120
|
+
| `createdAt` | date | Creation date |
|
|
121
|
+
| `status` | enum | `open` (exploration in progress), `explored` (exploration complete, awaiting decision), `archived` (superseded by RFC or shelved) |
|
|
122
|
+
| `related` | string[] | RFC/ADR ids that materialized from this exploration |
|
|
123
|
+
|
|
124
|
+
## File system responsibilities
|
|
125
|
+
|
|
126
|
+
| Path | Role |
|
|
127
|
+
| ----------------------------- | ---------------------------------------- |
|
|
128
|
+
| `docs/explorations/<slug>.md` | Exploration note (created by this skill) |
|
|
129
|
+
| `docs/explorations/` | Directory for all exploration notes |
|
|
130
|
+
|
|
131
|
+
## Failure modes
|
|
132
|
+
|
|
133
|
+
- **Exploration note already exists:** Append a new exploration section with a timestamp header instead of overwriting.
|
|
134
|
+
- **Invalid slug:** Slugs must be kebab-case, lowercase, latin-only. Invalid slugs are rejected by `exploration.archive` — exit code 1.
|
|
135
|
+
- **No codebase access:** Document the constraint and focus on option analysis without codebase findings.
|
|
136
|
+
- **Slug not found:** `exploration.show` and `exploration.archive` return exit code 1 if the slug does not exist.
|
|
137
|
+
- **Already archived:** `exploration.archive` is idempotent — if the note is already `archived`, it returns exit code 0 with `previousStatus: "archived"` (no-op).
|
|
138
|
+
- **Empty directory:** `exploration.list` returns `{ explorations: [] }` with exit code 0 when `docs/explorations/` is empty or does not exist.
|
|
139
|
+
|
|
140
|
+
## Constraints
|
|
141
|
+
|
|
142
|
+
- **No source code changes.** This skill is `concern: document-only`. It may only create and edit `.md` files in `docs/explorations/`.
|
|
143
|
+
- **No governance authority.** Exploration notes are not RFCs or ADRs. They do not define contracts, policies, or decisions. They are informational artifacts.
|
|
144
|
+
- **No pipeline integration.** Exploration notes are not part of any build or validation pipeline. They are discoverable via `exploration.list` and by browsing `docs/explorations/`.
|
|
145
|
+
- **Bindings compliance.** Use `ref(forge.yaml bindings.*)` references for paths and commands — no hardcoded project literals in skill instruction lines.
|
|
@@ -39,6 +39,16 @@ Read the operator's description and identify:
|
|
|
39
39
|
|
|
40
40
|
Default to document creation. Only route to implementation if the operator explicitly says "implement" or "don't create a document, just do it".
|
|
41
41
|
|
|
42
|
+
### 1b. Explore suggestion
|
|
43
|
+
|
|
44
|
+
If the operator's description is ambiguous, exploratory, or contains phrases like "what are the options", "let me think about", "explore", or "what if we", suggest using `fo-explore` before creating an RFC. Use `ask_user_question`:
|
|
45
|
+
|
|
46
|
+
> "This sounds like an exploration rather than a settled decision. Should I explore the codebase first, or create an RFC/ADR draft directly?"
|
|
47
|
+
>
|
|
48
|
+
> Recommended option: "Explore first" — because exploration is low-commitment and the results inform a better RFC.
|
|
49
|
+
|
|
50
|
+
If the operator chooses "Explore first", invoke `/fo-explore` inline. Do not proceed to classification or document creation in this invocation — `fo-explore` will produce an exploration note and suggest next steps, which may include creating an RFC or ADR in a separate invocation.
|
|
51
|
+
|
|
42
52
|
### 1a. Accepted-decision fast path
|
|
43
53
|
|
|
44
54
|
When the operator signals that a decision is **already made** and provides justification, the skill must take a fast path. Recognition signals include:
|
|
@@ -125,6 +125,7 @@ This ecosystem is forward-only — no backward compatibility layers, no expand-t
|
|
|
125
125
|
- **Implementation notes** reference the correct governance rules: RFC-XXXX (accepted→implemented transition), RFC-XXXX (if touching agent surface), RFC-XXXX (supersede escalation on invariant conflict), RFC-XXXX (verification evidence for probe-bearing RFCs).
|
|
126
126
|
- **Anti-fabrication**: if the RFC's acceptance criteria include content authoring (prose, business records, claims), the criteria distinguish between code changes an agent can make and content that requires human authoring. The RFC must not claim content will be "auto-generated" when it requires human authoring.
|
|
127
127
|
- **Storage policy**: if the RFC touches persistence, it does not introduce cookies (`document.cookie`, `Set-Cookie`). Client-side persistence is `localStorage` only; server-side is `unstorage`.
|
|
128
|
+
- **NEEDS CLARIFICATION markers**: List all unresolved `NEEDS CLARIFICATION` markers with line numbers. If none are found, state "No unresolved markers." Markers in `draft` status are informational; markers in `reviewing`+ status are a blocking finding.
|
|
128
129
|
|
|
129
130
|
#### Axis F — Pragmatism
|
|
130
131
|
|
|
@@ -49,6 +49,7 @@ Ask the user for, or infer from context:
|
|
|
49
49
|
- **owners** — default `architecture`; confirm before using a different owner.
|
|
50
50
|
- **commands.proposed / changed / removed** — any new, modified, or removed Site OS commands.
|
|
51
51
|
- **packagesImpacted / appsImpacted** — concrete workspace names.
|
|
52
|
+
- **liveSpec** — for feature-level RFCs (not governance/policy), suggest `liveSpec: true` to auto-derive a living spec domain from `packagesImpacted[0]`, or `liveSpec: <domain>` for an explicit domain. This enables automatic delta-merge into `docs/specs/live/<domain>.md` when the RFC is implemented.
|
|
52
53
|
- **satisfies** — for `architecture` or `contract` RFCs, at least one `DNA-NN` invariant from `ref(forge.yaml bindings.paths.invariantsFile)`.
|
|
53
54
|
- **related** — relevant RFCs, DNA ids, anti-patterns, specs.
|
|
54
55
|
- **reviewer** — if the caller specifies a reviewer identity, use it. If not, default to `human:andrii-syrokomskyi` (matching the default in `os/rfc/rfc-0000-template.md` inside `@warpgogol/forge`) **only when the skill is also responsible for moving the RFC out of draft**. For a pure draft scaffold, leave `reviewers: []`.
|
|
@@ -90,6 +91,8 @@ Read the generated file and the full template (`os/rfc/rfc-0000-template.md` ins
|
|
|
90
91
|
- **Acceptance criteria** — ≥3 checkable checkboxes mapped to implementation artifacts.
|
|
91
92
|
- **Implementation notes for agents** — explicit MAY/MUST NOT rules, status-gate reminders, escalation triggers.
|
|
92
93
|
|
|
94
|
+
When a section cannot be filled with confidence, insert `> NEEDS CLARIFICATION: <question>` instead of guessing. Do not leave sections empty or fill them with speculative content. Markers are resolved during the enhance step.
|
|
95
|
+
|
|
93
96
|
### 6. Validate and report
|
|
94
97
|
|
|
95
98
|
Run:
|
|
@@ -73,9 +73,9 @@ Read the RFC's `status` frontmatter:
|
|
|
73
73
|
rfc: revert RFC-XXXX to draft for enhancement
|
|
74
74
|
|
|
75
75
|
Transition RFC-XXXX from reviewing to draft before enhance.
|
|
76
|
-
|
|
76
|
+
```
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
Stage only the RFC file. Then proceed with enhancement.
|
|
79
79
|
|
|
80
80
|
**No RFC may begin enhancement in any status other than `draft`.** The transition to `draft` is mandatory and must be committed before proceeding to step 4. (Terminal and accepted statuses are already filtered out in step 1.5.)
|
|
81
81
|
|
|
@@ -86,6 +86,7 @@ Read every finding from the audit report. For each, classify it as one of:
|
|
|
86
86
|
- **Direct fix** — the RFC text can be edited to address it: fill a placeholder section, add a missing edge case, fix a DNA reference, tighten a contract, add a failure mode, etc.
|
|
87
87
|
- **New RFC** — the finding reveals a topic that is too large or too distinct for this RFC. Examples: a new package, a new DNA invariant, a new governance policy, a new external contract. Splitting it out keeps the RFC focused and follows the ecosystem's one-decision-per-RFC principle.
|
|
88
88
|
- **Out of scope** — the finding is valid but belongs to a different RFC or a future effort. Add it to this RFC's `nonGoals` with a brief explanation and, if applicable, a `related` reference to where it will be addressed.
|
|
89
|
+
- **NC (Needs Clarification)** — Unresolved `NEEDS CLARIFICATION` markers in the RFC body. Resolution: ask the operator the question, replace the marker line with the operator's answer in the RFC body. If the operator defers, the marker remains and the RFC cannot transition to `reviewing`.
|
|
89
90
|
|
|
90
91
|
Record the classification for every finding — the summary in step 8 reports it.
|
|
91
92
|
|
|
@@ -79,9 +79,9 @@ Execute the plan's step sequence in order. For each step:
|
|
|
79
79
|
implement: RFC-XXXX step N — <step title>
|
|
80
80
|
|
|
81
81
|
<one-line description of what was done in this step>.
|
|
82
|
-
|
|
82
|
+
```
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
Stage only the files touched by this step. Do not stage unrelated changes — another agent may be working in a different session.
|
|
85
85
|
|
|
86
86
|
**Implementation principles:**
|
|
87
87
|
|
|
@@ -151,6 +151,7 @@ Read the RFC's `## Acceptance criteria` section. For each checkbox:
|
|
|
151
151
|
3. **If a criterion is not met**, implement the missing work, commit it, and re-verify.
|
|
152
152
|
4. **Annotate every `[x]` with inline evidence** — add `(evidence: <file-path:line>, <test-or-command>)` to each checked criterion. This is enforced by V-27.
|
|
153
153
|
5. **If a criterion cannot be met** (e.g., requires an external dependency not yet available, requires a pilot that is not registered), do NOT mark it `[x]` and do NOT stamp `implemented`. Instead, split the deferred work into a follow-up RFC via `rfc.supersede.propose`. An RFC with unchecked `[ ]` criteria cannot transition to `implemented` — this is enforced by V-26.
|
|
154
|
+
6. **Ensure `reviewers` is non-empty** — `rfc.validate` enforces V-25: implemented RFCs with an empty `reviewers` field fail validation. Add at least one reviewer (e.g. `human:<name>`) before stamping `implemented`.
|
|
154
155
|
|
|
155
156
|
Do not proceed to step 3.7 until every acceptance criterion checkbox is checked with evidence.
|
|
156
157
|
|
|
@@ -168,6 +169,8 @@ If the RFC was created on or after 2026-07-07 and has acceptance probes:
|
|
|
168
169
|
ref(forge.yaml bindings.commands.validateRfc) --verification.emit --id RFC-XXXX
|
|
169
170
|
```
|
|
170
171
|
|
|
172
|
+
**Note:** If acceptance probes are commented out (`# acceptance:`) in the RFC frontmatter, `rfc.verification.emit` silently skips creating an evidence file (`filesModified: []`, zero errors). This is expected behavior — RFCs with commented-out probes get no evidence file, and `rfc.implement.stamp` still works without it.
|
|
173
|
+
|
|
171
174
|
Commit the evidence file:
|
|
172
175
|
|
|
173
176
|
```txt
|
|
@@ -183,7 +186,7 @@ Stage `docs/rfcs/verification/rfc-xxxx.generated.json`.
|
|
|
183
186
|
Transition the RFC to `implemented` using the `rfc.implement.stamp` command. Direct edits to `status`, `implementedAt`, and `updatedAt` are prohibited for all actors.
|
|
184
187
|
|
|
185
188
|
1. Ensure the working tree is clean (all implementation changes committed).
|
|
186
|
-
2. Identify the implementation commit SHA — the
|
|
189
|
+
2. Identify the implementation commit SHA — use the **first** `implement:` commit (the commit where implementation began), not the latest fix or documentation commit. Find it via `git log --oneline` and locate the first commit with an `implement:` prefix after the `plan:` or `rfc: accept` commit.
|
|
187
190
|
3. Run the stamp command:
|
|
188
191
|
|
|
189
192
|
```sh
|
|
@@ -192,6 +195,8 @@ Transition the RFC to `implemented` using the `rfc.implement.stamp` command. Dir
|
|
|
192
195
|
|
|
193
196
|
The command atomically validates all preconditions (accepted status, checked+evidenced criteria, clean tree, reachable RFC-referencing commit, passing probe evidence) and sets `status: implemented`, `implementedAt`, and `updatedAt` in one atomic write.
|
|
194
197
|
|
|
198
|
+
**Troubleshooting:** If the stamp fails with `Could not parse target RFC` (RFC-IMP-01), the RFC frontmatter has a YAML syntax error — not a missing file. Check for unquoted backtick values in `successSignals`, `nonGoals`, or other list items. YAML plain scalars starting with a backtick must be double-quoted.
|
|
199
|
+
|
|
195
200
|
4. Commit the stamped RFC file:
|
|
196
201
|
|
|
197
202
|
```txt
|
|
@@ -314,7 +319,7 @@ If the ADR is already `accepted`, proceed directly.
|
|
|
314
319
|
|
|
315
320
|
#### 4.3. Implement the decision
|
|
316
321
|
|
|
317
|
-
Read the `## Decision` section and implement it in code. Follow the same principles as RFC implementation:
|
|
322
|
+
Read the `## Decision` section and implement it in code. **For each decision point, verify whether the code already exists** — ADRs may declare fields or extensions that related RFCs did not fully implement. Do not assume associated RFCs covered everything; check each decision against the actual codebase and implement any gaps. Follow the same principles as RFC implementation:
|
|
318
323
|
|
|
319
324
|
- Make autonomous, ecosystem-aligned decisions.
|
|
320
325
|
- Use `edit`/`multi_edit` for changes to existing files, `write_to_file` for new files.
|
|
@@ -168,6 +168,16 @@ The grilling checks:
|
|
|
168
168
|
|
|
169
169
|
Address every concern the grilling raises by revising the draft. Do not persist until the grilling is satisfied.
|
|
170
170
|
|
|
171
|
+
### 5b. Summit suggestion
|
|
172
|
+
|
|
173
|
+
If the RFC meets summit criteria (any of: `kind: architecture` AND `scope: workspace`, `satisfies[]` includes 2+ DNA invariants, introduces a new package/command/lifecycle, supersedes an implemented RFC), suggest using `fo-design-summit` before acceptance. Use `ask_user_question`:
|
|
174
|
+
|
|
175
|
+
> "This RFC is complex (architecture, workspace scope, 2+ DNA invariants). Should I run a multi-persona design summit before acceptance?"
|
|
176
|
+
|
|
177
|
+
Recommended option: "Run summit" — because complex RFCs benefit from multi-perspective review.
|
|
178
|
+
|
|
179
|
+
If the operator declines, proceed to step 6. If the operator accepts, invoke `fo-design-summit` via the `skill` tool, wait for it to complete, then proceed to step 6.
|
|
180
|
+
|
|
171
181
|
### 6. Persist the plan
|
|
172
182
|
|
|
173
183
|
Name the plan file by mirroring the RFC filename with a `plan-` prefix:
|
|
@@ -126,12 +126,14 @@ rtk git status --porcelain
|
|
|
126
126
|
for d in missions/*/workpiece; do [ -d "$d/.git" ] && echo "=== $d ===" && rtk git -C "$d" status --porcelain; done
|
|
127
127
|
```
|
|
128
128
|
|
|
129
|
-
**3b. Classify each dirty file as "ours" or "
|
|
129
|
+
**3b. Classify each dirty file as "ours" or "unattributed":**
|
|
130
130
|
|
|
131
|
-
- A file is "ours" if
|
|
131
|
+
- A file is "ours" if ANY of:
|
|
132
132
|
- You directly modified it via `edit`, `write_to_file`, `multi_edit`, or `edit_notebook` tools.
|
|
133
133
|
- You indirectly modified it by running a command (`run_command`) that generates or updates it (e.g. codegen pipelines, build commands, etc.).
|
|
134
|
-
-
|
|
134
|
+
- It was produced by a session-end pipeline step in THIS session: session transcripts (`docs/sessions/*.md`), review reports (`docs/reviews/**/*.md`), or `docs.archive` moves.
|
|
135
|
+
- It was created by a skill you invoked in this session (e.g. `fo-review` creating a review report, `fo-doc-audit` editing AGENTS.md, `fo-idea-create-adr` creating an ADR).
|
|
136
|
+
- A file is "unattributed" if it appears dirty but you have no record of touching it in this session. Do NOT assume it belongs to a parallel agent — it may be an orphan from a previous session that was not committed. The previous session-end protocol should have caught it, but if it didn't, this session must not propagate the problem further.
|
|
135
137
|
|
|
136
138
|
**3c. Commit our changes:**
|
|
137
139
|
|
|
@@ -139,9 +141,12 @@ for d in missions/*/workpiece; do [ -d "$d/.git" ] && echo "=== $d ===" && rtk g
|
|
|
139
141
|
- If there are "our" dirty files in a workpiece: `git -C missions/<missionId>/workpiece add <files>` and `git -C missions/<missionId>/workpiece commit -m "<descriptive message>"`.
|
|
140
142
|
- Use descriptive commit messages that explain what the changes are, not just "session cleanup".
|
|
141
143
|
|
|
142
|
-
**3d.
|
|
144
|
+
**3d. Handle unattributed dirty files (NON-NEGOTIABLE):**
|
|
143
145
|
|
|
144
|
-
- If any dirty files remain after committing ours,
|
|
146
|
+
- If any unattributed dirty files remain after committing ours, present them to the operator via `ask_user_question` (in `aiLanguage`) and ask whether to commit or leave each one untouched. Do NOT silently proceed — unattributed files are often orphans from previous sessions that must be resolved, not propagated.
|
|
147
|
+
- For each unattributed file, the operator can choose:
|
|
148
|
+
- **Commit** — the agent stages and commits the file with a descriptive message.
|
|
149
|
+
- **Leave untouched** — the operator explicitly acknowledges the file should remain dirty (e.g. it belongs to a parallel agent still running).
|
|
145
150
|
- If the tree is now clean (or was clean from the start), proceed silently.
|
|
146
151
|
|
|
147
152
|
### Step 4: RFC implementation verification (NON-NEGOTIABLE)
|