diff --git a/apps/backend/internal/runtimeflags/registry.go b/apps/backend/internal/runtimeflags/registry.go index 14772708a4..c34391a3c4 100644 --- a/apps/backend/internal/runtimeflags/registry.go +++ b/apps/backend/internal/runtimeflags/registry.go @@ -73,7 +73,7 @@ var registrations = []runtimeFlagRegistration{ Key: "features.needsYouInbox", EnvVar: "KANDEV_FEATURES_NEEDS_YOU_INBOX", Kind: KindFeature, - Label: "Needs-you Inbox", + Label: "Inbox", Description: "Enables a workspace-scoped sidebar destination listing exactly the answerable clarification bundles for the active workspace, independent of Office mode.", Stability: StabilityExperimental, RiskLevel: RiskLow, diff --git a/apps/backend/internal/runtimeflags/registry_test.go b/apps/backend/internal/runtimeflags/registry_test.go index 6f8307784a..9636295e1c 100644 --- a/apps/backend/internal/runtimeflags/registry_test.go +++ b/apps/backend/internal/runtimeflags/registry_test.go @@ -62,6 +62,34 @@ func TestDefinitionsIncludeDynamicAgentRoutingMetadata(t *testing.T) { } } +func TestDefinitionsNeedsYouInboxLabelIsInbox(t *testing.T) { + def, ok := DefinitionByKey("features.needsYouInbox") + if !ok { + t.Fatal("features.needsYouInbox definition missing") + } + if def.Label != "Inbox" { + t.Fatalf("Label = %q, want %q", def.Label, "Inbox") + } + if def.EnvVar != "KANDEV_FEATURES_NEEDS_YOU_INBOX" { + t.Fatalf("EnvVar = %q, want KANDEV_FEATURES_NEEDS_YOU_INBOX", def.EnvVar) + } + if def.Stability != StabilityExperimental { + t.Fatalf("Stability = %q, want %q", def.Stability, StabilityExperimental) + } + if def.RiskLevel != RiskLow { + t.Fatalf("RiskLevel = %q, want %q", def.RiskLevel, RiskLow) + } + if def.RiskDescription == "" { + t.Fatal("RiskDescription empty") + } + if !def.RestartRequired { + t.Fatal("RestartRequired = false, want true") + } + if !def.Mutable { + t.Fatal("Mutable = false, want true") + } +} + func TestDefinitionsIncludeCanvasMetadata(t *testing.T) { def, ok := DefinitionByKey("features.canvases") if !ok { diff --git a/docs/plans/needs-you-inbox/plan.md b/docs/plans/needs-you-inbox/plan.md index 987991a8a7..4a7bf53103 100644 --- a/docs/plans/needs-you-inbox/plan.md +++ b/docs/plans/needs-you-inbox/plan.md @@ -6,6 +6,7 @@ requirements: system_design: - ../../specs/ui/system-design/needs-you-inbox-01.md - ../../specs/ui/system-design/needs-you-inbox-02.md + - ../../specs/ui/system-design/needs-you-inbox-03.md legacy_specs: [] --- @@ -18,7 +19,8 @@ bundle genuinely waiting on a human and lets the operator answer it without leaving the page, per [requirements](../../specs/ui/requirements/needs-you-inbox.md) and [system design](../../specs/ui/system-design/needs-you-inbox-01.md) (part 2: -[control flow, failure, persistence, security](../../specs/ui/system-design/needs-you-inbox-02.md)). +[control flow, failure, persistence, security](../../specs/ui/system-design/needs-you-inbox-02.md); +part 3: [visual and copy contract](../../specs/ui/system-design/needs-you-inbox-03.md)). This feature was built through Kandev's own spec-driven-development workflow (5 spec-review rounds, 4 build rounds, security/test/code review, an @@ -50,8 +52,9 @@ document's own "Out of scope" section for the full list. ## Work orders - [x] [Task 01: Needs-you Inbox delivery](task-01-needs-you-inbox-delivery.md) +- [x] [Task 02: Inbox feature-toggle terminology](task-02-inbox-label-alignment.md) -Single work order; no dependents. +Task 02 depends on Task 01 and records the follow-up display-name alignment. ## Verification results @@ -63,3 +66,11 @@ worktree); desktop and mobile E2E specs for the answer-in-place flow pass; scripts/lint-spec-files.py --all` passes. PR: https://github.com/kdlbs/kandev/pull/3641 + +## Task 02 results + +The follow-up label alignment keeps the stable feature identity, configuration, +route, and runtime behavior unchanged. The runtime flag and public configuration +reference now use `Inbox`, matching the destination copy contract in Part 3. + +Follow-up PR: https://github.com/kdlbs/kandev/pull/3673 diff --git a/docs/plans/needs-you-inbox/task-02-inbox-label-alignment.md b/docs/plans/needs-you-inbox/task-02-inbox-label-alignment.md new file mode 100644 index 0000000000..6bdc115fd9 --- /dev/null +++ b/docs/plans/needs-you-inbox/task-02-inbox-label-alignment.md @@ -0,0 +1,56 @@ +--- +id: "02-inbox-label-alignment" +title: "Align Inbox feature-toggle terminology" +status: done +wave: 2 +depends_on: + - "01-needs-you-inbox-delivery" +plan: "plan.md" +requirements: + - REQ-UI-NEEDS-YOU-INBOX-001 +acceptance_criteria: + - AC-UI-NEEDS-YOU-INBOX-001.1 +system_design: + - ../../specs/ui/system-design/needs-you-inbox-03.md +--- + +# Task 02: Align Inbox feature-toggle terminology + +## Summary + +Align the runtime feature-toggle label and public configuration reference with +the Inbox destination name. Keep the runtime flag identity and behavior unchanged. + +## Acceptance + +- The Feature Toggles page shows `Inbox` for `features.needsYouInbox`. +- The label matches the Inbox destination copy contract outside the Office-mode + collision case described by D4. +- The key, environment variable, route, defaults, persistence, restart behavior, + and effective feature value remain unchanged. +- The public configuration reference uses `Inbox`. +- The registry test pins the display label and its existing metadata. + +## Verification + +- `go test -tags fts5 ./internal/runtimeflags/...` passed. +- `node --test .github/scripts/pr-docs.test.cjs` passed: 52 tests. +- The local documentation coverage evaluator reported `status: covered` with no + errors for the changed runtime file and this delivery package. +- `node --test scripts/validate-public-docs.test.mjs` passed: 62 tests. +- `node scripts/validate-public-docs.mjs` passed: 46 published docs pages. +- `git diff --check` passed. + +## Files + +- `apps/backend/internal/runtimeflags/registry.go` +- `apps/backend/internal/runtimeflags/registry_test.go` +- `docs/public/configuration.md` + +## Results + +The registry label is `Inbox`. The metadata test protects the label and stable +runtime-flag metadata. The public configuration reference matches the label. +No runtime behavior or route identity changed. + +Follow-up PR: https://github.com/kdlbs/kandev/pull/3673 diff --git a/docs/public/configuration.md b/docs/public/configuration.md index 9f6c8cb450..24c9947026 100644 --- a/docs/public/configuration.md +++ b/docs/public/configuration.md @@ -508,7 +508,7 @@ Copying this entire file is unnecessary and can freeze old defaults in a deploym | `features.multiTenancy` | `KANDEV_FEATURES_MULTI_TENANCY` | off | Experimental organizations above authenticated users. Requires `features.auth`; startup is refused otherwise. | | `features.dynamicAgentRouting` | `KANDEV_FEATURES_DYNAMIC_AGENT_ROUTING` | off | Experimental dynamic profiles with ordered provider-error fallback. | | `features.canvases` | `KANDEV_FEATURES_CANVASES` | off | Experimental agent-authored isolated web-app canvases for tasks and workspaces. High risk. | -| `features.needsYouInbox` | `KANDEV_FEATURES_NEEDS_YOU_INBOX` | off | Needs-you Inbox for clarification questions across tasks in the active workspace. | +| `features.needsYouInbox` | `KANDEV_FEATURES_NEEDS_YOU_INBOX` | off | Inbox for clarification questions across tasks in the active workspace. | | `features.officeSessionIdentity` | `KANDEV_FEATURES_OFFICE_SESSION_IDENTITY` | on | Office participant sessions: each participant agent gets its own session per task. The live `(task_id, agent_profile_id)` pair is guarded in-transaction, not by a table-level index. Pre-existing duplicate rows are retained and resolved by selection. Two Kandev processes must not write the same SQLite file. | | `features.agentSurvival` | `KANDEV_FEATURES_AGENT_SURVIVAL` | off | Experimental. Lets the `agentctl` control server and its running agents outlive a backend restart or upgrade, for the `local_pc` and worktree executors only. The restarted backend takes the surviving server over and reconnects to the sessions still running on it. **Unavailable on Windows**, where surviving the backend means giving up the Job Object that guarantees agent processes are cleaned up. | | `debug.devMode` | `KANDEV_DEBUG_DEV_MODE` | off | High-risk diagnostic endpoints and ACP frame logging. |