story-kit: merge 294_story_rename_app_title_from_story_kit_to_storkit

This commit is contained in:
Dave
2026-03-19 09:44:34 +00:00
parent dc9df6d497
commit 63f46751ac
9 changed files with 12 additions and 12 deletions

View File

@@ -2,9 +2,9 @@
Recurring issues observed during pipeline operation. Review periodically and create stories for systemic problems. 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 ## 2026-03-18: Agent committed directly to master instead of worktree

View File

@@ -4,7 +4,7 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Story Kit</title> <title>Storkit</title>
</head> </head>
<body> <body>

View File

@@ -819,7 +819,7 @@ export function Chat({ projectPath, onCloseProject }: ChatProps) {
fontSize: "1.1rem", fontSize: "1.1rem",
}} }}
> >
Welcome to Story Kit Welcome to Storkit
</h3> </h3>
<p <p
style={{ style={{

View File

@@ -136,9 +136,9 @@ describe("ChatHeader", () => {
expect(screen.getByText("Built: 2026-01-01 00:00")).toBeInTheDocument(); 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(<ChatHeader {...makeProps()} />); render(<ChatHeader {...makeProps()} />);
expect(screen.getByText("Story Kit")).toBeInTheDocument(); expect(screen.getByText("Storkit")).toBeInTheDocument();
}); });
it("labels the claude-pty optgroup as 'Claude Code'", () => { it("labels the claude-pty optgroup as 'Claude Code'", () => {

View File

@@ -82,7 +82,7 @@ export function ChatHeader({
letterSpacing: "0.02em", letterSpacing: "0.02em",
}} }}
> >
Story Kit Storkit
</span> </span>
<div <div
title={projectPath} title={projectPath}

View File

@@ -33,7 +33,7 @@ function makeProps(
describe("SelectionScreen", () => { describe("SelectionScreen", () => {
it("renders the title and description", () => { it("renders the title and description", () => {
render(<SelectionScreen {...makeProps()} />); render(<SelectionScreen {...makeProps()} />);
expect(screen.getByText("Story Kit")).toBeInTheDocument(); expect(screen.getByText("Storkit")).toBeInTheDocument();
expect( expect(
screen.getByText("Paste or complete a project path to start."), screen.getByText("Paste or complete a project path to start."),
).toBeInTheDocument(); ).toBeInTheDocument();

View File

@@ -54,7 +54,7 @@ export function SelectionScreen({
className="selection-screen" className="selection-screen"
style={{ padding: "2rem", maxWidth: "800px", margin: "0 auto" }} style={{ padding: "2rem", maxWidth: "800px", margin: "0 auto" }}
> >
<h1>Story Kit</h1> <h1>Storkit</h1>
<p>Paste or complete a project path to start.</p> <p>Paste or complete a project path to start.</p>
{knownProjects.length > 0 && ( {knownProjects.length > 0 && (

View File

@@ -102,7 +102,7 @@ pub fn build_openapi_service(ctx: Arc<AppContext>) -> (ApiService, ApiService) {
); );
let api_service = let api_service =
OpenApiService::new(api, "Story Kit API", "1.0").server("http://127.0.0.1:3001/api"); OpenApiService::new(api, "Storkit API", "1.0").server("http://127.0.0.1:3001/api");
let docs_api = ( let docs_api = (
ProjectApi { ctx: ctx.clone() }, ProjectApi { ctx: ctx.clone() },
@@ -116,7 +116,7 @@ pub fn build_openapi_service(ctx: Arc<AppContext>) -> (ApiService, ApiService) {
); );
let docs_service = let docs_service =
OpenApiService::new(docs_api, "Story Kit API", "1.0").server("http://127.0.0.1:3001/api"); OpenApiService::new(docs_api, "Storkit API", "1.0").server("http://127.0.0.1:3001/api");
(api_service, docs_service) (api_service, docs_service)
} }

View File

@@ -222,7 +222,7 @@ pub async fn run_bot(
let mut login_builder = client let mut login_builder = client
.matrix_auth() .matrix_auth()
.login_username(&config.username, &config.password) .login_username(&config.username, &config.password)
.initial_device_display_name("Story Kit Bot"); .initial_device_display_name("Storkit Bot");
if let Some(ref device_id) = saved_device_id { if let Some(ref device_id) = saved_device_id {
login_builder = login_builder.device_id(device_id); login_builder = login_builder.device_id(device_id);