18 KiB
Doc-driven development + evidence-driven acceptance (process)
Historical implementation record, captured during the 2026-07-04 process migration. Statements about working-tree state and missing files describe the branch at that time; the current operating contract lives in
../README.md,../mvp/MVP.md, and the repository rootAGENTS.md.
Summary
We are converging the repo into one MVP: the LifeOps Personal Assistant (GitHub project 15, https://github.com/orgs/elizaOS/projects/15) — chat, onboarding, the current views, and centrally LifeOps: scheduling, calendar, coordination, reminders, goals, todos, tasks. It must serve children, adults with ADHD/ADD/Asperger's/autism, neurotypical people, and elderly people — with no therapy language and no special rails; scenarios and tests cover real life (brush teeth twice a day, work out, finish the report on time, night-owl sleep rhythms). The guiding constraint is minimize new scope: turn what exists into an MVP by fixing, testing, and verifying — prefer deleting over adding.
This workstream changes how we coordinate and how we prove work is done:
- Coordination moves to GitHub Issues + Discussions + project board 15,
with
packages/docs/ongoing-development/as the source of truth for in-flight product thinking (discussion → design doc → issues on board 15 → PR with inline evidence → doc updated). - Evidence moves inline into the GitHub issue/PR — MP4 videos (render
inline in GitHub), JPG screenshots (smaller than PNG), logs in
<details>blocks. The repo-committed.github/issue-evidence/approach is retired: it bloated every clone (387 paths purged inda86f5cce34, and the committed tree previously broke Windows checkouts onMAX_PATH—.github/workflows/vault-ci.yaml:52), and it detached proof from the conversation it belonged to.
Most of the prose rewrite is already applied as working-tree edits on this
branch (verified below). What remains is: creating this folder's README.md +
mvp/MVP.md (root docs already link to them — the markdown-links CI lane is
red until they exist), aligning the mechanical PR-evidence gate, sweeping 546
per-package agent guides, migrating 3 residual evidence files to their issues,
and repointing CI scratch paths.
Current state
The binding standard and its mechanical gate exist and work:
AGENTS.md(243 lines) is the repo-wide definition of done; the rootCLAUDE.md/AGENTS.md"Definition of Done" section restates it and every package guide points back to it..github/pull_request_template.md:85-106carries 7 stable<!-- evidence-row:… -->markers;scripts/check-pr-evidence.mjs:12-20enumerates the same 7 rows and.github/workflows/pr.yaml:17-30runs the checker on every PR body, failing closed on blank/missing rows. For PRs labeledui/frontend/native, screenshot/video rows require a concrete artifact reference (scripts/check-pr-evidence.mjs:43-46,144-147).- The checker already accepts GitHub inline attachments: markdown links,
any https URL, and the attachment hosts
(
user-images.githubusercontent.com,github.com/**/assets/— which matches the currentgithub.com/user-attachments/assets/<uuid>rewrite) atscripts/check-pr-evidence.mjs:57-68. So the inline-evidence mechanics need no new CI; the gate was built for this.
The repo-committed evidence directory is already dead, but half-buried:
- Commit
da86f5cce34(2026-07-04, "delete stuff") purged ~387.github/issue-evidence/paths, including the directory'sREADME.md. Exactly 3 residual files remain, all for closed issues:.github/issue-evidence/13617-develop-merge-gate/README.md(85 lines, CI runbook incl. an unexecuted maintainer runbook for the develop merge gate),13725-runtime-mode-gate-bare-agent.md(83 lines),13726-local-only-runtime-mode.md(79 lines). All three are staged for deletion in this worktree — their content must be posted to their issues before the deletion merges, or the proof (and the #13617 F2 runbook) is lost. - Stale acceptance vector:
scripts/check-pr-evidence.mjs:67still satisfies an evidence row with a.github/issue-evidence/…path (which can no longer exist), and its self-test fixtures (:200-203) use such paths. - 546 per-package agent guides carry one byte-identical line —
Artifacts → `.github/issue-evidence/<issue#>-<slug>.<ext>`; attach each evidence type **or**— 273 inCLAUDE.mds + 273 inAGENTS.mds (verified by grep; pairs are enforced byte-identical byscripts/assert-agents-claude-identical.mjs, wired intobun run verifyviapackage.jsoncheck:agents-claude). One mechanical sed sweep fixes all. - CI/scripts still reference the dead path:
.github/workflows/test.yml:120,237(TUI scratch dir + upload-artifact),scenario-pr.yml:702,lifeops-live-validation-11632.yml:74-109,launch-hardening-8756.yml:54-61,browser-real-bench.yml:106-108(all scratch-then-upload — functional but the path convention invites recommitting);voice-live-e2e.yml:21,137,303,308,406points operators at a deleted provisioning doc;lifeops-benchmark-history.yml:95-141executes a script at a deleted path — the workflow is broken on every run;vault-ci.yaml:52carries a stale "committed evidence files exceed MAX_PATH" comment;package.json:105(audit:test-realness:evidence) writes reports into the deleted dir;packages/app/scripts/lib/issue-evidence.mjs:16-21defaults allcapture:ios-sim-family output into it. - Dead links, failing CI today:
node scripts/check-markdown-links.mjs(wired in.github/workflows/markdown-links.yml:41) currently reports 16 missing targets:docs/automation-glossary.md(linked from rootCLAUDE.md:348/AGENTS.md:348andplugins/plugin-{scheduling,workflow,agent-orchestrator}/README.md— the glossary was deleted in the purge although it is load-bearing one-scheduler doctrine), five deleted evidence files linked frompackages/ui/src/voice/STT_SELECTION.md, andpackages/docs/ongoing-development/README.md+mvp/MVP.md(linked by the new coordination prose, not yet created).
The prose rewrite is already applied (uncommitted, this branch) — verified file by file:
AGENTS.md:75-83— evidence table "Where it goes" column now says inline-in-PR per row;AGENTS.md:134-156— new section "Where evidence goes: inline in the issue/PR" (MP4-only video + ffmpeg convert line, JPG over PNG,<details>for logs, external-host fallback keeps an inline JPG still, explicit retirement of.github/issue-evidence/)..github/pull_request_template.md:79-83— attach inline, MP4/JPG rules, "do not commit evidence files";:122-125— logs pasted inline in<details>..github/ISSUE_TEMPLATE/bug_report.md:21-26— JPG/MP4 of the wrong behavior required for anything visible;feature_request.md:21-26— design-doc link + board-15 hint, MP4/JPG evidence-of-done list;epic.md:13-17— Design doc field;:35— inline-evidence acceptance criterion;config.yml:3-5— board-15 contact link.CONTRIBUTING.md:29-32,README.md:126-135— inline attachment guidance + board/discussions/ongoing-development pointers.- Root
CLAUDE.md:376-399(==AGENTS.md, verified byte-identical) — new 25-line "Coordination — board, discussions, and ongoing-development docs" section: board 15 is the active kanban (claim = comment + move card; no unboarded MVP work), discussions per workstream, doc flow, inline evidence. This satisfies deliverable (d); no further edit proposed.
What does not exist: packages/docs/ongoing-development/ had no files
before this research doc. There is no coordination README, no MVP doc, no
design/ or status/ convention. packages/docs is the Mintlify site
(packages/docs/CLAUDE.md); only docs.json-registered pages are published,
so an unregistered working folder is safe to add.
Design considerations
- Evidence must live where reviewers look. An attachment in the PR body renders next to the claim it proves; a repo path requires a checkout and rots silently. GitHub attachments share the repo's durability class.
- MP4, not MOV/WebM: GitHub renders MP4 inline; other containers degrade to
bare links.
ffmpeg -i in.mov -c:v libx264 -pix_fmt yuv420p out.mp4is the documented conversion. GitHub caps attachment size — compress/trim; if a video cannot fit, host it, link it, and attach a representative JPG still inline so proof survives link rot. - JPG over PNG for screenshots (smaller, faster review), PNG only where pixel-exact detail matters. Guidance, not a gate (see open question 1).
- No new process machinery. The gate (
check-pr-evidence.mjs), the identity guard (assert-agents-claude-identical.mjs), the link checker, and the capture tooling all exist. This workstream edits text and deletes a convention; it adds zero new checks. - One source of truth for in-flight thinking. Board 15 = task state;
Discussions = conversation;
ongoing-development/= durable decisions. Decisions made in a discussion must land as a doc PR — comments are not storage.
Open questions → answers
- CI check that warns on PNG where JPG would do? No. GitHub rewrites
uploads to extensionless
github.com/user-attachments/assets/<uuid>URLs — a body-side lint cannot see the content type without fetching every attachment, and would be pure noise. JPG-over-PNG stays template guidance. - Grace period where the gate still accepts
.github/issue-evidence/paths? No. The directory is already purged; a path reference can only be stale or fabricated. Scope discipline forbids invented grace periods. Dropscripts/check-pr-evidence.mjs:67in the same PR that lands the template (in-flight PRs still pass via attachment URLs orN/A - <reason>). - Where do CI-produced artifacts go if not committed?
actions/upload-artifactfrom${{ runner.temp }}— already the pattern intest.yml/scenario-pr.yml; only the scratch path moves out of the repo tree so nothing can recommit it. The author attaches the reviewer-relevant files inline in the PR. - What about
lifeops-benchmark-history.yml, which committedscore-history.jsonlto the evidence dir? It is broken today (executes a deleted script). Delete the workflow — fail fast, no zombie lanes. If the benchmarks workstream wants score history, it re-homes it on artifact storage under its own issue. - Which discussion categories? Master coordination thread →
Announcements (maintainer-posted, pinned, low noise). One kickoff per
workstream → General, titled
[MVP] <workstream>. Ideas stays for unscoped proposals, which graduate by PR-ing a design doc intoongoing-development/design/. No new categories. - Does
ongoing-development/go into the published docs nav (docs.json)? No. It is contributor-facing working material, not product docs. Mintlify publishes only nav-registered pages, so omission is sufficient. - Automated status snapshots in
status/? No. Board 15 is live task truth;status/holds dated, human-written snapshots (e.g.status/2026-07-05.md) when a milestone warrants one. No tooling. - Who writes
mvp/MVP.md? The MVP-definition workstream/owner. To keepmarkdown-linksgreen now, land the stub in Appendix B and let that workstream replace it. (Owner call on final content; stub is the default.) - Restore
docs/automation-glossary.mdor re-point 5 links? Restore the file at its original path (git show da86f5cce34^:docs/automation-glossary.md). Zero link edits, and the glossary is load-bearing doctrine for the LifeOps one-scheduler architecture the MVP centers on. A later docs consolidation may move it; not now.
Recommendation (minimal-scope MVP plan, ordered)
- P0 — Land the applied prose rewrite + create this folder. Commit the
already-applied edits (AGENTS.md, PR template, issue templates,
config.yml, CONTRIBUTING.md, README.md, root CLAUDE.md/AGENTS.md) together
with
ongoing-development/README.md(Appendix A) andmvp/MVP.mdstub (Appendix B) somarkdown-linksis green in one commit. - P0/P1 — Align the mechanical gate: drop the issue-evidence path
acceptance and fixtures from
scripts/check-pr-evidence.mjs(Appendix C). - P1 — Preserve the 3 residuals: post each file's content as a comment on closed issues #13617/#13725/#13726 (the #13617 file contains an unexecuted maintainer runbook), then let the staged deletion merge.
- P1 — Sweep the 546 per-package guides (one sed, one uniform line) + fix
the 5 dead links in
packages/ui/src/voice/STT_SELECTION.md. - P1 — Open the discussions (master thread + workstream kickoffs; draft in this workstream's discussion file).
- P2 — Repoint CI/scripts scratch paths off
.github/issue-evidence/; deletelifeops-benchmark-history.yml; fixvoice-live-e2e.ymldoc refs; updatevault-ci.yaml:52; fixpackage.json:105; repointpackages/app/scripts/lib/issue-evidence.mjs. - P2 — Restore
docs/automation-glossary.mdfromda86f5cce34^.
Out of scope (explicit non-goals for MVP)
- Any new CI gate (PNG lint, attachment-size checks, evidence-content validation beyond the existing row checker).
- GitHub issue forms (YAML templates) — the markdown templates were just tightened; a form migration is churn with no MVP payoff.
- Automated board sync, bots, status dashboards, or discussion tooling.
- Re-homing benchmark score history (benchmarks workstream, only if wanted).
- Publishing
ongoing-development/on the docs site or any docs.json changes. - Rewriting AGENTS.md beyond evidence-location mechanics — the three laws and the real-tests doctrine are untouched.
Proposed issues
[process] Create packages/docs/ongoing-development README + MVP stub (fixes red markdown-links lane)— P0[process] check-pr-evidence: stop accepting retired .github/issue-evidence paths— P1[process] Migrate the 3 residual .github/issue-evidence files to comments on their closed issues— P1[process] Sweep 546 per-package CLAUDE.md/AGENTS.md evidence lines to inline-attachment guidance— P1[process] Open the MVP coordination discussions (master thread + per-workstream kickoffs)— P1[process] Repoint CI/scripts scratch paths off .github/issue-evidence and delete the broken benchmark-history workflow— P2[process] Restore docs/automation-glossary.md deleted by the evidence purge— P2
Appendix A — proposed packages/docs/ongoing-development/README.md
# Ongoing development — how we coordinate
Source of truth for in-flight product thinking on the way to the MVP: the
**LifeOps Personal Assistant** (chat, onboarding, the current views, and
centrally LifeOps — scheduling, calendar, reminders, goals, todos, tasks). It
serves children, adults with ADHD/ADD/Asperger's/autism, neurotypical people,
and elderly people alike — no therapy language, no special rails; scenarios
cover real life. Guiding constraint: minimize new scope — fix, test, and
verify what exists; prefer deleting over adding.
## Layout
- `mvp/` — the MVP definition ([`MVP.md`](../mvp/MVP.md)) and its status.
- `research/` — one research doc per workstream (numbered, e.g.
`09-doc-driven-development.md`). Written once, then amended by PR as
decisions change.
- `design/` — accepted design docs for features being built.
- `status/` — dated, human-written status snapshots (e.g. `2026-07-05.md`).
## How work flows
1. **Discussion** — conversation starts in
[GitHub Discussions](https://github.com/elizaOS/eliza/discussions): one
kickoff thread per workstream (General) + a pinned master coordination
thread (Announcements).
2. **Design doc** — decisions land here as a PR (`research/` or `design/`).
Discussion comments are not storage; if it was decided, it is in a doc.
3. **Issues on the board** — the doc is broken into implementation-ready
issues on the
[LifeOps Personal Assistant MVP board (project 15)](https://github.com/orgs/elizaOS/projects/15).
Claim work by commenting on the issue and moving its card. Don't start
unboarded MVP work.
4. **PR with inline evidence** — every PR proves itself inline per
[`AGENTS.md`](../../../AGENTS.md): MP4 video (renders inline),
JPG screenshots, logs in `<details>` blocks, real-LLM trajectories where
agent behavior changed. Nothing committed to the repo.
5. **Doc updated** — if implementation diverged from the doc, the same PR
updates the doc. A stale design doc is a bug.
Appendix B — proposed packages/docs/ongoing-development/mvp/MVP.md stub
# LifeOps Personal Assistant — MVP
> Stub: the MVP-definition workstream owns this file; replace via PR.
The MVP is chat, onboarding, the current views, and centrally **LifeOps**: all
scheduling, calendar, coordination, reminders, goals, todos, and tasks —
one personal assistant. It serves children, adults with
ADHD/ADD/Asperger's/autism, neurotypical people, and elderly people, with no
therapy language and no special rails: scenarios and tests cover real life
(brush your teeth twice a day, work out, get the report done on time, meet
life goals, manage a night-owl sleep rhythm).
Constraint: minimize additional scope. Turn what we have into an MVP by
fixing, testing, verifying, and validating the important stuff; prefer
deleting/simplifying over adding.
Live task state: [project board 15](https://github.com/orgs/elizaOS/projects/15).
Workstream docs: [`../research/`](../research/).
Appendix C — scripts/check-pr-evidence.mjs edit spec
:67— delete the finalreturn /\.github\/issue-evidence\/\S+/i.test(text);fromhasArtifactReferenceand end the function withreturn false;(the markdown-link, https, and attachment-host checks at:58-65remain).:201— fixture"walkthrough-video"becomes"- [x] A video walkthrough: https://github.com/user-attachments/assets/00000000-0000-0000-0000-000000000000".:203— fixture"backend-logs"becomes"- [ ] Backend logs: [run log](https://github.com/elizaOS/eliza/actions/runs/1)".- Mirror the same fixture change in
scripts/check-pr-evidence.test.mjswhere it plants issue-evidence paths; run--self-test+ the vitest file.