Skip to content

course: name the bench board in lessons 1 and 3, add the X handles - #1806

Open
gHashTag wants to merge 1 commit into
mainfrom
fix/course-bench-facts
Open

gHashTag wants to merge 1 commit into
mainfrom
fix/course-bench-facts

Conversation

@gHashTag

@gHashTag gHashTag commented Nov 7, 2026

Copy link
Copy Markdown
Collaborator

What

The FPGA course ("From zero to a chip") stated bench facts that the bench SSOT contradicts (t27 fpga/HARDWARE_SSOT.md, measured 2026-10-08: the bench board is an ALINX AX7203, xc7a200tfbg484-2). This PR corrects the two lessons and adds the X accounts to the course lead.

Where Before After
Lesson 1 text "Our bench chip is an AMD Artix-7 XC7A200T." names the board and package: ALINX AX7203, 484-ball FBG484
Lesson 1 task "In the spec frame of our bench board, find LUT_TOTAL" the frame is the Wukong board file (same die); its LUT_TOTAL is AMD's logic cell count, 1.6 per LUT6, not a LUT count
Lesson 3 text "the XC7A200T on our board has 676 solder balls" 484 balls on the AX7203; the pin map draws the same die in the 676-ball FGG676 of the Wukong board
Course lead (no X) "On X: x.com/t27_dev and x.com/t27_lang."

The Russian bundle (i18n/course.ru.json) carries the same numbers as each English field. Generated files, lesson pages and the two course cards (EN, RU) are regenerated by the existing generators; nothing generated was edited by hand.

The drift rules that would have caught this are law in Trinity-S-AI-DNA/t27#13239 (specs/tri/course/audit.t27, PR Trinity-S-AI-DNA/t27#13241); the audited strings fail its tests verbatim and the new wording passes.

Not in this PR

Closes #1804
Refs #1478

{
  "version": 1,
  "head_sha": "0364afe33a5210683a2b4e07a1b57fa8e42d4927",
  "summary": "Two FPGA course lessons now name the bench board (ALINX AX7203, 484-ball FBG484) instead of implying the Wukong's 676-ball package, lesson 1 says LUT_TOTAL is a logic cell count, and the course lead lists x.com/t27_dev and x.com/t27_lang.",
  "changes": [
    "apps/website/specs/course/course.t27: SAY_LEAD, LESSON_TEXTS[0], LESSON_TASKS[0], LESSON_TEXTS[2].",
    "apps/website/i18n/course.ru.json: the four matching Russian fields, with the same numbers as the English ones.",
    "Regenerated by scripts/course-from-spec.mjs: src/lib/course.generated.ts and public/learn/course.t27.",
    "Regenerated by scripts/course-pages.mjs: the EN and RU pages of the course, fpga-is-a-grid and pins-and-package, the two course cards and learn/cards.json."
  ],
  "tests": [
    {
      "command": "cd apps/website && node scripts/course-from-spec.mjs --check",
      "status": "passed",
      "result": "rc 0: 11 courses up to date, 297 lesson specs compile, spec tests 86, asserts 401 hold; the Russian bundle passes the same-numbers check.",
      "evidence": "Local run on the PR head before push."
    },
    {
      "command": "cd apps/website && node scripts/course-pages.mjs --check",
      "status": "passed",
      "result": "up to date: 616 pages for 11 courses, 616 cards, learn/sitemap.xml (after one regenerate that redrew 2 cards).",
      "evidence": "Local run on the PR head before push."
    },
    {
      "command": "lefthook pre-commit and pre-push (explorer-bilingual-contract, queen-bilingual-contract, course-ladder-contract, translations-contract, english-only)",
      "status": "passed",
      "result": "all green on commit and push.",
      "evidence": "Local hook output on commit 0364afe33a."
    },
    {
      "command": "npm run typecheck && npm run test:course && npm run check:course-pages (the node --test half)",
      "status": "not_run",
      "result": "Not run on this Mac: tests and builds run in CI only (load rule). CI runs them on this PR.",
      "evidence": "CI checks on this PR."
    }
  ],
  "limitations": [
    "The course post required by specs/policy/course_post.t27 is not in this PR, so the post-per-pr rule is expected to fail until it lands (see Not in this PR).",
    "The X handles are plain text in the lead, not links: the course page has no link slot that a spec can fill (#1805).",
    "Only the three drifts found in the audit at ca7ec465e5 are fixed; no other lesson was re-checked against the bench beyond the drift rules in Trinity-S-AI-DNA/t27#13239."
  ],
  "tags": ["Course", "Engineering", "Verification"],
  "blog": {
    "title": "The course said 676 balls; the bench board has 484",
    "summary": "An audit against the bench SSOT found three sentences in the FPGA course that were true of a different board, and the rule that catches them is now a t27 spec.",
    "outline": [
      "Lessons 1 and 3 described the XC7A200T on the Wukong board (FGG676, 676 balls) as if it were the bench chip, which sits on an ALINX AX7203 in the 484-ball FBG484, and called a logic cell count a LUT count.",
      "The fix names the board and package in each sentence and keeps the Wukong frame and pin map, saying which board they draw; a drift rule (trigger, required context) in specs/tri/course/audit.t27 fails the old strings and passes the new ones, and its package trigger is ' 676' with a space so it does not fire inside 1.6467602581.",
      "The audit has no tri glue yet, so it runs only through its own tests; the clickable X links and a mastery page wait on a course page that a spec can drive."
    ]
  }
}

