Close the licence gaps, absorb the ets pedagogy, and check links in CI - #26
Merged
Merged
Conversation
…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
force-pushed
the
claude/licence-and-framework-migration
branch
from
July 31, 2026 01:14
d83fb2f to
e0d39f7
Compare
pedrobritx
marked this pull request as ready for review
July 31, 2026 04:17
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.
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 arelexis#…(the commercial half) andets#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.mdnow 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
etsThat repository specified in prose what this one already implements. Its pedagogical half moves here, to sit with the data it describes:
docs/CANON.mdets/CANON.md— the 7-phase canon, positional archetype identity, per-level strand budgets, framework-vs-programme scope, single source of truthdocs/framework-overview.mddocs/framework/overview.md, with its "what is where" table repointed atsrc/data/*.jsdocs/handout-authoring.mddocs/framework/authoring-guide.md, bannereddocs/research/schemas/$ids repointed to this repositorytools/validate.mjssrc/data/*.jsdirectly rather than a generated JSON mirrorefll-framework-v2-spec.mdgets 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/composeroutes, 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.mdgets 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 validatenow imports the data modules rather than a generated copy, which is what makes theetsdata/directory deletable. It checks schema conformance plus four invariants no schema can express: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 theetsmigration tooling and stripped of the one-shot Notion page-id rewriting.This migration produced dangling links twice, both times pointing at
src/data/*.jspaths 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.mddeduplicated. 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 intodocs/research/and the mangled one goes.Verification
npm run validate— passes, with one intentional note about archetype 7's alias colliding with archetype 5's namenpm run check-links— 40 relative links resolve; proved by injecting a dangling link, which failed with exit 1npm run build— succeedsetsmirror confirmed present insrc/data/before that mirror was deletedGenerated by Claude Code