feat: declare the journey map and keep results observable - #23
Merged
Merged
Conversation
A round can already order its findings with journeyRef/step/role, and agents do: a replay against apob-react-web-app returned 38 findings, 82% of them ordered into 8 journeys. What no field carries is the journey's own name, goal and actor, so Doable titles each flow with one raw finding sentence and takes its goal from another. Add `journeys` to the answer candidate. A declaration names journeys the findings already ordered; it cannot introduce one. `normalizeJourneys` rejects a journeyRef with no ordered findings, rejects duplicates, and puts name, goal, actor and alternatePaths through the same provenance check as any other prose crossing the boundary. `journeyMapSkipReason` declines when a map would add nothing — an empty map with a reason beats a guessed one. Two fixes alongside it: - The observable-result rule did not say observable to whom. That same replay produced verifications a tester cannot check, such as "the vote is submitted through the Live scene-vote request" — the mechanism, not the result. State that where a behavior has a user-visible surface, the result is what that surface shows, and make the pre-submit review restate such findings. - The watch checklist expected `stop` for `consumed`. A pre-create Round now hands its code to the follow-up Rounds of the TRD it created, so the watch continues on the same DQ and the server answers `wait`. Only `cancelled`, or a Round bound to no session, stops. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
alphali
force-pushed
the
feat/code-context-journey-map
branch
from
September 16, 2026 12:12
7058eb8 to
555379e
Compare
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.
Why
A round can already order its findings with
journeyRef/step/role, documented here since 2026-08-12, and agents do use it. A replay against a real workspace (DQ-OLCRHL) returned 38 findings, 82% of them ordered into 8 journeys, withentry/action/outcome/failureall in play.What no field carries is the journey's own name, goal and actor. Ordering says which findings belong together; nothing says what the journey is. Doable therefore titles each flow with one raw finding sentence and takes its goal from another.
What changes
journeyson the answer candidate. One entry perjourneyRefyou ordered:name,goal,actor,alternatePaths.A declaration names journeys the findings already ordered — it cannot introduce one.
normalizeJourneysrejects ajourneyRefwith no ordered findings, rejects duplicates, and puts every field throughassertNoLocalProvenance, because a journey's wording crosses the boundary like any other prose.journeyMapSkipReasondeclines when a map would add nothing. An empty map with a reason is a better answer than a guessed one.Both are optional. A submission that only orders its findings validates exactly as it does today.
Two fixes alongside
The observable-result rule did not say observable to whom. The same replay produced verifications a tester cannot check — "the selected vote is submitted for the scene through the Live scene-vote request". That is the mechanism, not the result; the vote total, the credit balance and the disabled free tier were all established by the same findings and all visible on screen. 6 of that TRD's 37 verifications had this shape. The contract now says that where a behavior has a user-visible surface, the observable result is what that surface shows, and the pre-submit review restates such findings rather than only deleting ones that lack a result.
The watch checklist expected
stopforconsumed. A pre-create Round now hands its code to the follow-up Rounds of the TRD it just created, so the watch continues on the same DQ and the server answerswait. Onlycancelled, or a Round bound to no session, stops. The Skill already followsnext_action, so this is the checklist catching up to the server — item 10 inTESTING.md.Testing
npm test— 2/2, including four new assertions: a valid declaration round-trips, ajourneyRefwith no ordered findings is rejected, a duplicate declaration is rejected, and local provenance in a journeygoalis rejected.node scripts/verify-release.mjs—doable-code-context@0.2.6, 3 Skills, Codex / Claude Code / Cursor.Not covered: whether an agent actually produces
journeysonce this ships. The released plugin has no notion of the field, which is why the replay'sjourney_mapcame back NULL. That needs one round through an installed build.Ships with
getdoable/trd—journey_mapon the round response,journeysonRoundSubmission, consumption increate_source_extraction, and thecode_context_round_revisions.journey_mapcolumn.🤖 Generated with Claude Code