🤖 Generated with Claude Code

The FPGA course drifted from the bench SSOT (t27 fpga/HARDWARE_SSOT.md,
measured 2026-10-08): the bench board is an ALINX AX7203 with the
XC7A200T in the 484-ball FBG484 package.

- Lesson 1 text names the board and package.
- Lesson 1 task: the spec frame is the Wukong board file, and its
  LUT_TOTAL is AMD's logic cell count (1.6 per LUT6), not a LUT count.
  The old task called it the spec of our bench board.
- Lesson 3 text: 484 balls on the bench board; the pin map draws the
  same die in the 676-ball FGG676 package of the Wukong board. The old
  text said our board has 676 balls.
- The course lead lists both X accounts side by side: x.com/t27_dev and
  x.com/t27_lang (plain text; clickable links need Course.tsx, #1805).

The RU bundle carries the same numbers as the English fields. Generated
files, lesson pages and the two course cards are regenerated by
scripts/course-from-spec.mjs and scripts/course-pages.mjs; both --check
runs are clean. The drift rules that catch this live in t27
specs/tri/course/audit.t27 (Trinity-S-AI-DNA/t27#13239).

Closes #1804
Refs #1478

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the status:in-progress 🔵 Agent working label Nov 7, 2026
gHashTag added a commit to Trinity-S-AI-DNA/t27 that referenced this pull request Nov 7, 2026
…opped (#13243)

PR #13241 squash-merged before its second commit (766f949) reached
the PR, so master holds the bare "676" package trigger, which fires
inside the CORDIC gain 1.6467602581 of the arithmetic course. This
restores the " 676" trigger and its negative-control test verbatim
from that commit.

The v2 task table now says what merged: board-spec, audit-law,
mastery-law, predict-step and review-intervals are DONE (#13241);
lesson-facts stays CLAIMED (Trinity-S-AI-DNA/trinity#1806, open).
A new TASK_PR column names the PR that carries each task, with a test
that a DONE task names one and an OPEN task names none, so an agent
reading the file sees what is in progress and where.

Refs #13239
Refs #13240

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
cursor Bot pushed a commit to Trinity-S-AI-DNA/t27 that referenced this pull request Nov 9, 2026
…13249)

* specs/blog: the course bench-board post, its figure as a native T27F still (Closes #13248)

The post for Trinity-S-AI-DNA/trinity#1806 as a t27 entry. Its figure is
no longer an SVG typed by hand: a t27b program draws it as a T27F still.

- specs/blog/course_bench_board.t27: the post entry, 9 blocks. The figure
  block is an SVG whose one element is an <image> of the still
  (STILL_HREF), at the still's own size (OUT_W x OUT_H = 642 x 210).
  Board name, package and ball counts come from specs/boards/ax7203.t27.
- specs/blog/course_bench_board_still.t27: the still, 214 x 70 at scale 3,
  four lines and a rule, painted with t27f::frame_render.
- specs/blog/course_bench_board_still_main.t27: writes the still as one P6
  file (404475 bytes) to standard output; t27b build --macho, libSystem.
- specs/t27f/still_text_main.t27: a text view of any P6 still, one
  character per cell, so a still can be checked without an image channel.
  The still reuses its px_at (no new duplicate body).

Tests (t27b test, T27 OS pane 15): post 7/7, still 5/5, still main 1/1,
text view 5/5, rc 0 each. tools/dupe_scan.py --like: nothing in any of
the four files is written elsewhere.

Not claimed: how a browser shows the PNG made from the P6. The trinity
side (body file, ruBody, registration, the PNG) belongs to trinity#1806.

See #9063.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* specs/blog: stream the bench still and its text view under the width gate; CoursePostBlock (Closes #13248)

Two CI reds on PR #13249 were caused by this branch.

Verilog widths: the two mains held whole-image buffers, so gen-verilog gave
ranges of [3235679:0] (still main) and [8388607:0] (text view), over the
2^20-bit limit in tools/check_verilog_widths.py.
- course_bench_board_still_main.t27 now writes the P6 header and then
  BASE_H bands of SCALE rows, one upscaled base row at a time (5778 bytes).
  Its largest buffer is the 44940-byte base.
- still_text_main.t27 reads the header one byte at a time, then reads the
  image in bands of `step` rows into a 65536-byte buffer, and writes the
  summary line before the rows. A side over SIDE_MAX (2048) exits 4.
  read_full and write_full loop until the count is met.
- gen-verilog with the master t27c: widest range 359519 (still main) and
  524287 (text view).

Corpus ratchet: the post's four-field PostBlock was a second shape of the
two-field PostBlock in epic_progress.t27 and t27b_progress.t27. It is
now CoursePostBlock.

Measured, t27b test in a T27 OS pane:
- still_text_main: 8 passed, 0 failed
- course_bench_board_still_main: 2 passed, 0 failed
- course_bench_board: 7 passed, 0 failed

Built program, t27b build --macho plus ld: the streamed still is 404475
bytes and byte-identical (cmp) to the still the old main wrote. The view
over it prints "ppm 642 x 210 step 3 cols 214 rows 70 mixed_cells 0",
byte-identical to its earlier output.

t27b test cannot run sys_read or sys_write ("import sys_read run outside
an object"), so the syscall paths are checked only by the built program.
The tests cover the paths that make no call.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status:in-progress 🔵 Agent working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Course 1 lessons 1 and 3: bench-board facts (AX7203, FBG484, logic cells) and the author's X handles

1 participant