Skip to content

docs: the a2learn format draft - #74

Draft
adamstankiewicz wants to merge 4 commits into
mainfrom
docs/a2learn-spec
Draft

docs: the a2learn format draft#74
adamstankiewicz wants to merge 4 commits into
mainfrom
docs/a2learn-spec

Conversation

@adamstankiewicz

@adamstankiewicz adamstankiewicz commented Aug 30, 2026

Copy link
Copy Markdown
Owner

What & why

The a2learn document format draft under docs/a2learn/: the surface (drafted as an A2UI profile) plus the manifest (verified standards, pedagogy, accessibility and language declarations, provenance), with conformance classes and a changelog. Deliberately a format, not a specification — it earns the second word when a second implementation exists.

Latest push — audience replaces gradeBand. The manifest's audience field was a {min, max} integer range, which can only describe K-12 grade levels: an undergraduate year or a new-hire cohort has no honest value to put in it. It is now a list of scheme-scoped label sets — [{ "scheme": "k12-us", "values": ["4", "5", "6"] }] — carrying the naming authority with the value the way standards[] already carries source alongside code, so "4" is unambiguous instead of meaning grade 4 here and year 4 elsewhere. Only k12-us is registered: higher-ed and professional schemes are structurally supported but deliberately unnamed, because the format documents what a producer emits today and none emits them yet. pedagogy.purposes is stated as an open vocabulary in the same pass, so the enum that would need a new beat for workplace practice isn't frozen shut.

Type of change

  • Docs

Breaking or contract changes

One breaking change within the draft, recorded in CHANGELOG.md with the migration an implementer needs: manifest.gradeBandmanifest.audience (see above). Done now rather than after v0 precisely because contracts freeze — no producer outside this repo emits gradeBand, so today it is a rename in an unmerged draft rather than a break for anyone.

Not filed as an issue first: the issue-first rule protects third parties depending on a shipped contract, and debating a field name on a pre-v0 format with one implementation is the standards-first failure mode this draft's own README warns against. The reasoning lives here and in the changelog instead. Once the format gains a producer (#79 phase 2), changes fall under the normal rule.

How it was verified

  • Prose reviewed against the shipped code's actual behavior; unimplemented parts labeled as draft
  • The audience rename cross-checked against the reference implementation: find_activity wrote the old field and never read it back, and ranking scores plannerDescription and the assess anchors, so nothing consumed it
  • No code paths touched — CI gates (lint/tsc/build) pass trivially

Authorship

  • I understand every line of this diff
  • Agent-assisted or agent-authored: authored by Claude working interactively with @adamstankiewicz, who directed scope and reviewed content
  • No package.json / pnpm-lock.yaml changes

🤖 Generated with Claude Code

adamstankiewicz and others added 2 commits August 21, 2026 19:54
Three sketch documents defining the agent-to-learning format as data
riding existing protocols: surface (a profile of A2UI — flat components,
bindTo references, the WidgetResult contract, namespaced learning
extensions that plain A2UI renderers safely ignore), manifest (the
registry/marketplace listing: verified standards alignment, pedagogy
metadata, two-tier content/code trust split, provenance with reviewer
attestations), and events (payload shapes with two transport bindings,
AG-UI and MCP Apps, plus the normative two-tier interaction rule).
Every section is tagged Shipped / Prototype / Planned so the spec
formalizes reality rather than aspiration. Prose only — no schemas, no
validator, no src/ changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, changelog

The precision pass, not a feature pass. conformance.md makes conformance
claimable: four classes (Producer, Renderer, Registry, Host) with RFC 2119
requirements distilled from statements previously scattered as narrative,
plus versioning/extension rules and a public 1.0 gate (two independent
Renderer implementations + fixtures + a two-month stability window).
considerations.md gives the security/privacy/a11y sections an education
spec owes its adopters first — the catalog trust boundary as invariant,
the two-tier threat-model split, both prompt-injection doors, and the
WidgetResult-is-an-education-record division of FERPA-shaped
responsibility (content and people never in the same artifact).
CHANGELOG.md starts the breaking-change ledger. README gains the RFC 2119
conventions note. Still prose only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
interactive-learning-experiences Ready Ready Preview Aug 30, 2026 8:12pm

Request Review

The docs predate the labels-are-earned rule and said 'spec' throughout
while the PR body and landing promise 'a format, not a specification —
it earns the second word when a second implementation exists.' Now the
README states that rule itself, and every self-reference says format.
References to other projects' specifications (A2UI, AG-UI) stay as they
are — those earned the word.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@adamstankiewicz

Copy link
Copy Markdown
Owner Author

Converted to draft deliberately: the format docs don't ship until the OSS solution actually uses the format — the README's own "implementation first" lesson, applied to itself.

Un-drafts when phase 2 of #79 lands, i.e. when:

  • find_activity listings are built by src/lib/a2learn/manifest.ts (buildManifest) rather than describing their own shape,
  • build_pathway / show_widget results carry the manifest for what they built,
  • and at least one surface a client can fetch is emitted through toA2UISurface (not only conformance fixtures).

At that point every normative statement in these docs has a producer in src/, and the docs merge as documentation of shipped behavior. Until then they stay visible here as the draft they claim to be.

🤖 Generated with Claude Code

…g K-12

`gradeBand: {min, max}` was normative and numeric, so it could only ever
describe K-12 grade levels; an undergraduate year or a new-hire cohort has
no honest value to put in it. `audience` is a list of scheme-scoped label
sets, which is the shape `standards[]` already uses — the naming authority
travels with the value, so `"4"` is unambiguous once `scheme` says which
system named it.

Safe because nothing consumes the field: the reference implementation's
find_activity writes gradeBand into the manifest and never reads it back,
and its ranking scores plannerDescription and assess-anchors, not audience.
No producer outside this repository emits it, so the change is a rename in
an unmerged draft rather than a break for anyone.

Only `k12-us` is registered. Higher-ed and professional schemes are
structurally supported but deliberately unnamed — the format documents what
a producer emits today, and none emits them yet.

`purposes` is stated as an open vocabulary in the same pass, so the enum
that would need a new beat for workplace practice isn't frozen shut.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.

1 participant