cc-os/docs/adr-system/01-current-state-survey.md

190 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Current-State Survey: ADR Practices Across `~/dev/` Projects
_Last updated: 2026-07-03_
Survey of every project directory under `~/dev/` for existing Architecture Decision Record
practices. Read-only audit; no files were changed. Source: agent survey, 2026-07-03.
## Projects with formal ADRs
### cc-os
- **Organization**: monolithic — `docs/memory-system/03-architecture-decisions.md`, 601 lines,
19 ADRs (this repo, before this research phase).
- **Naming**: `ADR-NNN` heading per entry within the single file.
- **Template fields**: Context · Decision · Rationale · Alternatives rejected · Status.
Supersession noted inline ("Superseded by ADR-010", "Refined by ADR-011").
- **Tooling**: none; plain markdown. `_Last updated:_` date at top of file.
### viking-warrior-training-log
- **Organization**: one file per decision — `docs/adr/`, 6 files + `README.md` index.
- **Naming**: `NNNN-kebab-case-title.md` (e.g. `0001-pocketbase-backend.md`).
- **Template fields**: Status · Date · Context · Decision · Consequences · Alternatives
considered. Files are 3041 lines.
- **Tooling**: `README.md` index — a table of all ADRs with title + status. Explicitly notes
ADRs 00010003 were backfilled after the fact; 00040006 record refinements after critique.
- **This is the only project with both per-file organization AND a maintained index.**
### delta-refinery
- **Organization**: one file per topic (not numbered) — `docs/decisions/`, 12 files, 2548
lines each.
- **Naming**: topic-driven kebab-case (`bin-lint-fix.md`, `map-driven-design-system.md`).
- **Template fields**: Status · Decided (date) · Decision · Why · What Was Built (artifact
table) · Open Questions · **"Delete this document when"** (a sunset/supersession condition
instead of an explicit supersedes/superseded-by field).
- **Tooling**: none.
### design-mode
- **Organization**: one file, dated — `docs/decisions/2024-12-jsx-conversion-pivot.md` (only 1
decision recorded), 78 lines.
- **Naming**: `YYYY-MM-topic-kebab.md`.
- **Template fields**: Date · Status · Context · Problem · Decision · Implementation
(Keep/Remove/Update subsections) · Open Questions · **Lessons Learned** (a retrospective
field not seen elsewhere in this survey).
- **Tooling**: none.
### llf-schema
- **Organization**: mixed — `docs/decisions/`, 6 files (18134 lines), but several files
embed *multiple* numbered decisions rather than one-per-file.
- **Naming**: `YYYY-MM-DD-topic-kebab.md` at the file level; `D-NNN` numbering for individual
decisions embedded within a file (at least D-038 through D-043+ found).
- **Template fields**: Status · Context · Decision · Consequences; some have an "Open
sub-decision" pattern with explicit options + rationale.
- **Tooling**: cross-links into the project's `openspec/changes/...` spec-driven change
system — the only project doing this. One file (`2026-06-04-plugin-decision-index.md`) acts
as a superseded historical index pointing to newer sub-documents.
### cc-plugins
- **Organization**: decisions embedded in prose within larger design docs, not a dedicated
ADR directory. `progressive-disclosure/docs/gaps-and-decisions.md` (297 lines) numbers
decisions inline ("Decision 26: Single entry point").
- **Template fields**: narrative Decision / Why / mechanics — no structured Status/Context
fields as distinct headings.
- **Notable**: the whole document is marked `(LOCKED)` — a document-level freeze convention
instead of a per-decision status field.
## Projects without formal ADRs
| Project | Notes |
|---|---|
| playground | No `docs/`; minimal project. |
| remetrics | Has a README; no decision docs. |
| ruby-gems | Umbrella dir, 10 sub-repos checked; none have ADRs. |
| thinkfast | CLAUDE.md references "architectural decisions" as a task category but no ADR files exist. |
| verona-vocab | Has CLAUDE.md; no decision docs. |
| websites | Umbrella dir (hyperthrive, hyperthrive-strategy checked); none have ADRs. |
| wordpress-dc | No `docs/`. |
| hyperthrive_dev | Uses ad hoc `.scratch/active/progress.md` subagent handoff logs instead of ADRs. |
| llf-schema-build-tmp | Throwaway build directory, not a persistent project — excluded from future onboarding. |
## Addendum: `~/clients/` and `~/projects/`
The first pass covered `~/dev/` only. A second pass surveyed `~/clients/`
(inovis-lighting-audit-manager, philly-search-engine-marketing, summit-new-hire-automation,
virtuosocontent) and `~/projects/` (niche-automation-prospecting, taxes-swanson). This surfaced
a **distinct organizational pattern from `~/dev/`** — worth treating as its own category, not
merging into the table above.
### Client projects (`~/clients/`)
- **inovis-lighting-audit-manager**: no ADRs, nothing adjacent.
- **philly-search-engine-marketing**: monolithic root-level `DECISIONS.md` (236 lines, 14
decisions), plus two secondary dated docs for specific incidents. Per-decision fields: date +
title heading, `Status:` (Confirmed/Deferred), `Category:` ([Tech]/[Business]), `Source:`
(attribution), then narrative Goal/Decision/Reasoning/Residual-or-Deferred-notes. Explicitly
referenced from `CLAUDE.md`'s quick-reference table as "Past decisions" — i.e. treated as a
canonical, actively-pointed-to file.
- **summit-new-hire-automation**: not really an ADR — one post-hoc "decision framework"
document (n8n vs Rails) that's a retrospective/lessons-learned analysis of a platform choice
already made, including a decision matrix and red-flag checklist for future similar choices.
ADR-adjacent, not an ADR.
- **virtuosocontent**: monolithic root-level `DECISIONS.md`, but minimal — 10 lines, 2
decisions, just a date+title heading and a one/two-line factual statement (no Status,
Category, or reasoning fields at all).
### Personal/internal projects (`~/projects/`)
- **niche-automation-prospecting**: no dedicated decisions file; decisions are scattered inside
timestamped working documents — `logs/increments/2026-05-26-*-decisions.md` and a
`PHASE4-DECISION-MEMO.md` — organized by project phase/event (executive summary, tier
score-snapshot tables, "clear kills," next steps) rather than as discrete Status-tagged
entries. ~20 decisions total across the two files, but as narrative sections, not an ADR list.
- **taxes-swanson**: no ADRs, nothing adjacent.
### What's different here vs. `~/dev/`
1. **Client projects favor one monolithic root-level `DECISIONS.md`, not a `docs/decisions/` or
`docs/adr/` directory** — the opposite of the `~/dev/` majority pattern (one-file-per-decision
in a subdirectory). Likely driver: a client-facing single readable log is easier to hand off
or reference during a client conversation than a directory of numbered files, and these
projects are shorter-lived/smaller in decision count (214) than cc-os's 19.
2. **Client `DECISIONS.md` files use a `Status:` field (Confirmed/Deferred) that tracks whether
a decision is still locked-in — a business/client-relationship framing** distinct from the
Accepted/Superseded lifecycle framing used in `~/dev/` (ADR-013/ADR-018-style projects).
3. **Internal (`~/projects/`) decision-adjacent docs skip Status entirely** and are organized as
phase/incident narratives (a "worklog," not an architectural record) — closer to
hyperthrive_dev's `.scratch/active/progress.md` pattern from the `~/dev/` survey than to any
ADR convention.
4. **The no-ADR baseline holds**: 3 of 6 (`inovis-lighting-audit-manager`, `taxes-swanson`, and
arguably `summit-new-hire-automation`) have nothing ADR-like, roughly matching the ~60%
no-ADR rate found across `~/dev/`.
**Implication for plugin design**: a future `os-adr` plugin likely needs **two supported
shapes**, not one-size-fits-all — a lightweight monolithic `DECISIONS.md` mode (small
decision counts, client-facing/handoff-friendly, business Confirmed/Deferred status framing)
alongside the per-file `docs/adr/`+index mode recommended for larger personal/tooling projects.
Forcing the `~/dev/`-style per-file convention onto a 214-decision client project would likely
be over-engineering relative to what those projects need.
## Cross-project comparison
**Organization pattern, by frequency:**
1. One file per decision in a dedicated directory — viking-warrior-training-log, llf-schema
(partially), design-mode (only 1 file so far, same shape). Most common approach once a
project has more than a couple of decisions.
2. Monolithic single file — cc-os only, and only this repo has reached a high ADR count (19)
while staying in one file; still, that file is now 601 lines and prompted this research.
3. Embedded in prose within other docs — cc-plugins. Lowest discoverability; no per-decision
status field.
**Naming, by frequency:**
- Sequential numeric (`0001-`, `ADR-NNN`, `D-NNN`): cc-os, viking-warrior-training-log,
llf-schema — 3 of 6.
- Topic-only kebab-case, no number: delta-refinery.
- Date-prefixed: design-mode, llf-schema (at the file level).
- Inline prose numbering: cc-plugins.
**Template fields, by prevalence (of the 6 projects with any ADR-like content):**
| Field | Count | Projects |
|---|---|---|
| Decision | 6/6 | all |
| Status | 5/6 | all but cc-plugins |
| Context | 5/6 | all but cc-plugins |
| Consequences | 4/6 | viking-warrior-training-log, design-mode, llf-schema, cc-plugins ("Why") |
| Alternatives (rejected/considered) | 3/6 | cc-os, viking-warrior-training-log, design-mode |
| Rationale | 2/6 | cc-os, delta-refinery |
| Date | 4/6 | viking-warrior-training-log, delta-refinery, design-mode, llf-schema |
**Key observations:**
- **No two projects use an identical template** — field names and ordering vary even where the
underlying concept (e.g. "why we rejected X") is the same.
- **Supersession handling is ad hoc everywhere**: cc-os uses inline prose notes,
delta-refinery uses a sunset condition ("delete this document when…"), viking-warrior-
training-log uses a status column in its index, llf-schema uses an explicit
open/settled status field. No project has a formal `supersedes:` / `superseded-by:` field.
- **Indexing is rare**: only viking-warrior-training-log (README table) and cc-plugins (a
locked index-like document) have anything resembling a discoverability index. Every other
project relies on `ls`/grep of the directory.
- **None of the 6 projects use ADR tooling** (adr-tools, log4brains, etc.) — all are
hand-authored markdown.
- **9 of 15 `~/dev/` projects have no ADRs at all** — future onboarding candidates once a
plugin exists (per this repo's own ADR-013 precedent: build-first, then migrate/onboard one
project at a time rather than batch-migrating everyone). Across the `~/clients/`+`~/projects/`
addendum, 3 of 6 also have none — a consistent ~55-60% no-ADR baseline across every category
surveyed.
- **Client-facing and personal/internal projects (see addendum above) use a visibly different
shape than `~/dev/` tooling projects**: a single monolithic root `DECISIONS.md` rather than a
per-file directory, smaller decision counts (214 vs. cc-os's 19), and — for client
projects — a business-framed `Status: Confirmed/Deferred` field rather than an
Accepted/Superseded lifecycle field. A future plugin needs to support this as a distinct,
legitimate mode, not treat it as an under-developed version of the `~/dev/` pattern.