Adopt praxis.result.v0_1, the last of the three (2026-08-08.4) - #21
Merged
Conversation
Doc 24's reconciliation finishes here. Scale Trail took the shape first because it was closest to it, Mallet Map followed, and this app was always going to be the largest: it had no result object at all. The card and the copyable summary were assembled inline from a session, so there was nothing to migrate — only something to build. That also made it the cleanest of the three, because nothing had to be preserved. The card now renders FROM the envelope rather than beside it. Before, the human record and any machine record could have described different rounds with nothing to notice; `conditions.stated` is the exact sentence the card prints, carried on the evidence. Two fields are null and say why, rather than being synthesized. `skillReferences` is null because this app has no reconciled Praxis skill vocabulary — candidate ids exist in the Sequence 2 draft, but the vocabulary is an owner decision and an invented id is indistinguishable, to a consumer, from a real one. The field is nullable across the family for exactly this case. `activity.contentVersion` is null because questions come from the conditions plus a seed, which already reproduce the round; a made-up string would read as a content revision that never happened. `attemptReference` is deliberately NOT the verification code, though the two are built the same way. The code is teacher-facing, has its own published format and its own stated limits — "a deterrent, not proof" — and whether it generalizes across the three apps is still an open decision. Making them identical here would have answered it by accident. It is also not built from the seed, which changes for a retake by design. `errorSummary` is keyed by catalog cell id, the vocabulary links are written against, so a report reads in the terms the assignment was set in. One honest caveat, stated in the manifest because the data cannot state it: in measure scope a question carries four cells and is answered as a whole, so a miss is attributed to every cell in that measure. That is the finest attribution the format allows, not a claim that all four were misread. Integration level 1 → 2. The manifest itself named the condition — "Level 1 until the universal result envelope is adopted" — and this adopts it, so the level moves with a criterion written down in advance rather than one invented now. A test asserted the old value and has been updated with that reasoning. What the level does NOT assert is transmission: nothing leaves the device here or in either sibling, and Scale Trail has claimed Level 2 on the same terms throughout. `seq`/`step` are read for the first time, outside the assignment parser so a marker cannot become a setting — the shop site's contract check fails if any app declares them. A test asserts the parsed assignment and its locked list are identical with the markers and without them. They are read BEFORE the assignment is validated, because a link that names a step and then fails validation is still evidence of which step was attempted. Verified against the built app served locally: all nine Counting Rhythms links still run their authored round, and a pinned round played through to the card renders it with the assignment name, the score, and the goal reported rather than enforced — no page errors. 58 tests, up from 45. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011raCSRMD2S7VEhWeF56oxz
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
count-it | 998d328 | Aug 08 2026, 03:40 AM |
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.
Doc 24's reconciliation finishes here. Scale Trail took the shape first (#39), Mallet Map followed (#19), and this one was always going to be the largest: it had no result object at all. The card and the copyable summary were assembled inline from a session, so there was nothing to migrate — only something to build. That also made it the cleanest, because nothing had to be preserved.
The card now renders from the envelope rather than beside it. Before, the human record and any machine record could have described different rounds with nothing to notice.
conditions.statedis the exact sentence the card prints, carried on the evidence.Two nulls that say why
skillReferencesactivity.contentVersionattemptReferenceis deliberately not the verification codeThey're built the same way, so collapsing them would have been tempting. But the code is teacher-facing, has its own published format and its own stated limits — "a deterrent, not proof" — and whether it generalizes across the three apps is still an open decision (D4). Making them identical here would have answered it by accident. It's also not built from the seed, which changes for a retake by design.
errorSummary, with a caveat the data can't stateKeyed by catalog cell id — the vocabulary links are written against — so a report reads in the terms the assignment was set in. In measure scope a question carries four cells and is answered as a whole, so a miss is attributed to every cell in that measure. That's the finest attribution the format allows, not a claim that all four were misread. Said out loud in
resultSchemaStatus.Integration level 1 → 2
The manifest named its own condition: "Level 1 until the universal result envelope is adopted." This adopts it, so the level moves with a criterion written down in advance rather than one invented now. A test asserted the old value and has been updated with that reasoning.
What Level 2 does not assert is transmission. Nothing leaves the device here or in either sibling, and Scale Trail has claimed Level 2 on the same terms throughout. This is worth a sanity check from you, since it's a published capability claim.
seq/stepRead for the first time, outside the assignment parser so a marker cannot become a setting — the shop site's contract check fails if any app declares them. A test asserts the parsed assignment and its locked list are identical with the markers and without them. They're read before the assignment is validated, because a link that names a step and then fails validation is still evidence of which step was attempted.
Verification
Against the built app served locally:
58 tests, up from 45. README build gate and the served manifest both updated.
Generated by Claude Code