Skip to content
Machine BehaviorCTO
Menu

Software delivery lifecycle

Every change to machinebehavior.io moves through the stages below, in this order. The site serves readers, so a stage that fails lets a reader see a wrong or broken page. A stage is done when its exit criteria hold and its record exists. Each record links the one before it, so a line on a live page traces back to the issue that asked for it.

The branch model is short-lived branches and pull requests to main (ADR-0029): agent sessions and the operator branch from origin/main, push the branch and open a pull request; a passing Conformity checks job is required before the merge. Only two automated writers push to main directly, through deploy keys. Only the workflow deploys, on a push to main that passes the conformity gate (ADR-0002). Releases are continuous, several deploys a day.

Stages

StageEntryExitOwnerRecordServed by
RequestSomeone needs a change, or a reader reports a problemAn issue with a type, an area and a priority label; scoped issues carry status: readyStefan CoetzeeGitHub issue on uncovertechtalent/machinebehavior.ioIssue templates in .github/ISSUE_TEMPLATE/, triage per Ticket board, sdlc:ticket
RFCThe change touches more than one site or the shared gate, or is hard to undoA decision record with status acceptedStefan CoetzeeDecision record with status proposedNo comment round; see Gaps
DecisionA choice was made that others need to knowDecision record with status acceptedStefan Coetzeescripts/docs/eng/adr-NNNN-*.md, listed in Decision recordsNumbered records (ADR-0018); the docs build checks numbers and supersede links
BuildIssue in status: ready; whoever picks it up assigns it and sets status: in progressCommits on a branch from origin/main, pushed, a pull request open with the templateStefan CoetzeeCommits, pull requestAgent sessions, sdlc:work-item, .github/pull_request_template.md
ReviewPull request open, Conformity checks passed on itThe change review is in the pull request description; Stefan Coetzee merges, or a session merges on his goStefan CoetzeePull request with the review and the mergesdlc:change-review; the shared agent settings ask before gh pr merge (Agents in this repository)
TestCode or a page changedThe gate dry run prints overall=pass; the docs build finishes without stoppingStefan CoetzeeLocal dry run outputGate dry run, checks in scripts/build_docs.py (Docs tree)
GatePull request to main (required check), then the push to main the merge makesThe Conformity checks job passesStefan CoetzeeWorkflow run and its artifacts (90 days), conformity/latest.json in gitConformity gate, .github/workflows/conformity.yml
ReleaseGate passedThe Deploy to Pages job succeeded; the rollback path is knownStefan CoetzeeDeploy run in the github-pages environment, changelogDeploy pipeline, Roll back a deploy, sdlc:release
ObserveDeployedThe status page shows the site as operational and the Website deploys dashboard shows the run greenStefan Coetzee/inside/deploys.json, the Website deploys dashboardDeploy exporter, Status page
IncidentA reader-visible symptom, a failed gate run, or an alert someone seesRecord resolved, write-up linked under postmortem, follow-up work as issues under ticketsStefan Coetzeeincidents/YYYY-MM-DD-short-name.ymlStatus page, On-call and escalation

Follow-up work from an incident goes back to Request as issues, listed in the record's tickets field.

Gaps

Stages with no module or practice yet:

StageWhat is missingFills it
RFCNo comment round before a decision; a record goes from proposed to accepted on the operator's calldecisions:rfc, or comments on the issue that links the proposed record
ReviewNo second person: every commit and every merge comes from one GitHub account, so GitHub cannot require an approval or tell a session's merge from Stefan's. The ask rule on gh pr merge holds only sessions started in this repository. The branch ruleset waits for the deploy key of the conformity botThe ruleset per ADR-0029; a second account for reviews if one is ever needed
TestNo unit tests for the Python generators in scripts/, and no check after a deploy that the pages answersdlc:test-strategy
BuildCommit subjects do not name the issue or the decision, so a commit cannot be traced to its requestsdlc.traceability gate check on warn with since: 2026-10-11
ReleaseNo way to redeploy an earlier build: both jobs check out main. Rollback time is not measuredOwner decision; see Roll back a deploy
ObserveNo SLO for the site, and no alert reaches a person (ADR-0017)reliability:slo; the proposed routing in On-call and escalation

Tickets

GitHub Issues on uncovertechtalent/machinebehavior.io is the system of record; the board is a read-only view of it. Labels, as set at triage by a maintainer:

GroupLabelsMeaning
Typetype: feature, type: bug, type: chore, type: docsWhat kind of work. An issue without a type label is untriaged and the board does not show its text
Areaarea: inside, area: docs, area: map, area: gate, area: observability, area: legal, area: security, area: searchWhich part of the platform. An issue can carry more than one
PriorityP0, P1, P2, P3P0 must close before anyone outside sees the platform; P3 is optional
Statusstatus: ready, status: in progress, status: blockedThe board column. No status label means Backlog; closed means Done

The issue templates set no labels, so a new report stays untriaged until a maintainer reads it. Close an issue with a comment that links the commit. Issue text is public: no private addresses, host names, personal or financial details.

Commit subjects should name the issue (#123) or the decision (ADR-0007). Commits before 2026-10-11 do not.

Test strategy

LevelWhat it coversWhere it runs
UnitNone yet for the generators in scripts/Nowhere
Build checksscripts/build_docs.py stops on a malformed date, an unknown page type, an unknown doc: link, or decision records that disagreeLocally, when the docs are built
GateBlocking rule hits, placeholders, prediction hashes, site consistency, page labels, the vendored rule tableLocally as a dry run; in the workflow on every pull request to main and every push to main
SmokeNone after a deploy. The status page reads each site's /conformity/latest.json in the visitor's browser and shows a site that does not answer as an outageNowhere in the pipeline

Before pushing a branch, run:

git fetch origin && git rebase origin/main
python3 .github/actions/conformity/run.py --root . --config conformity/site-tier.json --requirements conformity/requirements.json --out conformity --dry-run

Push the branch only when the dry run prints overall=pass. In a script, compare the value; a grep for overall= succeeds on a failing run too. The same checks run on the pull request before the merge. The one-line form matches the allow rule in the shared agent settings.

Release and rollback

  • Changelog: changelog, generated by scripts/build_changelog.py from closed issues and commits, by day, grouped Added, Changed and Fixed. There are no version tags.
  • Rollback: Roll back a deploy.
  • Feature flags: none in this repository.

Built from scripts/docs by build_docs.py.