Skip to content

I3128 — init ends with what it found in the repository it adopted, each finding naming its file

After init writes the layer, print a read-only account of the adopting repository, each line naming the file it read: which instruction files share/providers.yaml declares exist and whether they agree by a rule docs/ADOPTION.md states, which hooks git would run (core.hooksPath and the hook files there) are wired to doctor or check, and whether the effective profile declares verification.verify_commands (I3123).

BLOCKED wave 1 · p2 · implementation profile · parallel safe

Part of 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.

Blocked. This issue cannot start until I3123, milestone:a-stranger-adopts-it-unaided are done. The status is derived from that, not declared.

Objective

After init writes the layer, print a read-only account of the adopting repository, each line naming the file it read: which instruction files share/providers.yaml declares exist and whether they agree by a rule docs/ADOPTION.md states, which hooks git would run (core.hooksPath and the hook files there) are wired to doctor or check, and whether the effective profile declares verification.verify_commands (I3123).

Why

The 2026-09-15 promotion analysis put a concrete finding about the adopter's own repository at the end of the first three minutes, instead of an onboarding form. Today init answers what it created and what hooks to paste, which tells a stranger nothing about why the tool is worth keeping. 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:c137#2.

Current state

lib/init.sh prints 'created ...', the personal/shared cover and hook advice; I1989 (DONE) seeds a scope for the stack it finds; share/providers.yaml declares agents, bb, claude-code, codex, gemini and generic; doctor's wiring check reads only the policy's own enforcement entries; an unlanded peer change (I2941, p7) makes init append an AGENTS.md line to an existing README.

Desired state

init's last block is 'found:' lines derived from the same providers/editors data update renders from, with nothing written by it; an adoption fixture asserts each line.

Scope

  • lib/init.sh
  • docs/ADOPTION.md
  • test/fixtures/commands/init.json
  • share/commands.yaml
  • .ai/repo/use-cases/adopt-an-existing-repository.md
  • .ai/repo/use-cases/install-the-tool-in-one-command.md
  • .ai/repo/use-cases/use-the-tool-as-your-own-in-a-shared-repository.md
  • .ai/repo/use-cases/say-what-the-tool-is-for.md
  • site/data/generated/catalogue.json
  • site/content/docs/adoption.md
  • .ai/repo/project/intents
  • share/providers.yaml

Out of scope

  • Fixing anything it finds
  • A new audit command or noun
  • Cursor rules, until share/providers.yaml declares a cursor provider
  • Detecting test entry points such as package.json scripts or Makefile targets

Dependencies

What waits on this

Acceptance criteria

  • In a fixture with two disagreeing instruction files, an unwired pre-commit hook and no verify command, init prints one finding for each, naming the file
  • The findings write nothing; the tree after init is what it was without them
  • The verify-command finding reads verification.verify_commands from the effective profile (I3123) and names the profile file it read; no test entry point is scanned
  • The hook finding reads git config core.hooksPath and the hook files git would run there, so it also sees hooks wired by husky or lefthook
  • The instruction-file finding covers exactly the targets share/providers.yaml declares and compares them by a rule stated in docs/ADOPTION.md
  • The self-check runs init in a temporary clone of this repository with .ai/ removed, and its findings are empty or true; nothing in this checkout is written
  • test/fixtures/commands/init.json, the init note in share/commands.yaml and the recorded init runs in the four use cases are updated, and derive-check passes over site/data/generated/catalogue.json and site/content/docs/adoption.md
  • A personal init's git-status-unchanged check still holds after the findings run
  • In the same change as its case, the intent's criterion init-says-what-it-found is re-recorded as evidence: test with the concrete case path, the case numbered by `scripts/case-numbers next` and announced on the board at start

Validation

  • bash test/run.sh 3113_the_adoption_footprint_is_inventoried
  • majordomus plan validate

Evidence required

  • case_init_findings

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I3128.yaml. Read it back with majordomus plan show I3128.

Searches the titles and descriptions of every page this site publishes.