Skip to content

BOB-090: built-in library workflow — CLI/library projects no longer strand at the test stage - #16

Open
ccevans wants to merge 5 commits into
integrate/app-studiofrom
tkt-BOB-090
Open

ccevans wants to merge 5 commits into
integrate/app-studiofrom
tkt-BOB-090

Conversation

@ccevans

@ccevans ccevans commented Aug 24, 2026

Copy link
Copy Markdown
Owner

Stacked on integrate/app-studio (merge #14 first).

  • library [plan→build→review] and library-secure [plan→build→security→review] added to BUILT_IN_WORKFLOWS.
  • New default_workflow config key, derived stack-aware at bobby init/createProject (explicit stack field wins; else library iff no health checks and no dev command), written to .bobbyrc.yml with an explanatory comment. Resolver precedence: flag > ticket frontmatter > user workflows.default > default_workflow > built-in; unknown values throw with a .bobbyrc.yml hint.
  • Loud failure instead of stranding: any prompt path that would launch bobby-test against a no-health-checks config now instructs blocking the ticket with "no live app to test — use the library workflow".
  • workflow list shows effective stages and the project default.

Review approved (zero blocking findings, all six ACs). Live-tested against scratch library/CLI and web projects: a library ticket runs backlog→shipping with no testing stage; all three run paths produce the block instruction when forced into testing. Full suite 1458 passed / 0 failed; lint 0 errors; target-matrix and workflow invariant suites green with zero per-target edits.

🤖 Generated with Claude Code

ccevans and others added 5 commits August 23, 2026 19:31
…p test gates

- BUILT_IN_WORKFLOWS gains library (plan, build, review) and library-secure
  (plan, build, security, review) — review runs the suite, the correct
  verification when there is no live app.
- resolveWorkflow honors a new default_workflow config key when resolving the
  name 'default': flag > ticket frontmatter > user workflows.default >
  default_workflow > built-in. Unknown names get a .bobbyrc.yml hint.
- deriveDefaultWorkflow(stack, config): explicit stack field wins; else
  library iff no health checks and no dev command. Pure, called at init/new,
  never inside scaffoldProject (BOB-123).
- Every testing-stage prompt path (orchestration, sprint, feature, slow mode,
  single/batch test runs) takes a default-true hasHealthChecks and, when
  false, instructs blocking the ticket with 'no live app to test — use the
  library workflow' instead of launching bobby-test. Wording lives in one
  helper; the reason string appears exactly once in source.

TKT-049 invariant block and target-matrix suite green with zero edits.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
An overridden built-in printed the built-in stage list next to
'(overridden)' — now the row shows the override's resolved steps. When
default_workflow is set, list names it as the project default.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…a comment

- writeConfigCommented emits default_workflow near the top with an
  explanatory comment (why, and how to undo); the workflows hint block now
  names library and library-secure.
- bobby init and bobby new call deriveDefaultWorkflow at their config
  construction sites — outside scaffoldProject, so refresh stays
  byte-identical (BOB-123).
- bobby sprint threads hasHealthChecks into buildSprintPrompt.
- bobby run help text names library among the built-ins.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…plate, README

- bobby-test skill (template + tracked scaffold copy): runtime-phrased
  no-live-app guard — block the ticket with the library-workflow reason
  instead of emitting BLOCKED test cases one by one.
- CLAUDE.md template's built-in workflow list names library/library-secure.
- README documents both workflows, when Bobby picks library automatically,
  how to opt out, and the default-name shadowing caveat.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…heck

The no-live-app gate now replaces the testing-stage launch with a block
prompt whenever config has no health_checks, and the FSM harness's fake
executor parsed 'block' as a stage. Every scenario in this file is a
live-app project running a test-ending workflow, so the fixture carries a
health check unless a test brings its own key.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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