Skip to content

Close the licence gaps, absorb the ets pedagogy, and check links in CI - #26

Merged
pedrobritx merged 3 commits into
mainfrom
claude/licence-and-framework-migration
Jul 31, 2026
Merged

Close the licence gaps, absorb the ets pedagogy, and check links in CI#26
pedrobritx merged 3 commits into
mainfrom
claude/licence-and-framework-migration

Conversation

@pedrobritx

Copy link
Copy Markdown
Owner

Makes this repository the single home for the pedagogy, and fixes the two licence problems that would have made a commercial platform built on it legally awkward.

Part of consolidating four repositories into two — see ADR 0001 in lexis. The companion PRs are lexis#… (the commercial half) and ets#2 (the tombstone).

Licence

Two gaps, both of which would have bitten later rather than now:

Outside contributions could not be commercially licensed. The repo is dual-licensed — free for teachers, paid for tuition-charging institutions — but had no CLA, so a contributor retained rights that made the commercial half unsellable. CONTRIBUTING.md now requires a DCO sign-off plus an explicit dual-licensing grant.

The attribution clause applied to the copyright holder's own products. §4 requires attribution on generated materials, which would have meant every worksheet Lexis produces carrying a credit to its own framework. LICENSE.md §4.1 reserves the copyright holder's rights and names BRITX products explicitly.

The README also now states the source-available, not open source distinction plainly. "Open source" is a defined term and using it loosely for a licence that restricts commercial use invites arguments the licence never intended.

Absorbed from ets

That repository specified in prose what this one already implements. Its pedagogical half moves here, to sit with the data it describes:

