Skip to content

Adopt praxis.result.v0_1, the last of the three (2026-08-08.4) - #21

Merged
backwerdrimshot merged 1 commit into
mainfrom
claude/praxis-result-v0-1
Aug 8, 2026
Merged

Adopt praxis.result.v0_1, the last of the three (2026-08-08.4)#21
backwerdrimshot merged 1 commit into
mainfrom
claude/praxis-result-v0-1

Conversation

@backwerdrimshot

Copy link
Copy Markdown
Owner

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.stated is the exact sentence the card prints, carried on the evidence.

Two nulls that say why

field why null
skillReferences 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. This is doc 24's D1 — the field is nullable across the family for exactly this case.
activity.contentVersion Questions come from the conditions plus a seed, which already reproduce the round. A synthesized string would read as a content revision that never happened.

attemptReference is deliberately not the verification code

They'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 state

Keyed 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.

Related: mallet-map's manifest is now self-contradictory — it says resultSchemaVersion: praxis.result.v0_1 but still integrationLevel: 1 with a rationale claiming the result "is not yet emitted in the universal format." I missed that in #19. Small follow-up PR to come.

seq/step

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'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:

  • All 9 Counting Rhythms links still run their authored round (rendered audit).
  • A pinned round played through to the card renders it with the assignment name, the score, and GOAL 2/3 reported rather than enforced — no page errors.

58 tests, up from 45. README build gate and the served manifest both updated.


Generated by Claude Code

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
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
count-it 998d328 Aug 08 2026, 03:40 AM

@backwerdrimshot
backwerdrimshot merged commit 910e782 into main Aug 8, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants