Q163: the goal progress view is called Progress, not Timeline

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZacharyZhang-NYandClaude Opus 5.5 committed 2026-10-09 03:08:57 -04:00
1 parent c78045d523
commit 9826b163a9
4 files changed
+11 -12

No files matched your search

+1 -1
View File
@@ -571,7 +571,7 @@ export const zh: Record<string, string> = {
"Tests": "测试",
"Theme": "主题",
"Thinking": "思考中",
"Timeline": "时间线",
"Progress": "进度",
"Title": "标题",
"Today": "今天",
"Token usage": "Token 用量",
+5 -5
View File
@@ -19,13 +19,13 @@ import { ProjectDialog } from "./work/ProjectDialog";
import { TaskDetailDialog } from "./work/TaskDetailDialog";
import { ProjectOverview } from "./work/ProjectOverview";
import { ListView } from "./work/ListView";
import { TimelineView } from "./work/TimelineView";
import { ProgressView } from "./work/ProgressView";
import { isBusinessTask, latestTaskRun, nextStatus, prettyRunState, providerFor, runBlocker, runTone } from "./work/task-helpers";
import type { PageProps } from "./types";
import { activeOrgId, type Focus } from "./types";
import { t } from "../i18n/i18n";
type View = "board" | "list" | "timeline";
type View = "board" | "list" | "progress";
const COLUMNS: ReadonlyArray<{ id: TaskStatus; label: string; tone: string }> = [
{ id: TASK_STATUS.BACKLOG, label: t("Backlog"), tone: "var(--text-4)" },
@@ -37,7 +37,7 @@ const COLUMNS: ReadonlyArray<{ id: TaskStatus; label: string; tone: string }> =
const VIEW_OPTIONS: ReadonlyArray<{ id: View; label: string }> = [
{ id: "board", label: t("Board") },
{ id: "list", label: t("List") },
{ id: "timeline", label: t("Timeline") },
{ id: "progress", label: t("Progress") },
];
export function WorkPage({ snapshot, actions, navigate, focus }: PageProps) {
@@ -153,9 +153,9 @@ export function WorkPage({ snapshot, actions, navigate, focus }: PageProps) {
/>
</div>
)}
{view === "timeline" && (
{view === "progress" && (
<div className="work-scroll">
<TimelineView tasks={tasks} goals={goals} projects={projects} />
<ProgressView tasks={tasks} goals={goals} projects={projects} />
</div>
)}
</div>
@@ -8,12 +8,8 @@ const SEGMENTS: ReadonlyArray<{ id: TaskStatus; label: string; tone: string }> =
{ id: TASK_STATUS.BACKLOG, label: t("Backlog"), tone: "var(--panel-3)" },
];
/**
* Execution timeline by goal: each goal carries a segmented bar of its tasks
* by status (done → review → in progress → backlog), then one row per
* project with the same bar at project scope.
*/
export function TimelineView({ tasks, goals, projects }: { tasks: TaskRecord[]; goals: GoalRecord[]; projects: ProjectRecord[] }) {
/** How far work is per goal and project, as bars of task status; it shows progress, not dates. */
export function ProgressView({ tasks, goals, projects }: { tasks: TaskRecord[]; goals: GoalRecord[]; projects: ProjectRecord[] }) {
const unlinked = tasks.filter((task) => !task.goalId);
return (
<div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
+3
View File
@@ -81,6 +81,9 @@ test("the pinned CEO conversation is the Messages front door", async () => {
// From a task, its goal, run and back are one click each.
await page.getByRole("button", { name: "Work" }).click();
// The goal view says what it shows: progress, not a timeline without dates.
await expect(page.getByText("Progress", { exact: true })).toBeVisible();
await expect(page.getByText("Timeline", { exact: true })).toHaveCount(0);
// The CEO's reply to the founder is a chat vehicle, not work: it stays off the board.
await expect(page.getByRole("button", { name: /Reply to Yang/ })).toHaveCount(0);
await page.getByRole("button", { name: /Operationalize goal: Ship the FlowPilot MVP\./ }).first().click();