Skip to content

Add the assignment link, so a round can be pinned and posted - #18

Merged
backwerdrimshot merged 2 commits into
mainfrom
claude/assignment-wrapper
Aug 8, 2026
Merged

Add the assignment link, so a round can be pinned and posted#18
backwerdrimshot merged 2 commits into
mainfrom
claude/assignment-wrapper

Conversation

@backwerdrimshot

Copy link
Copy Markdown
Owner

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

?a=Step 2: Where's the &?&scope=beat&cells=eighth-rest,rest-eighth&guide=on&n=12&pass=10&seed=cr2-wheres-the-and
param meaning
a assignment name — display text, sanitized and truncated
level / scope pinned and locked
cells explicit cell vocabulary by catalog id — the reason this exists
guide subdivision-guide policy, locked (on/off)
n / pass question count (1–20) and the teacher's goal
seed same questions for every student
sys counting system; standard only today, anything else is refused

Shape is deliberately Mallet Map's, param for param where the concepts line up (cellspool, guidelabels), per the ticket's "share the contract shape" note — so the family's two grammars are one thing a teacher learns once.

Why cells exists: 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

  • Reject, never repair. A pool with a cell missing teaches a different step. Unknown id, pool under two, impossible pass mark, count outside 1–20, or an unsupported counting system each invalidate the whole link with a message written for a student on a phone — and the app keeps working underneath it.
  • The support policy belongs to the link. The guide is Count It's bar labels: a gate counts the assignment's policy, never the learner's toggle. Pinned → locked, and the control says why.
  • The conditions are the record. The card reports vocabulary, scope, guide, count and the teacher's goal beside the score.
  • No timers anywhere. Difficulty is vocabulary, scope, and guide.

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

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

cloudflare-workers-and-pages Bot commented Aug 8, 2026

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 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
@backwerdrimshot
backwerdrimshot merged commit 12e3576 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