Skip to content

πŸͺ¦ refactor(bro): delete first-run-onboarding ceremony β€” modern-agent UX#128

Merged
ZaxShen merged 3 commits into
devfrom
refactor/no-onboarding-doctrine
Apr 26, 2026
Merged

πŸͺ¦ refactor(bro): delete first-run-onboarding ceremony β€” modern-agent UX#128
ZaxShen merged 3 commits into
devfrom
refactor/no-onboarding-doctrine

Conversation

@ZaxShen
Copy link
Copy Markdown
Contributor

@ZaxShen ZaxShen commented Apr 26, 2026

Summary

User direction (verbatim): 'Skip onboarding. Use defaults silently. Persist to DB so memory survives across sessions. Welcome banner so user knows bro is activated.'

Modern agents (Cursor, ChatGPT, etc.) don't onboard β€” they just work. TMB's previous AskUserQuestion-driven ceremony asking name + branching + pr_target + protected was friction with no upside in the 80% case, and broke completely in headless `claude -p` mode.

Behavior change

First contact (`config_get` returns null):

  • Bro silently writes 3 default `plugin_config` rows + `tmb_defaults_applied` ledger event.
  • No `identity` row β€” its absence means 'user hasn't named themselves yet'. Bro greets without a name.
  • Welcome banner mentions defaults: 'Entering bro mode. First activation here β€” applied defaults: github-flow, main as PR target. Say `reonboard` to customize.'

Returning sessions:

  • Bro reads existing config. No writes.
  • Welcome banner: 'Welcome back β€” resuming issue #N: <title>' OR 'Welcome back. What are we doing?'

Welcome banner is now mandatory. Three documented variants in CLAUDE.md.

`tmb_reonboard` is the only path to write identity rows or change policy keys. Same skill, same UI, repositioned in description.

Files touched (23 files, +160 / βˆ’520 lines)

Deleted

  • `skills/tmb_first-run-onboarding/SKILL.md` (entire skill)
  • `tests/lint/onboarding-skill-contract.sh` (no skill to lint)
  • `tests/dogfood/flows/01-onboarding/` (no ceremony to test)
  • `run-all.sh` step that ran the deleted lint

Added

  • `tests/dogfood/flows/01-first-contact/` β€” regression test for the no-onboarding doctrine. `AskUserQuestion` and `identity_set` are explicitly in `tools-forbidden.json` β€” any future doctrine drift that reintroduces an onboarding form fails this flow immediately.

Renamed (pre-1.0 clean break, no migration shim)

  • Ledger event type: `tmb_onboarding_complete` β†’ `tmb_defaults_applied`
  • All fixtures, outcome.sql files, ENUMS.md, FLOWS.md, manual/setup.md updated in lockstep

Updated

  • `CLAUDE.md` β€” first-action chain rewritten + new mandatory Welcome banner section + routing table row updated
  • `docs/architecture/FLOWS.md` β€” Flow 1 rewritten as 'First Contact (defaults applied silently)' with new sequence diagram
  • `docs/architecture/FILES.md` β€” skill index refreshed (drop first-run-onboarding, add concerns-protocol/direct-mode/headless-fallback/mcp-error-handling/push-gate from recent PRs)
  • `skills/tmb_reonboard/SKILL.md` β€” description + purpose reframed as 'configure, not re-confirm'
  • `tests/dogfood/fixtures/*.sql` β€” leading comments updated; filenames retained for backward compat
  • `tests/dogfood/flows/95-anonymous-cold-restart/outcome.sql` β€” event-type rename only

Local verification

  • βœ“ skill-frontmatter lint passes (18 skills, including 4 new from recent PRs)
  • βœ“ link-check passes (84 links)
  • βœ“ agent-line-budget passes

Test plan (after merge)

  • Re-trigger l6-dogfood.yml on dev
  • 01-first-contact: empty DB β†’ `@bro hi` β†’ confirm `tmb_defaults_applied` event + 3 config rows + NO identity row + NO AskUserQuestion call
  • 95-anonymous-cold-restart: pre-seeded state β†’ `@bro hi` β†’ confirm bro reads existing state + welcome banner says 'Welcome back' + no duplicate writes
  • D-direct-mode: typo fix β†’ confirm bro engages Direct Mode (no AskUserQuestion stall like before)
  • 02-simple-task: planning ask β†’ confirm branch-id-proposal auto-accepts in headless via the existing fallback

Followup (separate)

