Skip to content

feat(web): put the SDLC board behind a feature flag, off by default - #932

Merged
arielshad merged 7 commits into
mainfrom
feat/140-sdlc-board-flag
Oct 11, 2026
Merged

arielshad merged 7 commits into
mainfrom
feat/140-sdlc-board-flag

Conversation

@arielshad

Copy link
Copy Markdown
Contributor

What

Adds an sdlcBoard feature flag, off by default, and puts the SDLC board behind it. While the flag is off:

  • the sidebar hides the SDLC Board link;
  • /sdlc returns 404;
  • GET /api/sdlc-events returns 404;
  • listSdlcBoard, reorderSdlcTask, updateSdlcTaskStatus and updateSdlcSubTaskStatus return an error without calling their use cases.

The flag is in the feature-flag catalog under Platform. It is listed on /settings/feature-flags with a switch, and shep settings flags enable sdlcBoard turns it on from the CLI. While it is on, everything works as before.

Unchanged: the Control Center canvas, the /features table, and the agent-side board tracker. The tracker keeps recording tasks, so turning the flag on shows a complete board. The board has no CLI command group, so there is no CLI gate to add.

Commit Change
19edf55 The flag: TypeSpec (= false), defaults, migration 171 (feature_flag_sdlc_board INTEGER NOT NULL DEFAULT 0), mapper, repository SQL, web flag state, catalog entry, and labels in all 9 locales
777699b One shared web feature gate in lib/feature-gate.ts (isFeatureOn, featureNotFound, FEATURE_OFF_ERROR). requireFeaturePage and the feedback/alerts routes now use it; intakeDisabled() is removed
6227dca Gates the sidebar link, the page, the SSE route and the four actions
50e73f2 The /sdlc accessibility e2e case turns the flag on; FEATURES, domain-models and the LESSONS flag checklist are updated
05e4558 Migration renumbered from 170 to 171 (170 is the checkpoints workstream's)

Why

The owner decided the SDLC board should not be part of the default product surface. Implements specs/140-sdlc-board-flag/, building on the flag catalog and /settings/feature-flags from #925 (spec 135).

Screenshots / Recording

There is no new component. The flags view renders the new row from the catalog, like every other flag. The web e2e suite ran locally against the release build; it covers /settings/feature-flags, plus /sdlc with the flag on.

Testing

Local runs:

Check Result
pnpm generate no drift
pnpm lint, pnpm format:check, pnpm typecheck, pnpm tsp:compile pass
pnpm test:unit 14,953 passed (on the merge with main at 1e1f859)
pnpm test:int 2,142 passed
pnpm check:stories pass
pnpm build:release, pnpm build:storybook pass
Web e2e with CI settings (flaky counts as failure) 86 of 86 passed

New tests, each landed RED first:

  • tests/unit/presentation/web/app/sdlc-board-gating.test.ts covers the page, the SSE route and all four actions, with the flag off and on.
  • tests/unit/presentation/web/lib/feature-gate.test.ts.
  • A sidebar-links case for /sdlc.
  • migration-171-sdlc-board-flag.test.ts, which checks the column, DEFAULT 0 and idempotency.
  • A settings repository round-trip.
  • The mapper both ways, the catalog group and the defaults.

Checklist

  • pnpm lint passes
  • pnpm format:check passes
  • pnpm typecheck passes
  • pnpm test:unit and pnpm test:int pass
  • pnpm build succeeds
  • pnpm build:storybook succeeds (no new components)
  • pnpm tsp:compile ran and packages/core/src/domain/generated/output.ts is committed
  • Tests landed RED-first
  • No domain/ or application/ file imports anything from infrastructure/
  • Conventional Commits; feat for the user-visible change
  • LESSONS.md: the flag checklist now names the shared gate, and says that API routes and server actions need the gate too, not just the page

🤖 Generated with Claude Code

https://claude.ai/code/session_01TxtN2VcWzg6NTCLj4DbmfL


Generated by Claude Code

claude and others added 7 commits October 11, 2026 11:38
Claude-Session: https://claude.ai/code/session_01TxtN2VcWzg6NTCLj4DbmfL

Co-Authored-By: Shep Bot <shep-agent@users.noreply.github.com>
Adds FeatureFlags.sdlcBoard (default false) with migration 170
(feature_flag_sdlc_board INTEGER NOT NULL DEFAULT 0), the mapper and repository
columns, the web flag state and a Platform entry in the flag catalog, so it shows
on /settings/feature-flags and in `shep settings flags`. Labels in all 9 locales.

Claude-Session: https://claude.ai/code/session_01TxtN2VcWzg6NTCLj4DbmfL

Co-Authored-By: Shep Bot <shep-agent@users.noreply.github.com>
Moves the off-flag 404 out of the intake module into lib/feature-gate.ts
(isFeatureOn, featureNotFound, FEATURE_OFF_ERROR). requireFeaturePage and the
feedback and alerts routes use it; the SDLC board gates next reuse it.

Claude-Session: https://claude.ai/code/session_01TxtN2VcWzg6NTCLj4DbmfL

Co-Authored-By: Shep Bot <shep-agent@users.noreply.github.com>
While sdlcBoard is off the sidebar hides the SDLC Board link, /sdlc and
/api/sdlc-events return 404, and the four board actions return an error without
calling their use cases. Turn it on from /settings/feature-flags or with
`shep settings flags enable sdlcBoard`. The canvas and /features are unchanged.

Claude-Session: https://claude.ai/code/session_01TxtN2VcWzg6NTCLj4DbmfL

Co-Authored-By: Shep Bot <shep-agent@users.noreply.github.com>
The /sdlc accessibility case enables the flag for its run. FEATURES and
domain-models list sdlcBoard (off), the LESSONS flag checklist names the shared
feature gate, and spec 140 is marked implemented.

Claude-Session: https://claude.ai/code/session_01TxtN2VcWzg6NTCLj4DbmfL

Co-Authored-By: Shep Bot <shep-agent@users.noreply.github.com>
Migration 170 is taken by the checkpoints workstream.

Claude-Session: https://claude.ai/code/session_01TxtN2VcWzg6NTCLj4DbmfL

Co-Authored-By: Shep Bot <shep-agent@users.noreply.github.com>
Co-Authored-By: Shep Bot <shep-agent@users.noreply.github.com>
@arielshad
arielshad marked this pull request as ready for review October 11, 2026 12:48
@arielshad
arielshad merged commit e71f138 into main Oct 11, 2026
24 checks passed
@arielshad
arielshad deleted the feat/140-sdlc-board-flag branch October 11, 2026 12:48
arielshad pushed a commit that referenced this pull request Oct 11, 2026
<p align="center">
  <a href="https://github.com/shep-ai/shep">
    <img src="https://raw.githubusercontent.com/shep-ai/shep/main/docs/screenshots/shep-card.jpg" alt="Shep — run multiple AI agents in parallel" width="720" />
  </a>
</p>

# 🚀 Shep [v1.241.0](/compare/v1.240.0...v1.241.0) · _2026-10-11_

> Your organization does not have access to Claude. Please login again or contact your administrator.

### ✨ Features

* **agents:** emit decision.answered and decision.defaulted telemetry (spec 136) ([#929](#929)) ([1e1f859](1e1f859)), closes [#922](#922) [#925](#925)

  ![default](https://raw.githubusercontent.com/shep-ai/shep/v1.241.0/specs/134-unified-decisions/evidence/decision-panel-default.png)
  ![dark](https://raw.githubusercontent.com/shep-ai/shep/v1.241.0/specs/134-unified-decisions/evidence/decision-panel-dark.png)
  ![gate](https://raw.githubusercontent.com/shep-ai/shep/v1.241.0/specs/134-unified-decisions/evidence/decision-panel-approval-gate.png)
  ![not resumable](https://raw.githubusercontent.com/shep-ai/shep/v1.241.0/specs/134-unified-decisions/evidence/decision-panel-not-resumable.png)
* **agents:** git checkpoints after each feature-agent step (spec 138) ([#931](#931)) ([26265ed](26265ed)), closes [#925](#925)

  ![checkpoints tab light](https://raw.githubusercontent.com/shep-ai/shep/v1.241.0/specs/138-git-checkpoints/evidence/checkpoints-tab-light.png)
  ![checkpoints tab dark](https://raw.githubusercontent.com/shep-ai/shep/v1.241.0/specs/138-git-checkpoints/evidence/checkpoints-tab-dark.png)
  ![checkpoints tab compare light](https://raw.githubusercontent.com/shep-ai/shep/v1.241.0/specs/138-git-checkpoints/evidence/checkpoints-tab-compare-light.png)
  ![checkpoints tab compare dark](https://raw.githubusercontent.com/shep-ai/shep/v1.241.0/specs/138-git-checkpoints/evidence/checkpoints-tab-compare-dark.png)
* **web:** put the SDLC board behind a feature flag, off by default ([#932](#932)) ([e71f138](e71f138)), closes [#925](#925)

### 🐛 Bug Fixes

* **cli:** wait for the conpty host to exit when a terminal closes ([#928](#928)) ([94a846d](94a846d)), closes [#925](#925) [#925](#925)

## 📦 Install or update

```bash
# upgrade an existing install
npm i -g @shepai/cli@1.241.0

# or run instantly without installing
npx @shepai/cli@latest
```

## 💬 Join the community

[💬 **Discord**](https://discord.gg/ES6tdVFfur) · [📖 **Docs**](https://github.com/shep-ai/shep#readme) · [⭐ **Star on GitHub**](https://github.com/shep-ai/shep) · [🐛 **Report an issue**](https://github.com/shep-ai/shep/issues)

---

<sub>🤖 Released autonomously by Shep — built by parallel AI agents working in isolated git worktrees. Try it: `npx @shepai/cli`</sub>

Co-Authored-By: Shep Bot <shep-agent@users.noreply.github.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.

2 participants