Add change-timeline data layer (git-derived dates) - #91
Merged
Conversation
First of three changes building the "change timeline" feature: for a given change (active or archived), best-effort created/archived dates and a per-task completion date derived from git blame on tasks.md, plus proposal/design/spec content in one read. Never errors on missing git history -- undeterminable dates are null, matching the accepted "2-3 milestone" outcome for squash-merged history (verified against this session's own real archived changes: all of add-cli-help-flag's tasks correctly share one date, matching its squash-merge commit). No UI in this change -- getChangeTimeline/getChangeTimelines in @openspec-ui/core, matching REST routes in the standalone server, and a webui client, following the existing change-editor read/REST pattern rather than the Command/Event streaming protocol (a poor fit for an in-process computation with nothing to shell out to). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
CI never triggered for this branch after the initial push (0 runs recorded for either the push or pull_request event, despite the Quality workflow being active and working for every other PR today) -- looks like a one-off webhook delivery miss, not a workflow config issue. No code changes. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This was referenced Aug 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
packages/core/src/change-timeline.ts:getChangeTimeline/getChangeTimelines— best-effort created date, archived date (parsed from theYYYY-MM-DD-<name>archive folder name, no git needed), and a per-task completion date viagit blame --line-porcelainontasks.md.nulland found blame correctly returning the creation commit instead).POST /api/change-timeline//api/change-timelines) in the standalone server and a webui client, following the existing/api/change-editor/readplain-JSON pattern rather than theCommand/Eventstreaming protocol (a poor fit for an in-process computation with nothing to shell out to).@openspec-ui/core0.26.0 -> 0.27.0,@openspec-ui/server1.8.0 -> 1.9.0,@openspec-ui/webui1.10.0 -> 1.11.0 (all minor).Real-data verification
Manually smoke-tested against this session's own repository:
2026-08-26-add-cli-help-flag's 8 tasks all correctly share one date (2026-08-26T11:23:59.000Z), matching that PR's squash-merge commit exactly — the accepted "2-3 milestone" outcome for squash-merged history.Test plan
change-timeline.test.ts: real temp git repo fixture (not mocked) — separate-commit dates, one-commit-shared dates, unchecked-task-has-no-date, blame surviving an active-to-archive directory renameserver.test.tschange-timeline-client.test.tsin webuinpm run typecheck,npm run lint(includinglint:english),npm run testworkspace-wideopenspec change validate --strict add-change-timeline-data-layer🤖 Generated with Claude Code