The 02-simple-task headless_fallback we proved works in PR #124's run is preserved. The other 3 wired flows should now pass thanks to:

  1. No onboarding to halt on (this PR)
  2. Headless-fallback skill for branch-id-proposal auto-accept (PR βœ‚οΈπŸ›‘οΈ refactor: slim CLAUDE.md 268β†’149 + extract headless-fallback / mcp-errors / direct-mode / push-gate to skillsΒ #124)
  3. Direct-mode skill explicitly loadable for ≀3-line fixes (PR βœ‚οΈπŸ›‘οΈ refactor: slim CLAUDE.md 268β†’149 + extract headless-fallback / mcp-errors / direct-mode / push-gate to skillsΒ #124)

ZaxShen added 3 commits April 26, 2026 15:08
Modern agents (Cursor, ChatGPT, etc.) don't onboard. They just work.
TMB's previous AskUserQuestion-driven ceremony asking name + branching
+ pr_target + protected was friction with no upside in the 80% case,
and it broke completely in headless `claude -p` mode (no Human to
answer).

User direction: 'Skip onboarding. Use defaults silently. Persist to
DB so memory survives across sessions. Welcome banner so user knows
bro is activated.'

## Behavior

**First contact** (config_get returns null) β€” bro silently writes:
  - config: branching_model=github-flow, pr_target=main, protected=["main"]
  - ledger: tmb_defaults_applied event
  - NO identity row (its absence means 'user hasn't named themselves yet')

**Welcome banner is mandatory** β€” three variants documented in CLAUDE.md:
  - First activation: 'Entering bro mode. First activation here β€” applied defaults: github-flow, main as PR target. Say `reonboard` to customize.'
  - Returning, pending work: 'Welcome back β€” resuming issue #N: <title>.'
  - Returning, idle: 'Welcome back. What are we doing?'

**`tmb_reonboard` is now the only path** to write identity rows or change
policy keys. Same skill, same UI, clearer framing (was 're-run onboarding').

## Removed

- `skills/tmb_first-run-onboarding/` (entire skill β€” 268 lines deleted)
- `tests/lint/onboarding-skill-contract.sh` (no skill to lint)
- `tests/dogfood/flows/01-onboarding/` (no ceremony to test)
- `run-all.sh` step that ran the deleted lint

## Added

- `tests/dogfood/flows/01-first-contact/` β€” regression test for the
  no-onboarding doctrine. Asserts AskUserQuestion + identity_set are
  NOT called on first contact (they're in tools-forbidden.json).

## Renamed (pre-1.0 clean break, no migration shim)

- Ledger event type: `tmb_onboarding_complete` β†’ `tmb_defaults_applied`
  - All fixtures, outcome.sql files, ENUMS.md, FLOWS.md updated in lockstep.

## CLAUDE.md changes

- First-action chain step 1 rewritten β€” silent default-write protocol
  with explicit DO NOT WRITE identity row.
- New 'Welcome banner' section after first-action chain β€” mandatory
  three-variant announcement spec.
- Routing table row 'Re-onboarding' β†’ 'Configure / change settings'.

## FLOWS.md / FILES.md

- Renamed Flow 1 'First-Run Onboarding' β†’ 'First Contact (defaults
  applied silently)'. Sequence diagram redrawn β€” no AskUserQuestion
  calls, just config_set Γ—3 + ledger_log + welcome banner.
- FILES.md skill index updated: removed first-run-onboarding row,
  added the four reactive skills (concerns-protocol, direct-mode,
  headless-fallback, mcp-error-handling, push-gate) introduced in
  recent PRs.

## Fixture comments

- `empty.sql` β€” comment updated from 'first-run / onboarding' β†’ 'first-contact'.
- `onboarding-{anonymous,named}.sql` β€” filenames retained for backward
  compat (no flow renames needed); leading comments updated to reflect
  the post-no-onboarding semantics.

## Local verification

- βœ“ skill-frontmatter lint passes (18 skills)
- βœ“ link-check passes (84 links)
- βœ“ agent-line-budget passes
…ll-smoke

PR #128 deleted tests/lint/onboarding-skill-contract.sh as part of the
no-onboarding doctrine. The install-smoke Dockerfile still RUN'd it,
breaking L0 in CI. Removing the step (was A5, renumbered subsequent
A7 β†’ A6 for sequence cleanliness).
@ZaxShen ZaxShen merged commit b9bee01 into dev Apr 26, 2026
5 checks passed
@ZaxShen ZaxShen deleted the refactor/no-onboarding-doctrine branch April 26, 2026 22:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant