diff --git a/.story_kit/problems.md b/.story_kit/problems.md
index 6293b5b..a122129 100644
--- a/.story_kit/problems.md
+++ b/.story_kit/problems.md
@@ -2,9 +2,9 @@
Recurring issues observed during pipeline operation. Review periodically and create stories for systemic problems.
-## 2026-03-18: Stories graduating to "done" with empty merges
+## 2026-03-18: Stories graduating to "done" with empty merges (7 of 10)
-Pipeline allows stories to move through coding → QA → merge → done without any actual code changes landing on master. The squash-merge produces an empty diff but the pipeline still marks the story as done. Confirmed affected: 247, 273, 280. Stories 274, 278, 279 appeared empty via merge commits but code was actually committed directly to master by agents (see next problem). Root cause: no check that the merge commit contains a non-empty diff before advancing to done. Frequency: 3+ confirmed cases out of 10 done stories.
+Pipeline allows stories to move through coding → QA → merge → done without any actual code changes landing on master. The squash-merge produces an empty diff but the pipeline still marks the story as done. Affected stories: 247, 273, 274, 278, 279, 280, 92. Only 266, 271, 277, and 281 actually shipped code. Root cause: no check that the merge commit contains a non-empty diff. Filed bug 283 for the manual_qa gate issue specifically, but the empty-merge-to-done problem is broader and needs its own fix.
## 2026-03-18: Agent committed directly to master instead of worktree
diff --git a/frontend/index.html b/frontend/index.html
index db1fefc..a1d2e54 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -4,7 +4,7 @@
-
Story Kit
+ Storkit
diff --git a/frontend/src/components/Chat.tsx b/frontend/src/components/Chat.tsx
index e30125b..a0709b0 100644
--- a/frontend/src/components/Chat.tsx
+++ b/frontend/src/components/Chat.tsx
@@ -819,7 +819,7 @@ export function Chat({ projectPath, onCloseProject }: ChatProps) {
fontSize: "1.1rem",
}}
>
- Welcome to Story Kit
+ Welcome to Storkit
{
expect(screen.getByText("Built: 2026-01-01 00:00")).toBeInTheDocument();
});
- it("displays Story Kit branding in the header", () => {
+ it("displays Storkit branding in the header", () => {
render();
- expect(screen.getByText("Story Kit")).toBeInTheDocument();
+ expect(screen.getByText("Storkit")).toBeInTheDocument();
});
it("labels the claude-pty optgroup as 'Claude Code'", () => {
diff --git a/frontend/src/components/ChatHeader.tsx b/frontend/src/components/ChatHeader.tsx
index c6ef6a1..0833e69 100644
--- a/frontend/src/components/ChatHeader.tsx
+++ b/frontend/src/components/ChatHeader.tsx
@@ -82,7 +82,7 @@ export function ChatHeader({
letterSpacing: "0.02em",
}}
>
- Story Kit
+ Storkit
{
it("renders the title and description", () => {
render();
- expect(screen.getByText("Story Kit")).toBeInTheDocument();
+ expect(screen.getByText("Storkit")).toBeInTheDocument();
expect(
screen.getByText("Paste or complete a project path to start."),
).toBeInTheDocument();
diff --git a/frontend/src/components/selection/SelectionScreen.tsx b/frontend/src/components/selection/SelectionScreen.tsx
index eb16c6c..ecc6fdd 100644
--- a/frontend/src/components/selection/SelectionScreen.tsx
+++ b/frontend/src/components/selection/SelectionScreen.tsx
@@ -54,7 +54,7 @@ export function SelectionScreen({
className="selection-screen"
style={{ padding: "2rem", maxWidth: "800px", margin: "0 auto" }}
>
-