a-stranger-adopts-it-unaided — A stranger installs Majordomus and is stopped from a false done in ten minutes, and every outside first run teaches the tool
The stranger's first ten minutes are one measured gate, init tells an adopter something true about their own repository, and each real outside run is recorded unedited and turned into cases.
BLOCKED 0 of 4 issues done
- ready
- 0
- blocked
- 4
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
Every test of adoption runs either in this repository or in a fixture the maintainer drives. Case 1024 proves an installed release serves a foreign repository, but stops at the MCP server answering; nothing walks a stranger's path from the installer to the refusal that is the product's whole point, and nothing times it. init reports what it created, not what it found in the repository it entered. Outside first runs exist only as maintainer-written field reports kept outside any repository. The owner's 2026-10-12 order that outreach waits for this is recorded nowhere on master. Proposed in ADR 0206 (Public outreach begins only after a stranger has finished a first task unaided) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c241#2, chatgpt-majordomus:c241#4, chatgpt-majordomus:c256#5, chatgpt-majordomus:c137#2, chatgpt-majordomus:c269#5.
Outcome
The stranger's first ten minutes are one measured gate, init tells an adopter something true about their own repository, and each real outside run is recorded unedited and turned into cases.
Current state
scripts/ci/install-check and test/cases/1024_an_installed_release_serves_a_foreign_repository.sh install a fixture release and read initialize/tools/list (I2162 DONE). lib/init.sh prints 'created ...' and hook advice only. docs/ADOPTION.md describes the second run; docs/ADOPTION_SECOND_RUN.md, cited by a-second-adopter-is-served, is not on master. a-second-adopter-is-served holds one issue on master (I2601 VERIFY). No intent or ADR on master records 'beta before outreach'.
Desired state
A case runs the published-installer path to a refused and an accepted finish in a foreign fixture and records elapsed time and manual steps; init ends with its findings; .ai/repo/knowledge/curated carries one observed record per outside run, and each friction is an issue in this milestone or in a-second-adopter-is-served.
Scope
- scripts/ci/install-check
- lib/init.sh
- docs/ADOPTION.md
- .ai/repo/workflows
- .ai/repo/knowledge/curated
- .github/workflows
- .ai/repo/ci/gates.yaml
- .ai/repo/adrs
- share/providers.yaml
Out of scope
- Outreach channels, posts and dates
- The adopting repositories themselves: evidence, read only
- Fixes the second-adopter findings already carry
Acceptance criteria
- Every criterion of intent a-stranger-adopts-it-unaided has its evidence
- No issue of the milestone decides by the identity of the repository it runs in
Validation
- majordomus plan validate
Risks
- A ten-minute bar measured on a fast Mac may not hold on a cold Linux runner; the case records the platform and the bar is per platform
- Outside runs depend on real people; the milestone cannot close by effort alone
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 |
|---|---|---|---|---|
| I3127 | BLOCKED | 1 | I2162 | A clean installation reaches its first refused finish in a foreign repository, and the time and the manual steps are recorded |
| I3128 | BLOCKED | 1 | I3123 | init ends with what it found in the repository it adopted, each finding naming its file |
| I3129 | BLOCKED | 2 | I3127, I3128 | An outside developer's first run is recorded as it happened, and each friction it met becomes an issue with a failing case |
| I3321 | BLOCKED | 2 | I3127 | In a foreign repository, the wired pre-push hook of the claude-code projection refuses what finish would refuse, through the installed release |
The graph
flowchart LR
I3127["I3127<br/>A clean installation reaches its first refused finish in a foreign repository, and the time and the manual steps are recorded"]:::blocked
I3128["I3128<br/>init ends with what it found in the repository it adopted, each finding naming its file"]:::blocked
I3129["I3129<br/>An outside developer's first run is recorded as it happened, and each friction it met becomes an issue with a failing case"]:::blocked
I3321["I3321<br/>In a foreign repository, the wired pre-push hook of the claude-code projection refuses what finish would refuse, through the installed release"]:::blocked
I3127 --> I3129
I3127 --> I3321
I3128 --> I3129
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 (4)
- I3127 A clean installation reaches its first refused finish in a foreign repository, and the time and the manual steps are recorded
- I3128 init ends with what it found in the repository it adopted, each finding naming its file
- I3129 An outside developer's first run is recorded as it happened, and each friction it met becomes an issue with a failing case
- I3321 In a foreign repository, the wired pre-push hook of the claude-code projection refuses what finish would refuse, through the installed release
Canonical record: .ai/repo/project/milestones/a-stranger-adopts-it-unaided.yaml. Read it back with majordomus plan show a-stranger-adopts-it-unaided.