Now here Was
docs/CANON.md The pedagogical half of ets/CANON.md — the 7-phase canon, positional archetype identity, per-level strand budgets, framework-vs-programme scope, single source of truth
docs/framework-overview.md docs/framework/overview.md, with its "what is where" table repointed at src/data/*.js
docs/handout-authoring.md docs/framework/authoring-guide.md, bannered
docs/research/ The SLA reference, the annotated bibliography, and the thesis framework this teaching model derives from
schemas/ Five JSON Schemas, $ids repointed to this repository
tools/validate.mjs Rewritten to import src/data/*.js directly rather than a generated JSON mirror

efll-framework-v2-spec.md gets a superseded banner. It still read "locked decisions, ready for implementation" for a design that was deliberately not built — no router, a wizard rather than /compose routes, activity-keyed handouts rather than three authored tiers. The banner tabulates spec against reality and names the two things from it that are genuinely unbuilt rather than superseded: the saved-lesson library and answer keys.

docs/handout-authoring.md gets the same treatment for the same reason, and survives because its level-calibration tables describe pedagogy rather than file format — text length per level, exercise type per level, sentence-frame counts, how much of a rule the learner writes. Those are still correct.

Validation

npm run validate now imports the data modules rather than a generated copy, which is what makes the ets data/ directory deletable. It checks schema conformance plus four invariants no schema can express:

  • every archetype's minute budget sums to 60
  • every level's strand hours sum to 60
  • the macro grid is complete at 6 × 6
  • every phase has exactly one handout task per activity option — the index join that silently prints a blank handout when it is short
6 themes · 6 levels · 7 phases · 8 archetypes
36 macro cells · 252 prompts · 2160 handout tasks
archetype budgets: 60 ×8 · strand budgets: 60 ×6
activities/phase:  8 8 8 8 12 8 8

Each check was proved by injecting the fault it exists to catch. Removing one of the 2,160 handout tasks fails the run, which is the one that matters — that join is otherwise silent.

Link checking in CI

tools/check-links.mjs, ported from the ets migration tooling and stripped of the one-shot Notion page-id rewriting.

This migration produced dangling links twice, both times pointing at src/data/*.js paths that had moved, and both times invisible on GitHub until someone clicked. Docs here cite those paths constantly. External links are deliberately not checked — that needs the network and turns a deterministic check into a flaky one.

Also

  • docs/research/annotated-bibliography.md deduplicated. Two copies existed after the migration; the root-level one was better formatted (the migrated copy carried Notion export artefacts that merged bold-run boundaries mid-sentence, producing things like "CS/Full-Stack StudentVerification pass"). The good copy moves into docs/research/ and the mangled one goes.
  • README gains a documentation index; its project-structure tree now lists the data modules added since it was written.

Verification

  • npm run validate — passes, with one intentional note about archetype 7's alias colliding with archetype 5's name
  • npm run check-links — 40 relative links resolve; proved by injecting a dangling link, which failed with exit 1
  • npm run build — succeeds
  • All 252 prompts, 36 macro cells, 49 activity options and 8 archetype budgets in the retired ets mirror confirmed present in src/data/ before that mirror was deleted

Generated by Claude Code

claude and others added 3 commits July 31, 2026 00:55
…amework data

Three things, all consequences of making this repository the single home for the
pedagogy rather than one of two mirrors of it.

LICENCE

The dual licence sells commercial licences covering "the Work", but nothing
obliged a contributor to grant the right to relicense their contribution — so
the first outside pull request would have left part of the work uncoverable.
CONTRIBUTING.md now requires a DCO sign-off plus an explicit dual-licensing
grant. Contributors keep copyright; they grant a licence.

§1 also defines "the Work" to include the materials it generates, and §4
requires attribution on them — which as drafted obliged the copyright holder's
own commercial products to credit the copyright holder. §4.1 now reserves the
holder's rights and exempts BRITX products, Lexis included. No third party
gains anything from that clause.

The README never claimed to be open source, but the distinction is worth
stating: commercial use is restricted, so this is source-available, and "open
source" is a defined term that invites arguments the licence never intended.

RESEARCH

docs/research/ arrives from the retired specifications repository: the SLA
compendium, the annotated bibliography covering CEFR/IPA/Cambridge/IELTS, and
the thesis framework this pedagogy was derived from. Its README connects them
to their operational form in src/data/ and keeps the standing caveat about the
compendium's Anglophone tilt visible.

docs/CANON.md carries the pedagogical half of the reconciliation — the 7-phase
template as canon, positional archetype identity, per-level strand budgets,
framework-versus-programme scope, and src/data as sole source. The platform
half stays with the platform.

VALIDATION

schemas/ and tools/validate.mjs arrive too, but rewritten rather than copied.
The imported version read generated JSON in the other repository; this one
imports src/data/*.js directly, because a copy is a second source and a second
source drifts — that mirror had already reached 49 activities on one side and
60 on the other.

Beyond schema conformance it asserts what schemas cannot: archetype budgets
summing to 60, strand hours summing to 60, DEFAULT_PHASE_MINUTES agreeing with
each phase's defaultMin, grid completeness, every phase and activity citing
research, every evidence key resolving, and the archetype name collision
surfacing on every run.

The check that earns its keep: one handout task per activity option. The join
between a chosen activity and its student instruction is the array index, so a
short array yields an undefined task — invisible until a teacher picks that
activity and prints a blank handout. Verified by removing one of the 2,160
tasks and confirming the run fails.

All 2,160 handout tasks are now validated, which they were not before.

CI runs validate and build on pull requests. There was previously no PR CI at
all here; deploy.yml only fires on push to main, so a broken build first
surfaced as a failed Pages deploy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1xddDPK8VaUvxSxvHyJPS
Signed-off-by: Claude <noreply@anthropic.com>
The `ets` repository was a specifications repo that had drifted into
re-deriving what this repo already implements. Its pedagogical documents
belong with the data they describe.

- `docs/framework-overview.md` — the pedagogy in prose, with its "what is
  where" table repointed at `src/data/*.js` (it previously pointed at a
  generated JSON mirror that has been retired).
- `docs/handout-authoring.md` — kept for its level-calibration tables, which
  describe pedagogy rather than file format and are still correct. Bannered:
  the three-tier handout model it was written for was never built, and the
  activity-keyed model that replaced it is already complete at 2,160 tasks.
- `efll-framework-v2-spec.md` — marked superseded. It still read "locked
  decisions, ready for implementation" for a design that was deliberately
  not built. The two genuine gaps it names (saved-lesson library, answer
  keys) are called out as gaps rather than buried.
- `docs/research/annotated-bibliography.md` — deduplicated. The root-level
  copy was the better-formatted of the two (the migrated one carried Notion
  export artefacts that merged bold-run boundaries mid-sentence), so it
  moves into `docs/research/` and the mangled copy goes.
- README gains a documentation index, and its project-structure tree now
  lists the data modules that were added since it was written.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1xddDPK8VaUvxSxvHyJPS
Ported from the `ets` migration tooling, stripped of the one-shot Notion
page-id rewriting that only ever applied to that export.

The generic half earns its keep: this migration produced dangling links
twice, both times pointing at `src/data/*.js` paths that had moved, and
both times invisible until someone clicked them. Docs in this repo cite
those paths constantly.

External links are deliberately not checked — that needs the network and
turns a deterministic check into a flaky one.

Verified by injecting a dangling link, which failed the check with exit
1, then removing it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1xddDPK8VaUvxSxvHyJPS
@pedrobritx
pedrobritx force-pushed the claude/licence-and-framework-migration branch from d83fb2f to e0d39f7 Compare July 31, 2026 01:14
@pedrobritx
pedrobritx marked this pull request as ready for review July 31, 2026 04:17
@pedrobritx
pedrobritx merged commit cec4ead into main Jul 31, 2026
1 check passed
@pedrobritx
pedrobritx deleted the claude/licence-and-framework-migration branch July 31, 2026 04:18
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