Add the assignment link, so a round can be pinned and posted - #18
Merged
Conversation
Executes the Level 0 build ticket's assignment half, plus the cell-pool
gap Sequence 2 named. A teacher pins a round in a URL and posts it;
every student who opens it gets the same questions under the same
conditions, and the app says so on the way in and on the way out.
The contract shape is deliberately Mallet Map's, param for param where
the concepts line up — `cells` is that app's `pool`, `guide` is its
`labels` — so the family's two assignment grammars are one thing a
teacher learns once. Its rules come along too:
* REJECT, never repair. A cell pool with a cell missing teaches a
different step: "rest entry" without rest-then-& is not rest entry.
An unknown id, a pool under two, an impossible pass mark, a count
outside 1-20, or a counting system this app does not teach each
invalidate the whole link with a message written for a student on a
phone — and the app keeps working normally underneath it.
* The support policy belongs to the LINK. The subdivision guide is
Count It's bar labels: a gate counts the assignment's policy, never
the learner's own toggle, so a pinned guide is locked and says why.
* The CONDITIONS are the record. The result card reports the
vocabulary, scope, guide, count and the teacher's pass mark beside
the score, because a score without them says nothing about what was
practised.
Why a cell pool exists at all: levels are cumulative, so "the two
rest-entry cells and nothing else" is not a level and never can be.
That is the whole of Sequence 2's step 2.
The verification code is the ticket's deterrent, not proof, and the
card says as much: a short non-cryptographic hash over the facts the
card claims, so a score cannot be retyped and a code cannot be moved to
a different result. Signed verification stays Phase 2. The optional
identifier is session-only and never persisted, because the app's
promise is that it stores nothing about a student.
Seed stability holds: a level round is seeded from its level and a
pooled round from its vocabulary, so this parameter cannot move a
single round that existed before it.
Tests 19 -> 39. Rendered QA against the real app on the actual
Sequence 2 step-2 link: locked controls, guide applied, 12 questions
drawn only from the two assigned rhythms with both covered, an
"Assignment complete" card carrying the goal, conditions and code, a
copy-summary that round-trips them, identical questions across fresh
browsers, an invalid link refused by name, and an unadorned visit
unchanged.
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 | 89fe084 | Aug 08 2026, 12:43 AM |
The release gate caught what the app change alone would have let ship: BUILD_ID moved to 2026-08-08.1 in the app, but README still declared 2026-08-03.2, so the repo would have claimed one build while serving another — exactly the drift the check exists to prevent. The README now documents the link contract too: every parameter, what it pins, and the reject-never-repair rule, so a teacher writing a link by hand has one place to read rather than a source file. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011raCSRMD2S7VEhWeF56oxz
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.
Executes the assignment half of Build Ticket — Count It Result Card & Assignment Link (Level 0), plus the cell-pool selection gap Sequence 2 named as blocking. This is the dependency holding the Counting Rhythms teaching sequence.
The link contract
alevel/scopecellsguideon/off)n/passseedsysstandardonly today, anything else is refusedShape is deliberately Mallet Map's, param for param where the concepts line up (
cells↔pool,guide↔labels), per the ticket's "share the contract shape" note — so the family's two grammars are one thing a teacher learns once.Why
cellsexists: levels are cumulative, so "the two rest-entry cells and nothing else" is not a level and never can be. That is exactly Sequence 2's step 2.The family rules, carried over
Result card
Assignment name, score/accuracy, the teacher's goal (reported, never enforced — the app states what happened and the human decides what it means), the conditions line, an optional session-only identifier, Copy summary for submission, and the verification code
BRS-CI-{yyMMdd}-{percent}-{4}— a deterrent, not proof, and the card says so. Signed verification stays Phase 2.Seed stability
A level round is seeded from its level, a pooled round from its vocabulary, so this parameter cannot move a single round that existed before it — asserted in the tests.
Verification
Tests 19 → 39; lint and build clean. Rendered QA against the running app on the real step-2 link: locked controls, guide applied, 12 questions drawn only from the two assigned rhythms with both covered, "Assignment complete" card with goal + conditions + code, copy-summary round-trip, identical questions across fresh browser contexts, invalid link refused by name with no assignment applied, and an unadorned visit completely unchanged (practice mode, nothing locked).
Not in this PR
PNG/PDF download of the card. The ticket lists it in scope but also flags "PNG only, or PNG + PDF?" as confirm before build, and it needs a new dependency (
html-to-image) plus VexFlow SVG rasterization checks. Copy summary covers the submit-to-Canvas path in the meantime. Say the word and I'll add it.Once this merges and deploys, I can author the nine Sequence 2 links and flip
/sequences/counting-rhythms/live.🤖 Generated with Claude Code
https://claude.ai/code/session_011raCSRMD2S7VEhWeF56oxz
Generated by Claude Code