public-proof — A visitor sees the product prove itself, and can check every claim it makes
One recorded scenario tells the whole story — a worker strays, claims it is done, hands over, and is refused until the repository's own test passes — and it drives the homepage hero, its own route, the README's first transcript and the live smoke check, each held to the recorded run by a gate rather than by care.
ACTIVE 3 of 5 issues done
- ready
- 2
- blocked
- 0
- active
- 0
- verify
- 0
- done
- 3
- cancelled
- 0
Problem
A developer who has never seen Majordomus meets a homepage whose first viewport describes a supervisory control layer in its own vocabulary, beside a console that illustrates each lifecycle command separately. Nothing on it shows the tool doing the one thing that sets it apart — refusing work a worker calls finished — as one story a newcomer can follow, and no page exists that a link from outside could send somebody to. The README's first transcript is hand-written. Underneath, the use-case catalogue reached the site without any scenario since scenarios moved into the body, so every executable use case read as merely described.
Outcome
One recorded scenario tells the whole story — a worker strays, claims it is done, hands over, and is refused until the repository's own test passes — and it drives the homepage hero, its own route, the README's first transcript and the live smoke check, each held to the recorded run by a gate rather than by care.
Current state
The homepage hero replays the lifecycle command by command; there is no challenge route; README.md's first block is an illustration; scenario steps can only invoke the tool, so no use case shows a file outside the claimed scope being refused; catalogue.json carries no scenario and every use case's maturity is described; scripts/pages verify asks only which commit the public site serves.
Desired state
A worker step lets a fixture scenario show the change it judges. The challenge use case runs in the site derivation and its run is site/data/generated/challenge.json; /challenge/ and the homepage replay render it and scripts/site-check holds both to it in both directions; README.md's first transcript is a step of it, refused otherwise; maturity is derived from scenarios again; and scripts/pages verify --smoke asks the public bytes for the challenge after every publication.
Scope
- lib/usecase.sh
- lib/finish.sh
- share/schemas/majordomus/use-case
- .ai/repo/use-cases
- test/fixtures/commands
- test/cases
- scripts/generate-site-data
- scripts/site-check
- scripts/pages
- scripts/lib/interaction-specs
- site
- README.md
- docs
- .ai/repo/ci/pages.yaml
- .github/workflows/pages.yml
Out of scope
- Analytics or any third-party script on the site; the offline rule refuses one, and nothing here needs one
- Fabricated adoption figures, testimonials, logos or benchmark comparisons
- A new command that audits a repository Majordomus is not installed in; doctor needs init, and that is a product decision, not a page
- Generated social images per page; the existing card stays until a generator exists for it
Acceptance criteria
- A fixture scenario can carry a worker step, recorded with actor worker, refused in a live scenario and beside run or obligation
- The challenge scenario passes against the tree's own tool, refuses at least once and ends with the work accepted, and the derivation refuses to publish it otherwise
- /challenge/ and the homepage carry every recorded command and decision line of the run, and nothing else stands in for them
- README.md's first transcript is a recorded step of the challenge, and the derivation refuses it otherwise
- catalogue.json carries each use case's scenario and maturity is derived from it
- The public site serves the merged commit and its smoke routes after the Pages workflow publishes it
Validation
- bash test/run.sh 632_a_scenario_shows_the_worker_it_judges
- bash test/run.sh 103_obligations
- scripts/generate-site-data --check
- scripts/site-check
- scripts/pages verify --commit <master sha> --smoke
Evidence required
- challenge_recorded
- site_holds_the_run
- public_site_serves_it
Evidence
A milestone is never done because its issues are; the last step is its own acceptance, and it is gated on the rows below.
| covers | type | command | result |
|---|---|---|---|
| challenge_recorded | test | MJ_TEST_JOBS=4 bash test/run.sh 632_a_scenario_shows_the_worker_it_judges 103_obligations | ok 632 and ok 103 at master 1393d9ef2a; its one issue I1600 is DONE (de14385dd3); site/data/generated/challenge.json holds the 10-step run: check refused on scope, finish refused twice on the failing test, handover then context, accepted finish |
| site_holds_the_run | ci | gh run view 38083715376 --json jobs (validate on master 890e112d04: the site job runs scripts/generate-site-data --check and scripts/site-check --no-sync) | site and pages jobs success; 890e112d04..1393d9ef2a changes no file under apps, lib, scripts, site/templates or test; site-check holds /challenge/ and the homepage replay to every recorded line, the panel count, the CTA and each guarantee link |
| public_site_serves_it | artifact | curl -fsS https://majordomus.dev/challenge/ | grep -o 'data-outcome=\"[a-z]*\"' | sort | uniq -c; curl -fsS https://majordomus.dev/build.json | HTTP 200; 10 step panels (4 accepted, 3 change, 3 refused) = the 10 recorded steps; the homepage CTA links /challenge/; build.json names master 890e112d04, 0.20.0, dirty false |
Issues
Each one is an execution contract with its own acceptance criteria, validation command and required evidence. The wave column is the layer of the dependency graph it sits in.
| issue | status | wave | depends on | title |
|---|---|---|---|---|
| I1600 | DONE | 0 | — | The challenge is one recorded run, and every public surface replays it |
| I2417 | DONE | 0 | — | The landing page is a click-through story: an editorial hero and an evidence chain a visitor steps through |
| I3436 | DONE | 0 | — | Every article reads in every language the site declares, and its counterparts are reciprocal |
| I3437 | READY | 1 | I3436 | An article names every language version in one translations table, and every member names the same group |
| I3438 | READY | 1 | I3436 | A translation records the digest of its source, and site-check refuses one its source has moved past |
The graph
flowchart LR
I1600["I1600<br/>The challenge is one recorded run, and every public surface replays it"]:::done
I2417["I2417<br/>The landing page is a click-through story: an editorial hero and an evidence chain a visitor steps through"]:::done
I3436["I3436<br/>Every article reads in every language the site declares, and its counterparts are reciprocal"]:::done
I3437["I3437<br/>An article names every language version in one translations table, and every member names the same group"]:::ready
I3438["I3438<br/>A translation records the digest of its source, and site-check refuses one its source has moved past"]:::ready
I3436 --> I3437
I3436 --> I3438
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxLinked from this diagram (5)
- I1600 The challenge is one recorded run, and every public surface replays it
- I2417 The landing page is a click-through story: an editorial hero and an evidence chain a visitor steps through
- I3436 Every article reads in every language the site declares, and its counterparts are reciprocal
- I3437 An article names every language version in one translations table, and every member names the same group
- I3438 A translation records the digest of its source, and site-check refuses one its source has moved past
Canonical record: .ai/repo/project/milestones/public-proof.yaml. Read it back with majordomus plan show public-proof.