Skip to content

feat(course-access): every course free for everyone (rules VERSION 3) - #10799

Merged
gHashTag merged 1 commit into
masterfrom
feat/course-access-all-free
Oct 19, 2026
Merged

gHashTag merged 1 commit into
masterfrom
feat/course-access-all-free

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

Closes #10798 (child of EPIC #9063)

Pull Request Checklist

  • PR title follows semantic convention
  • PR body includes Closes #10798
  • Tests updated: t27c test-report gives 18/18 PASS with 0 vacuous
  • Spec changed, so the seal is refreshed with t27c seal --save

Description

The owner, 2026-10-19: «сделай курсы бесплатно всех! наша задача язык раскачать!!». In English: make the courses free for everyone; our task is to grow the language. A course behind the club is a reader the language does not get. The club stays the bot's own subscription for generations.

  • step_of(opened) returns STEP_FREE for every rung. In v2 the first three courses were free and every course after them was paid. Now no course needs the club or the bot.
  • LADDER_RUNGS counts the rungs that differ before step_of repeats its last one. It was 4 in v2 (free, free, free, paid, then paid for good). It is 1 now (free, then free for good).
  • STEP_BOT and STEP_PAID stay. may_open, stays_open, mint_ok and key_days are unchanged, so a key already minted keeps opening what it opened.
  • lesson_event, tells_owner and may_report do not depend on the paid rung, so they are unchanged. SITE_CHECKOUT and CONTENT_HIDDEN stay false.
  • The header carries a dated VERSION 3 note. The one-line summary at the top and THE LADDER paragraph no longer say "rungs past the fourth stay PAID".

Changes

  • specs/automation/course-access.t27:
    • VERSION 3 and step_of returns free.
    • The test "the fourth and every one after it need the club" became "the fourth and every one after it are free too, no club asked".
    • New test "every course is free, for every reader, however many he has opened": a loop over n = 0..254 plus n = 255, 767 runtime asserts.
    • New test "a paid key a reader already holds still opens a paid step".
    • The VERSION test asserts step_of(VERSION + 1) == STEP_FREE.
  • .trinity/seals/automation_automation::course_access.json: resealed, 18/18.
  • docs/now/2026-10-19-course-access-v3-every-course-free.md

Testing

t27c is built from 239b4b0. Since then bootstrap/ has had only one commit, the tower-http dependency bump (#9340). The run used zig 0.16.0.

run tests pass FAIL vacuous
t27c test-report specs/automation/course-access.t27 18 18 0 0
t27c validate-vacuity --specs-dir <copy of this spec only> 18 – – 0
negative control: v2 step_of body (if opened >= 3 { return STEP_PAID; }) 18 15 3 –

The negative control turns three tests red: "the fourth and every one after it are free too, no club asked", "every course is free, for every reader, however many he has opened" and "VERSION says what the header's last note says".

Lowering: node scripts/t27-logic.mjs <this tree> automation/course-access from 999 lowered 9 fns, with 0 not lowered. In node, stepOf(1..10) gives [0,0,0,0,0,0,0,0,0,0] and stepOf(0, 254, 255) gives 0,0,0.

Local equivalents of the required checks, all ok:

  • tools/dupe_scan.py: no new duplicate body.
  • tools/ci/check_specs_still_parse.py: 1 changed spec, 0 newly unparseable.
  • Own-language gate check_all, rc 0. Foreign-line budget check_budget, rc 0.
  • tools/check_json_parses.py: OK.
  • tools/check_now_entry_shape.py: 1 entry, well formed.

Review Notes

  • Hosts are not changed here; their re-vendoring follows separately. In 999 that is apps/vibee-editor/render/src/spec/course-access.*. In trinity it is apps/website/specs/ladder/course-access.t27 and src/lib/courseAccess.logic.ts. The host binding tests name the spec's test titles, and two of those titles are new or renamed here.
  • The header names one case for the hosts. trinity's courseLadder.ts judges a course already in the reader's stored list by staysOpen(storedStep, paid). So a course stored on a paid rung under v2 still closes when that reader's club ends. The reader cannot reopen it either, because it is already in the list. A host that must keep it open re-rungs it with step_of. Another way is a VERSION 4 in which stays_open keeps paid rungs open.

φ² + 1/φ² = 3 | TRINITY


Generated by Claude Code

Owner, 2026-10-19: "make the courses free for everyone! our task is to grow
the language". step_of now returns STEP_FREE for every rung; no course needs
the club or the bot. LADDER_RUNGS is 1 (one rung, free, repeated for good).
STEP_BOT and STEP_PAID stay, and may_open, stays_open, mint_ok and key_days
are unchanged, so a key already minted keeps opening what it opened. The
club stays the bot's own subscription for generations.

Tests 18/18, 0 vacuous; a loop pins step_of(n) == STEP_FREE for n = 0..255.
Negative control: the v2 step_of body turns 3 tests red. Sealed with
t27c-bootstrap 0.5.2+239b4b059, zig 0.16.0.

Closes #10798

phi^2 + 1/phi^2 = 3 | TRINITY

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ScHVrGSr6zZUdwkdC8DR9k
@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-19 03:09:25 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 43
PRs with All Checks Green 7
READY 2
FAILING 43
PENDING 0
NO CHECKS YET 0

These columns do not partition: 2 + 43 + 0 + 0 = 45, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=fad12492937a != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@gHashTag
gHashTag enabled auto-merge (squash) October 19, 2026 03:15
@gHashTag
gHashTag merged commit 242ce55 into master Oct 19, 2026
31 of 34 checks passed

Copy link
Copy Markdown
Owner Author

coverage failed on f61309d at the step "Every seal still describes its spec" (tools/check_seal_coverage.py). The one seal that no longer holds is t27f_T27fFrontend.json, for specs/t27f/frontend.t27. This PR does not touch that spec.

On master, 2e561c6 (#10782 M4, petal_menu) changed specs/t27f/frontend.t27 but did not re-seal it: its seal was last written in 2d0c352. The branch carries 2e561c6 from its base, so the check fails here for the same reason it would on master. Every master run of Seal Coverage since that commit was cancelled, so master has no completed red to point to.

Locally, check_seal_coverage.py on this head reports course_access sealed and current. The only failure is the frontend seal. The repair belongs with that spec (t27c seal specs/t27f/frontend.t27 --save && tri seals sync-twins), not in this PR, and coverage is not a required check.


Generated by Claude Code

@gHashTag

Copy link
Copy Markdown
Owner Author

Continued in #10842: GitHub refused to reopen this pull request after a close/reopen meant to sync its head with the branch (now 03d25f2, master merged in). Same branch and commits.

🤖 Generated with Claude Code

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.

course-access VERSION 3: every course free for everyone

2 participants