Ten sequential spec files plus index covering runtime, observability, security, data, routing, realtime, supervisor, clients, CLI ops, and workflow, each with best practices, structure, rules, guidelines, specs, and cross-references.
16 KiB
10 - Workflow, Testing Discipline, Living Example
Scope: plan.md sections 8-9, 10 step 7. Topics: specs, AGENTS.md, autonomous git, integration testing, living example.
1. Purpose and philosophy
This file defines how MoloApp is built, not what it does. Feature scope lives in siblings 01-runtime.md through 09-cli-ops.md; this file owns the process that keeps those features consistent: structure-driven development (every component has a written spec), an agent-executable workflow (AGENTS.md), autonomous versioning and release, integration-only testing through the real stack, and one living example project that proves every feature works end to end.
Philosophy, from plan.md section 9:
- Structure first: no code without a spec declaration somewhere; docs state what the system does today, gaps listed next to the code that closes them.
- Isolation with DRY integration: components depend only on declared interfaces, shared behavior lives in exactly one base class or component.
- Autonomous by default, human on floors: the AI agent builds, tests, versions, commits, tags, deploys and verifies in one session; humans intervene only on conflicts, protected paths, retention windows, destructive ops, and release failures.
- A change that is not running is not done: commit, deploy, verify, same session.
- User-facing simplicity is a release gate; responsive-by-default is a ship blocker for every template and example UI.
2. Best practices (from research)
- AGENTS.md is a README for agents: a dedicated predictable place for build steps, tests, and conventions, kept separate so READMEs stay human-focused (https://agents.md/, retrieved 2026-10-23). MoloApp adopts this split literally: root
AGENTS.mdis normative for the agent;README.mdis human marketing plus quickstart. - Conventional Commits gives the subject line a machine-parseable structure
<type>[optional scope]: <description>with optional body and footers, wherefix:maps to PATCH,feat:to MINOR, andBREAKING CHANGE:footer or!marker to MAJOR (https://www.conventionalcommits.org/en/v1.0.0/, retrieved 2026-10-23). MoloApp uses exactly this mapping for autonomous bumps. - Semantic Versioning 2.0.0 defines MAJOR for incompatible API changes, MINOR for backward-compatible additions, PATCH for backward-compatible fixes (https://semver.org/, retrieved 2026-10-23). Triangulated with (2) and (5): commit type is the sole version signal, no manual version choice.
- Keep a Changelog requires one
CHANGELOG.md, Unreleased section at top,Added/Changed/Fixed/Removedgroups per release, ISO 8601 dates, and commit-log dumps explicitly rejected (https://keepachangelog.com/en/1.0.0/, retrieved 2026-10-23). MoloApp generates the changelog from parsed commits but edits entries into human-readable form before tagging. - semantic-release automates determining the next version, generating release notes, and publishing, removing the connection between human emotions and version numbers and running only after successful CI (https://semantic-release.gitbook.io/semantic-release/, retrieved 2026-10-23; canonical docs now at https://semantic-release.org/). Triangulated with (2)+(3): MoloApp release pipeline runs only on a green suite and derives version purely from commits since last tag.
- FastAPI documents testing via
TestClient(app)exercising real routes withclient.get/postand status plus body assertions (https://fastapi.tiangolo.com/tutorial/testing/, retrieved 2026-10-23). Django documents simulating requests through the full stack (URL, view, middleware, form, template) with its test Client (https://docs.djangoproject.com/en/5.0/topics/testing/, retrieved 2026-10-23). Triangulated: MoloApp integration tests follow the same black-box route-level pattern, but stricter (no isolated unit tests at all; every test hits a URL end to end, see 08-clients-openapi.md for the test client itself).
3. Structure
Deep structure, one class or concern per file, namespaces mirror directories.
MoloApp/
AGENTS.md # normative agent workflow (this file specifies its content)
README.md # human quickstart (no agent instructions)
CHANGELOG.md # Keep a Changelog format, agent-maintained
VERSION # single line MAJOR.MINOR.PATCH, agent-maintained
Makefile # canonical targets: build, test, lint, docs, release, verify
specs/
SPEC-TEMPLATE.md # normative template (see section 6.1)
runtime.md # one spec per sibling area, mirrors 01-runtime.md through 09-cli-ops.md
observability.md
security.md
data.md
request-routing.md
realtime.md
supervisor-replication.md
clients-openapi.md
cli-ops.md
workflow-example.md # this plan, once accepted
tools/
release/ # autonomous git/version/changelog pipeline (behavior here, CLI UX in 09-cli-ops.md)
ReleasePlanner.hpp # molo::workflow::ReleasePlanner: commits since tag -> bump decision
ChangelogWriter.hpp # molo::workflow::ChangelogWriter: commits -> CHANGELOG entries
ReleaseVerifier.hpp # molo::workflow::ReleaseVerifier: green-suite + live checks before tag
tests/
integration/ # ONLY test location; mirrors app routes (see 6.3)
CASE-TEMPLATE.md # normative test-case template
health_test.cpp
<router>/
<route>_test.cpp
examples/
living/ # the big living example project (see 6.4)
App.cpp # mounts every demo sub-app (application chaining demo)
routers/
views/
templates/
static/
tests/ # example suite, same templates as tests/
README.md # feature coverage matrix with links to routes
Namespaces: molo::workflow for ReleasePlanner, ChangelogWriter, ReleaseVerifier. No other framework namespace may contain workflow logic. Test files use molo::test helpers only. Example app uses molo::example:: sub-namespaces per demo area.
4. Rules (hard, numbered)
- No feature is done until: spec updated, docs updated, living example demonstrates it, full suite green, all in the same session.
- Integration tests only: every test exercises a URL end to end through real HTTP, routing, middleware, and DB. Isolated unit tests are forbidden.
- Test placement mirrors the app: test file path and name derive from the URL/router under test; exactly one structured place per route.
- Conventional Commits format is mandatory for every commit; malformed commits are rejected by the pipeline before version analysis.
- Version numbers are never hand-chosen; the bump derives solely from commit types since the last tag (feat -> minor, fix -> patch, BREAKING CHANGE or
!-> major). - Tagging requires a green suite plus live verification after deploy, same session; failed verification blocks the tag.
- Destructive git ops (history rewrite, force push, hard reset) are never autonomous: dry-run plus explicit human confirmation, no exceptions.
- Protected floors the agent must never cross alone:
specs/,CHANGELOG.md,VERSION, tags, retention windows, destructive file deletes; on a floor hit, stop and page a human. - Every shipped template, example UI, and generated page works on small phones; big button groups collapse to dropdowns or equivalent, verified in the example suite.
- Specs are normative: on any conflict between code and spec, the spec wins until formally amended in the same change.
5. Development guidelines
- Write the spec delta first, then code, then example coverage, then tests, then changelog entry, then commit. Never commit code whose spec is stale.
- Keep changes small and reviewable: one router or one behavior per commit; squash agent thrash before tagging.
- Prefer static ceilings over autotuning everywhere (timeouts, caps, intervals are constants in specs, visible in
AGENTS.md). - Loud skips: if input, fixture, or environment cannot be verified, fail the test with a clear reason and counter, never silently pass.
- Reproduce bugs through the real stack first (failing route-level test), then fix at root cause; the reproduction test stays in the suite.
- Docs use fixed templates; every doc names what the system does today and lists gaps next to the code that will close them.
AGENTS.mdis the single entry point for autonomous work: any workflow an agent must run (build, test, lint, docs, bump, commit, tag, deploy, verify) is invocable from there with exact commands.
6. Specifications
6.1 Spec template (specs/SPEC-TEMPLATE.md)
Every spec file contains, in order: Status (draft/accepted/deprecated) and date; Behaviors (numbered, testable); Caps (every rate, size, count, interval, memory ceiling as literal constants); Formats (wire, file, log, error shapes); Errors (exception type per failure, status mapping); Isolation (declared interfaces it may depend on, explicit non-dependencies); Gaps (what is not true yet, with owning file). Max 500 lines per spec; split by sub-concern beyond that.
6.2 AGENTS.md content and autonomous git pipeline
AGENTS.md sections, in order: Setup commands; Build; Test; Lint; Docs update; Version bump; Commit; Tag; Deploy; Verify live; Floors and escalation. Each section gives one copy-paste command (Makefile target) plus expected output and failure action.
Commit format: <type>[(scope)][!]: <description> plus optional body plus BREAKING CHANGE: footer, per Conventional Commits 1.0.0. Allowed types: feat, fix, docs, style, refactor, perf, test, build, ci, chore. Scope is the sibling area slug (runtime, security, data, routing, realtime, supervisor, clients, cli, workflow).
Bump mapping: any ! or BREAKING CHANGE -> MAJOR; else any feat -> MINOR; else any fix -> PATCH; else no release. VERSION file and annotated git tag vMAJOR.MINOR.PATCH update atomically with the changelog entry.
Changelog: Keep a Changelog groups (Added, Changed, Fixed, Removed) under ## [x.y.z] - YYYY-MM-DD, Unreleased section always present, ISO dates only.
Pipeline order: lint -> full integration suite -> bump decision -> changelog -> commit -> tag -> deploy -> live verify. Any red step halts the pipeline; the agent reports, never force-pushes past red. CLI command surface for these steps is specified in 09-cli-ops.md; this file owns the ordering, gating, and format rules.
Caps: max 1 release per green suite run; changelog entry max 20 lines per version; commit subject max 100 chars; pipeline timeout 30 min, then human escalation.
6.3 Integration test discipline
Location: tests/integration/<router-path>/<route>_test.cpp. Naming: route /users/:id -> users/id_test.cpp. Fixtures: DB/ORM fixtures plus frozen time via the test client from 08-clients-openapi.md; no real network except loopback server under test.
Case template (CASE-TEMPLATE.md): Arrange (seed via app API, never direct DB writes unless testing self-healing); Act (one HTTP request through the test client); Assert (status code, content-type, body shape, plus one side-effect check: DB row, metric emitted, log line). Every route needs at minimum: happy path, auth failure, validation failure, and one limit case (body too large, rate limited, or not found).
Caps: full suite max 10 min on reference hardware; single test max 30 s; fixture DBs reset per file, never shared across files; flaky test policy is zero tolerance (quarantine file plus spec gap entry, fix within one session).
6.4 Living example project (examples/living/)
Must demonstrate, each reachable via a documented URL and covered by examples/living/tests/: routing, views, routers, ORM both backends, auth, sessions, forms, validation, templates, all response formats, streaming/passthrough, WebSocket plus Socket.IO, pubsub, events, metrics, telemetry, KV, cache, uploads, WebDAV, replication, supervisor plus background tasks, REST client self-call, OpenAPI page, embedded static assets, AI harness CLI sample, structured integration tests.
Coverage matrix in examples/living/README.md: table of feature -> route -> test file -> spec link. Matrix row count equals feature count; CI fails on missing row. Example must compile warning-free and stay green as part of the normal suite; it is also the manual post-deploy verification target (open index, click through matrix top 10 routes on a small-phone viewport).
7. Execution steps (in build order)
- Write
specs/SPEC-TEMPLATE.mdand stub specs for all areas. - Write root
AGENTS.mdwith build/test/lint/docs/bump/commit/tag/deploy/verify commands wired to the Makefile. - Implement
molo::workflowrelease pipeline (ReleasePlanner, ChangelogWriter, ReleaseVerifier) with dry-run mode. - Write
tests/integration/CASE-TEMPLATE.mdplus first health-route test proving the harness works. - Scaffold
examples/living/with index, coverage matrix, and one route per area stub. - Fill example coverage feature by feature alongside siblings 01-runtime.md through 09-cli-ops.md; each feature lands with spec, example route, and tests in one session.
- Harden pipeline: floor guards, protected paths, destructive-op blocks, timeout and escalation paths.
- First autonomous end-to-end run: green suite -> bump -> changelog -> tag -> deploy -> live verify -> matrix check.
8. Validation (how to verify each step)
- Template check: every spec file parses against the section order in 6.1; reject on missing Caps or Gaps.
- Agent replay: a fresh agent following only
AGENTS.mdreaches a green build plus green suite with zero questions. - Pipeline dry-run: on a fixture repo with known commits, bump decision and changelog output match expected version and groups exactly.
- Harness proof: health-route test passes and fails correctly when the route is broken (mutation check).
- Matrix audit: every matrix row resolves to a live route, a test file, and a spec anchor; script fails on dangling links.
- Per-feature gate: rule 1 checklist enforced by CI (spec diff plus example diff plus tests diff present in the same release).
- Floor drill: attempt a protected-path write and a force push in dry-run; both must refuse and request human confirmation.
- Live verify: after deploy, automated health plus metrics plus trace checks pass and the example index loads on a 360px viewport.
9. References
Depends on: 09-cli-ops.md (CLI command surface the pipeline invokes, dev server, Makefile targets); 08-clients-openapi.md (test client, fixtures, time freezing used by every test); 02-observability.md (log format, metrics, trace linkage asserted in tests). Feeds: all siblings 01-runtime.md through 09-cli-ops.md (spec template, test template, release gates, and example coverage apply to every area). Never duplicates: CLI flags and UX (09-cli-ops.md), test-client API (08-clients-openapi.md), metric/log schemas (02-observability.md).
10. Open questions
- Reference hardware for the 10-minute suite cap: which CI runner SKU is normative?
- Deploy target for live verification: single binary on loopback, or staged multi-instance per 07-supervisor-replication.md?
- Should
BREAKING CHANGEcommits require a human co-sign before MAJOR tagging, or stay fully autonomous? - Example backend default: SQLite for speed with Postgres nightly, or both on every run?
11. Sources
- AGENTS.md open format, https://agents.md/ (retrieved 2026-10-23)
- Conventional Commits 1.0.0, https://www.conventionalcommits.org/en/v1.0.0/ (retrieved 2026-10-23)
- Semantic Versioning 2.0.0, https://semver.org/ (retrieved 2026-10-23)
- Keep a Changelog 1.0.0, https://keepachangelog.com/en/1.0.0/ (retrieved 2026-10-23)
- semantic-release docs, https://semantic-release.gitbook.io/semantic-release/ (retrieved 2026-10-23)
- FastAPI testing tutorial, https://fastapi.tiangolo.com/tutorial/testing/ (retrieved 2026-10-23)
- Django testing docs, https://docs.djangoproject.com/en/5.0/topics/testing/ (retrieved 2026-10-23)