Skip to content

docs(alignment): replace the ✅ Aligned table with measured inventories - #151

Open
Kartikey1306 wants to merge 13 commits into
embeddedos-org:masterfrom
Kartikey1306:docs/three-way-alignment-measured
Open

Kartikey1306 wants to merge 13 commits into
embeddedos-org:masterfrom
Kartikey1306:docs/three-way-alignment-measured

Conversation

@Kartikey1306

@Kartikey1306 Kartikey1306 commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Stacked on #144 (master's Python guards are red without it, so this branch would inherit four failures that are not its own). Review 9569226..6437af8: two commits, one file.

Problem (eos #149)

docs/three-way-alignment.md said "✅ ALL ALIGNED" and, for board definitions, "25 YAML files in eos/boards/ | 25 board ports in eboot/boards/". None of those numbers was true, and nothing cross-checks the three inventories the row describes. ebuild#109 corrected this row — inside ebuild's vendored copy core/eos/docs/three-way-alignment.md, pinned to eos 5544c98, so ebuild's vendor-drift guard failed and ebuild#132 reverts it to the pin. The correction belongs here, upstream, where the pinned copy is taken from.

What changed

Every count in the status table was re-measured on 2026-09-14 against origin/master of eos (9ed6831), eBoot (221325c) and ebuild (76970c9), and the table now shows measured numbers with ⚠️ where inventories disagree or nothing compares them, and ✅ only where a comparison was actually made. Headlines:

Row Document said Measured
Board definitions 25 / 25 / — eos 84 boards/*.yaml; eBoot 83 boards/*/ = 83 eboot_add_board() calls; ebuild TARGET_ARCH 14, EBOOT_BOARD 14, MCU_TO_EBOOT_BOARD 136 keys (56 distinct eboot dirs; 27 eboot dirs never targeted); EOS_BOARD_MAP 116 keys (81 distinct eos YAMLs; 3 never mapped)
Product profiles 41 / 41 48 headers, 42 config branches, 41 PRODUCT_MAP keys — seven headers with no map entry
Config generation 39 flags, one generator 34 EOS_ENABLE_* defines; across ebuild/**/*.py 29 named, 24 in common, 5 named only by ebuild and defined nowhere in eos, 10 defined in eos and never named by ebuild; two generator classes, two files
Templates 5 in ebuild/templates/ 6 in templates/ at the ebuild root; eos names four of them by their ebuild new --template spelling, all of which exist; eBoot names none
Peripheral keywords 33 / 24 / 200+ 33 and 24 reproduce; the ComponentDB docstring's 200+ is 114

A ## How this was measured section lists every command and the full comparison script, and every line the script prints appears verbatim in the document — re-running it reproduces the table. The document no longer claims a cross-check tool exists, because none does.

Verification

Verified: the embedded script was executed from a directory of sibling checkouts and its output diffed against the recorded output (no differences). pytest tests/unit 43 passed on this branch.

Left as is, annotated: later sections still carry the original 25-board / 41-profile figures in prose. Four sections now open with a one-line note that the status table supersedes them — Board-Level Alignment (:142), Product Profile Alignment (:176), Build System Alignment (:302; its note gives today's measured figure, 86 EBLDR_BOARD STREQUAL branches naming 83 distinct boards, the sentinel "none" appearing three times) and eboot CMakeLists.txt Board Coverage (25/25) (:344). The Documentation Alignment section carries no note; instead the two rows that graded this file and hardware-alignment.md as fully aligned are re-graded ⚠️ with the measurement date (:390–391). docs/hardware-alignment.md:51 carries the same note with the 84 / 83 / 7 numbers, so a reader who follows that link no longer lands on the old claim unwarned. (An earlier version of this paragraph claimed notes were already in place on three sections; they were on two different ones. Corrected at the commits that add them — 905c9e8, 237a37f — and 9481429 for the branch count, which an intermediate version gave as 84.)

Closing issue

Fixes #149

Nine PRs were merged into master within minutes on 09-08, each on the base it
was written against. Master has not compiled since, and the Python guards
that would have named the rest never ran because the C build failed first.

Compile (every C job, CodeQL, and the ARM64 kernel in the simulation):
- services/linux/src/linux_security.c: embeddedos-org#119 and embeddedos-org#132 each added an #else to
  the same #ifndef _WIN32 in eos_busybox_install_to_rootfs(), so master has
  "#else after #else". The embeddedos-org#132 arm (`(void)bb;`) is the one removed -- the
  embeddedos-org#119 arm already uses bb and reports the unsupported platform.

Guards from embeddedos-org#121 / embeddedos-org#93 that later merges walked back:
- ci.yml: embeddedos-org#132 added windows-test after embeddedos-org#121's gate; the gate did not wait
  for it, so "CI Gate" could be green with the MSVC leg red.
- test_ci_gate.py: embeddedos-org#129 gave eosim-sanity.yml and simulation-test.yml a
  path-filtered pull_request trigger (they test their own edits); a
  path-filtered check cannot be required, so both are recorded in
  NOT_REQUIRED with the book-build.yml reason.
- tests/CMakeLists.txt: test_linux_security_paths (embeddedos-org#119) and test_pkg_fetch
  (embeddedos-org#115) had no add_executable(). embeddedos-org#115's replay replaced embeddedos-org#119's block with
  its own, and embeddedos-org#118's replay replaced that; two suites compiled against
  nothing. Both registered again. 41 -> 43 suites.
- tests/test_kernel.c: four tests from embeddedos-org#130 and embeddedos-org#131 were defined and never
  called -- their RUN() lines did not survive the replay of main().

And the one that was not bookkeeping:
- kernel/src/task.c: embeddedos-org#130 was merged after embeddedos-org#131 from a base that predates it,
  and its copy of task.c replaced embeddedos-org#131's. embeddedos-org#131 had also flattened 574 CRLF
  line endings, so its 1166-line diff hid a 39/21 change and the replay took
  embeddedos-org#130's side wholesale. Master kept embeddedos-org#131's tests and lost its kernel: the
  idle task could be deleted and suspended, a half-initialised TCB was
  published to the scheduler before its stack existed, and eos_schedule()
  pointed g_current_sp at the outgoing task. test_idle_task_is_permanent
  fails on master the moment it is called. embeddedos-org#131's task.c diff re-applied
  on top of embeddedos-org#130's; the result is embeddedos-org#131's file plus embeddedos-org#130's wake_armed hunk
  and nothing else (verified by diff against 3a00bd9).

Verified locally (macOS, clang): Release build clean, 43/43 ctest; the
README default configuration builds; 47/47 pytest.

Not in this PR: the nightly "Upstream drift" job builds eBoot at master and
eBoot master is broken separately (its own repair PR); bump EBOOT_COMMIT in
eos-simulation.yml once that lands.
Re-registering it put it in front of the MSVC leg (embeddedos-org#132) for the first time,
where <unistd.h> does not exist. The suite probes with access(), open(O_CREAT)
and rmdir to prove refused inputs never reach a shell; on Windows the
library's own #else arm refuses every install/build call before
is_path_safe() matters, so there is nothing for it to test there.
… gives 1 MB

Re-registering the POSIX-only suite let the MSVC leg reach ctest for the
first time, and test_firmware died there with SEGFAULT: five tests declare
a stack EosConfig (sizeof 3,953,236 on this ABI), which the 8 MB default
stack on Linux and macOS absorbs and MSVC's 1 MB does not. test_config.c
already keeps its EosConfig static for the same reason; the same here.
kernel.h declared eos_task_delete() and eos_task_suspend() without saying
what handle 0 is. It is the idle task, it is permanent, and both calls
return EOS_KERN_INVALID for it -- as they do for an out-of-range handle or
an empty slot. The doc comments now say so, in the header's Doxygen style.

eos_schedule() has an early return for "no runnable task" that is
unreachable by construction: slot 0 cannot be deleted or suspended, the
idle task only spins or waits for an interrupt and so never blocks, and
find_next_task() can select it because of the "best < 0 ||" term. The
comment records that reasoning, and that the return is self-healing if it
were ever taken: the outgoing task stays READY and the next eos_schedule()
marks it RUNNING.

task.c also carried two stray blank lines at EOF from the re-apply of
embeddedos-org#131; with them gone, the diff against 3a00bd9 is embeddedos-org#130's wake_armed hunk
plus this comment and nothing else.
…rootfs

is_path_safe() refuses NULL, but eos_busybox_install_to_rootfs() read
bb->source_dir to hand it to the predicate, so a NULL bb reached the
dereference before the guard could see it: a crash rather than the -1
every other refusal in this file produces. Both arguments are now checked
first, before either is read.

test_linux_security_paths gains a case for it: (NULL, dir) and (&bb, NULL)
both return -1, and the directory gets no /init. With the guard removed
and the target rebuilt, the suite dies with SIGSEGV (exit 139) on the
first call; with it restored, the suite passes.
Records under Unreleased what embeddedos-org#144 did and why: the "#else after #else"
that stopped master compiling after the 09-08 batch merge, the guards the
replays walked back (two suites re-registered, four test_kernel tests
wired into main(), windows-test in the CI gate, the two path-filtered
simulation workflows classified), and the NULL guard in
eos_busybox_install_to_rootfs().

The scheduler change gets its own Changed entry because it is a contract:
eos_task_delete(0) and eos_task_suspend(0) return EOS_KERN_INVALID again,
as embeddedos-org#131 specified before embeddedos-org#130's replay replaced its task.c. Changed sits
above Fixed, the order the older releases in this file use.
…end checks

The eos_schedule() comment claimed the early return was self-healing. It is
not: find_next_task() scans every slot including the outgoing one, so
next < 0 means nothing is READY, and the return leaves the state exactly as
the canary check left it. The comment now says so, and that recovery is a
fault handler's job rather than the scheduler's.

eos_task_suspend() refuses a slot whose entry is NULL, which is what the
doc comment now says instead of the looser "holds no task"; a slot the
canary check marked DELETED still has its entry set and is accepted.

tests/CMakeLists.txt: the reason test_linux_security_paths is POSIX-only is
that the shell-building bodies are compiled out on Windows, not that the
predicate is skipped there.
The status table said "ALL ALIGNED" and quoted 25 board YAMLs in eos, 25
board ports in eBoot, 41 products, 33 HAL APIs, 39 EOS_ENABLE_* flags and
5 templates. Measured on 2026-09-14 against origin/master of the three
repositories, the board row alone is 84 eos/boards/*.yaml, 83 eBoot
boards/*/ directories (83 eboot_add_board() calls) and, in ebuild's
sdk_generator.py, TARGET_ARCH 14 / EBOOT_BOARD 14 / MCU_TO_EBOOT_BOARD
136: three differently keyed inventories of different sizes, and no tool
compares them. The other rows drifted too: 48 product headers against 42
config branches and 41 PRODUCT_MAP keys, 34 EOS_ENABLE_* defines of which
ebuild names 24, 114 ComponentDB parts rather than 200+, six templates at
templates/ rather than five at ebuild/templates/, and eboot_flash_layout.h
is written by EosBootIntegrator, not EosConfigGenerator.

The banner is replaced with an honest status line, each row now carries
the measured numbers and what was compared, and a "How this was measured"
section lists the exact commands and the ast-based script so the next
person can re-run them. The 25-board and 41-profile tables are kept as
the original subsets with a note on what still holds; the checklist's
stale "Should be" values are updated and its reference to a
test_full_pipeline.py that no longer exists is marked.

ebuild#109 made this correction inside ebuild's vendored copy under
core/eos/docs, which is pinned to eos 5544c98, so ebuild#132 reverts it to
the pin; the correction belongs upstream here. eos issue embeddedos-org#149 tracks it.

CHANGELOG.md is untouched: none of the docs-only commits on master have
an entry there. tests/unit is unchanged by this edit (39 passed, and the
same four pre-existing failures in test_ci_gate.py and
test_cmake_test_registration.py before and after; neither reads docs/).
… eos does use

Two rows overstated. The templates row said nothing in eos refers to
ebuild's templates; four eos documents name bare-metal, ble-sensor and
linux-app by their ebuild new --template spelling, and all exist. The
config-generation row counted EOS_ENABLE_* names in two ebuild files and
called the result "ebuild"; measured across every ebuild/**/*.py it is 29
named, 24 in common with eos_config.h, 10 eos-only -- not 24/19/15. The
embedded script now scans every file, and its recorded output matches.

@srpatcha srpatcha left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — eos#151 "docs(alignment): replace the ✅ Aligned table with measured inventories"

head: 6437af8 author: Kartikey1306 ci: pass (29 green, 0 red; Create GitHub Release and assign skipped)

Verdict: The central claim — that the embedded script reproduces the table — is true, and
I proved it
: all three repositories' origin/master still sit on the SHAs the document pins,
I re-ran the recorded script from a directory of sibling checkouts, and the output diffs
zero lines against the block committed in the file. Every bash one-liner reproduces its
annotated number too. This is the right way to write an audit document and it closes eos#149
for the file it touches. Two findings: a second document in this same repo still makes the
claim this PR disproves, and the PR body mis-describes which sections were annotated.

Findings

# Severity File:line Finding Recommended fix
1 Medium docs/hardware-alignment.md:51 (not in this diff) eos#149's defect survives in a second file, in a stronger form. That line reads: "Result: 25/25 boards aligned. Every eboot board has a matching eos board definition, and every eos board has a matching eboot port." This PR's own measurements disprove the universal quantifier on both halves — 84 eos YAMLs against 83 eBoot directories, only 7 eos YAML stems sharing a name with an eBoot directory, 27 eBoot directories never targeted by MCU_TO_EBOOT_BOARD, and hiletgo-esp-wroom-32.yaml, qemu-arm64.yaml and tms570.yaml never mapped at all. I reproduced every one of those figures. eos#149 is titled for a document asserting ✅ Aligned for inventories that disagree; this PR fixes one such document and leaves another, unannotated, in the same docs/ directory — and three-way-alignment.md:386 still points a reader at it with ✅ 25 board YAMLs | ✅ 25 board ports. A reader who follows that link gets the old false claim with no warning. Rated Medium as an incomplete fix rather than Low-as-documentation, because the thing left incomplete is the exact defect the PR exists to close; a reviewer who wants to call it Low has a fair argument. Smallest honest change, in this PR: one note under hardware-alignment.md:51 in the same shape as the two this PR already added — "Superseded: measured 2026-09-14, the full inventories are 84 / 83 and only 7 names match; see docs/three-way-alignment.md." Rewriting that document's tables is a separate job and should not grow this PR.
2 Low PR body, "Left as is"; docs/three-way-alignment.md:342,374-390 The PR body names three sections as carrying a supersede note, and none of them does. It says "eboot CMakeLists.txt Board Coverage (25/25), the Build System table, the Documentation Alignment rows — each is now preceded by a one-line note that the top table supersedes it." The file has exactly two > notes, at :144 (Board-Level Alignment) and :178 (Product Profile Alignment) — different sections, both good, neither named in the body. ### eboot CMakeLists.txt Board Coverage (25/25) at :342 and the Documentation Alignment table at :374 have no caveat. The second one matters on its own: :387 still grades this very document ✅ profiles, boards | ✅ boards, platform enum | ✅ all maps audited, which contradicts the banner seven lines from the top of the same file — ⚠️ NOT ALIGNED — the inventories disagree and nothing cross-checks them. Per brief item 5, the unsupported claim in the body is itself the finding; the self-contradiction is the reason it is worth fixing rather than just noting. Add the two missing notes, or correct the body to name the two sections that actually have them. Change :387's row for three-way-alignment.md from ✅ all maps audited to ⚠️ measured 2026-09-14; see the status table, and :386's row for hardware-alignment.md to ⚠️ alongside finding 1.

Two findings on a 140-line documentation change, and neither is in the measurement work — the
measurements are the part I tried hardest to break and could not.

Verification performed for this review

Run from /home/srpatcha/eos, which already holds sibling eos/, eBoot/ and ebuild/
checkouts. The script reads origin/master through git show, never the working tree, so
ebuild's dirty tree is irrelevant to the result and was not touched.

Check Result
Do the three pinned SHAs still match origin/master? YES — eos 9ed6831, eBoot 221325c, ebuild 76970c9, exactly as the document records. This is what makes the reproduction a fair test rather than a coincidence.
Re-ran the document's embedded Python script verbatim and diffed its stdout against the recorded output block ZERO DIFFERENCES. All 18 recorded lines reproduce byte for byte, including the sorted lists — ['hiletgo-esp-wroom-32.yaml', 'qemu-arm64.yaml', 'tms570.yaml'], the seven headers without a PRODUCT_MAP entry, the five ebuild-only and ten eos-only EOS_ENABLE_* flags, and ['ethernet', 'gps', 'watchdog']. The claim "every line the script prints appears verbatim in the document" is Verified.
Ran each of the 22 bash one-liners against its annotated value All reproduce. 89, 84, the other 5 (lm3s6965evb.ld, startup_stm32f407.S, stm32f407_discovery, stm32f407vg.ld, validation — five, as stated), 83/83/83, 48, 24, 34, 6, 0 for ebuild/templates/, 114, 23, 6, all four CLI defs, 38, 12, 0 tracked eboot_flash_layout.h, and the three docs that mention it.
Does the ast-based counting actually matter, or is it ceremony? It matters. The script's own note is right: grep -c '":' over sdk_generator.py counts every quoted key in the file, not one dict's entries. Parsing with ast.literal_eval is the difference between a number and a guess, and it is why these figures are trustworthy where the previous "25 / 25" was not.
pytest tests/unit -q on this head PASS — 43 passed

Was anything weakened? No. The diff is one markdown file, +140/−16. No test, lint rule,
assertion or permission is involved. The other ten files in files.txt are #144's, inherited
through the stack; git diff 95692266..6437af81 is docs/three-way-alignment.md and nothing
else, which matches the body's "two commits, one file".

What this PR gets right

Worth stating, because the findings above are both about what was left over. A document that
carries the commands that produced it, pins the three SHAs it measured, and can be re-run to a
zero-line diff is a different artifact from one that asserts ✅ ALL ALIGNED. That is §28's
evidence model applied to documentation: the ⚠️ markers say "measured, and they disagree", the
one ✅ is explicitly downgraded in its own cell to "a presence check on ebuild alone, not an
inventory comparison", and the document states plainly that no cross-check tool exists rather
than implying one does. Under §28's status table the old text claimed Validated with no
evidence; the new text claims exactly what it measured. The next person to touch this file can
falsify it in one command, which is the property that stops it drifting again.

Architecture conformance

Conforms, and it is the correct repository for the change. §21 places eos in Tier 1 —
Foundation, and this is eos's own document; ebuild#109's mistake was correcting the
vendored copy at ebuild/core/eos/docs/three-way-alignment.md, which is pinned to eos
5544c98 and therefore tripped ebuild's vendor-drift guard — correctly, since a vendored copy
that diverges from its pin is exactly what that guard exists to catch. Fixing it upstream, here,
and letting ebuild#132 revert its copy to the pin is the right sequence and restores the
direction the vendoring relationship depends on. §5.1 is not engaged: no include, link line,
CMake entry or manifest dependency changes, and a markdown file creates no edge. §22's hardware
support tiers are the clause the content speaks to — "Do not market all board descriptors as
equivalent hardware support" — and this change is that instruction carried out: 84 board YAMLs
are now described as 84 differently-keyed descriptors that nothing validates, not as 84
supported boards.

No architecture proposal appended. I considered one, because §22 defines five hardware
support tiers and nothing in this repository records which tier any of the 84 boards is in — but
that is a gap in the repository against the design, not a gap in the design, so it belongs in an
issue rather than in proposals/. §22 already says what should happen; nobody has done it.
That is the more useful thing this measurement exposes and it is recorded here rather than
inflated into a proposal.

Proposed changes

In this PR (both small):
  docs/hardware-alignment.md:51   add the supersede note (finding 1)
  docs/three-way-alignment.md:342 add the note the body says is there
  docs/three-way-alignment.md:386-387
                                  hardware-alignment row -> ⚠️
                                  three-way-alignment row -> ⚠️, not "all maps audited"

Merge order: #144 first (this is stacked on it).

Separate, not this PR:
  an issue for §22 — no board in eos/boards/ is assigned a hardware support tier

Not checked

  • The 25-board subset tables at :142 and :176 were not re-verified row by row. The note
    at :144 asserts "all 25 YAMLs and all 25 eboot directories still exist" and explains the
    9 shorthand rows; I did not check each of the 25 rows or the 9 exceptions individually. The
    aggregate counts they sit under did reproduce.
  • docs/hardware-alignment.md was read only around line 51. I did not audit its remaining
    ~290 lines, so finding 1 names one false claim in that file, not necessarily the only one.
  • The prose sections after ## Data Flow Alignment (:228 onward — Verification Checklist,
    Build System Alignment, Cross-Linking Verification, Coding Convention Alignment) were skimmed
    for stale counts, not audited. :342 and :386 are what that skim found; there may be more.
  • Nothing outside docs/ was checked for stale figures. A quick grep found 41 product profiles asserted in CHANGELOG.md:68,88, CONTRIBUTING.md:168 and docs/book/README.md:19
    while this PR measures 48 headers / 42 branches / 41 map keys. I did not investigate
    whether those four are wrong in context — "41 product profiles" may be a defensible statement
    about PRODUCT_MAP coverage — so this is a pointer, not a finding.
  • CI checks were not reproduced. 29 green on this head; logs not read. The assign job
    shows skipping, which I did not investigate.
  • I did not confirm that ebuild#132's revert and this PR leave the vendored copy consistent.
    That needs ebuild's pin to be advanced to whatever commit this lands as, and that has not
    happened yet — worth saying plainly: until someone re-pins core/UPSTREAM.yaml, ebuild's
    vendored three-way-alignment.md will still be the old ✅ ALL ALIGNED text.
    Closing
    eos#149 here does not by itself fix the copy ebuild ships.

Automated architecture review of 6437af817fd7 — scheduled, model claude-opus-5, checked against the EmbeddedOS Master Design v2.0. Advisory only: this reviewer never approves, requests changes, or merges. Reply here to discuss or push back — a wrong finding is a bug worth reporting.

Review follow-up on embeddedos-org#151.

docs/hardware-alignment.md:51 still said "25/25 boards aligned. Every eboot
board has a matching eos board definition, and every eos board has a matching
eboot port." — a universal claim that this PR's own measurement disproves on
both halves: 84 eos board YAMLs against 83 eBoot board directories, only 7
name stems shared, 27 eBoot directories never targeted by MCU_TO_EBOOT_BOARD.
It now carries a supersede note in the same shape as the two already in
three-way-alignment.md, pointing at the measured status table.

docs/three-way-alignment.md:
  :342  "eboot CMakeLists.txt Board Coverage (25/25)" gets the note the PR
        body said it had. It did not; the two existing notes were under
        Board-Level Alignment and Product Profile Alignment.
  :386  the hardware-alignment.md row is re-graded from ✅ to ⚠️ 25 of 84 /
        25 of 83.
  :387  the row grading this very document "✅ all maps audited" contradicted
        the ⚠️ NOT ALIGNED banner seven lines from the top of the same file;
        it now says ⚠️ measured 2026-09-14; see the status table.

Every figure written here is from the document's embedded script, re-run at
this head: its 18-line output is byte-identical to the recorded block (line
11: "eos yaml 84 | eboot dirs 83 | yaml stems that are eboot dirs 7"; line
12: "... eboot dirs never targeted 27"). pytest tests/unit: 43 passed.
@Kartikey1306

Copy link
Copy Markdown
Contributor Author

Both findings addressed at 905c9e8.

Finding 1docs/hardware-alignment.md:51 now carries a supersede note in the same shape as the two in three-way-alignment.md: the full inventories are 84 / 83, only 7 name stems match, 27 eBoot directories are never targeted, so both halves of the "every … has a matching …" sentence are false for the full inventories. The table rewrite stays a separate job, as you suggested.

Finding 2 — the body was wrong, not the file; corrected both ways. :342 (eboot CMakeLists.txt Board Coverage) now has the note the body claimed. :386 hardware-alignment row → ⚠️ 25 of 84 board YAMLs | ⚠️ 25 of 83 board ports. :387 three-way-alignment row → ⚠️ measured 2026-09-14; see the status table in all three columns, so the row no longer contradicts the banner at the top of its own file. The body's "Left as is" paragraph now names exactly the three sections that carry a note (:142, :176, :342) and says the Build System table carries none.

Verified at 905c9e8, this shell: the embedded script re-run produces output byte-identical to the recorded block (18 lines; line 11 eos yaml 84 | eboot dirs 83 | yaml stems that are eboot dirs 7, line 12 … eboot dirs never targeted 27 — every figure written into the new notes comes from there); pytest tests/unit -q → 43 passed.

Not done here, as agreed: the §22 hardware-tier issue is separate. Merge order unchanged: #144 first; review 6437af8..905c9e8 for this round.

@Kartikey1306

Kartikey1306 commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

Both findings are done, and the body is corrected — it had claimed notes on three sections that were on two others, which is the claim/artefact gap you flagged.

(Correction to the first version of this comment: it cited a commit that never reached the branch. Findings 1 and 2 were closed at 905c9e8, pushed by a parallel session on this account minutes before mine; my 237a37f adds only the third section.)

  • Finding 1: docs/hardware-alignment.md:51 carries the supersede note with the numbers (84 / 83 / 7) directly above the "25/25" sentence (905c9e8).
  • Finding 2: note on eboot CMakeLists.txt Board Coverage (25/25) — with the figure that 27 of the 83 eBoot directories are never targeted by MCU_TO_EBOOT_BOARD — and the two Documentation Alignment rows now read ⚠️ (905c9e8). The Build System table, the third section the body named, gets its note at 237a37f with a figure measured today, not copied: eboot's CMakeLists.txt has 84 EBLDR_BOARD STREQUAL "<board>" branches against the table's 25 (a first draft said 85; that included a "none" guard).

Not done: the §22 tier issue you suggest is a separate issue, as you say — not opened here.

905c9e8 annotated hardware-alignment.md:51 and the "eboot CMakeLists.txt
Board Coverage (25/25)" section, and turned the two Documentation Alignment
rows to warnings -- the review's findings 1 and 2. The PR body also named
the Build System table as carrying a supersede note, and it did not. Now it
does, with the figure measured today rather than the audit's: eboot's
CMakeLists.txt has 84 EBLDR_BOARD STREQUAL "<board>" branches against the
table's 25 (grep -cE '(if|elseif)\(EBLDR_BOARD STREQUAL "[a-z0-9_]+"\)' on
origin/master; 86 lines match the bare pattern, two of them the "none"
guards). EOS_PRODUCT is a free-form cache string, so "41 values" is the
help text, not an enumeration.
The Build System note added at 237a37f says eboot's CMakeLists.txt has 84
EBLDR_BOARD STREQUAL "<board>" branches. Measured at eBoot 221325c, the SHA
the document pins: grep -c 'EBLDR_BOARD STREQUAL' gives 86, all of them
if/elseif branches with a quoted literal; the distinct literals number 84,
but one of them is the sentinel "none", which appears three times and is not
a board. So the figure a reviewer reproduces is 86 (lines) or 83 (boards),
and 84 is the one count neither obvious command returns. The note now gives
both, with the command, and the 83 matches the eBoot board-directory count
in the status table.

pytest tests/unit: 43 passed.
@Kartikey1306

Copy link
Copy Markdown
Contributor Author

Correction to my reply above, visible rather than silent: the head is now 9481429, not 905c9e8, and the range to review for this round is 6437af8..9481429 (three commits).

  • 237a37f (concurrent, same author account) added the Build System note I had said was absent — so "the Build System table carries no note" in my reply and in the body was true for two minutes and is not now. All four sections that keep a superseded count now open with a note; the Documentation Alignment section still has none and instead has its two rows re-graded ⚠️ (:390–391 after the shift).
  • 9481429 corrects the figure that note introduced. It said 84 EBLDR_BOARD STREQUAL "<board>" branches; measured at eBoot 221325c (the SHA the document pins), grep -c 'EBLDR_BOARD STREQUAL' CMakeLists.txt86, all if/elseif branches with a quoted literal; distinct literals → 84, but one is the sentinel "none" (three occurrences), so the board count is 83 — matching the 83 eBoot board directories in the status table. The note now gives both numbers with the command. The body's paragraph is rewritten to say exactly which sections carry a note and which rows were re-graded instead.

Verified at 9481429, this shell: pytest tests/unit -q → 43 passed; the embedded script's output is still byte-identical to the recorded block. CI on 9481429 is running; 237a37f was 7/7 green.

@srpatcha srpatcha left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — eos#151 "docs(alignment): replace the ✅ Aligned table with measured inventories"

head: 9481429 author: Kartikey1306 ci: pass (29 green, 0 red; Create GitHub Release skipped)

Verdict: Follow-up review of 6437af81..9481429d (3 commits, +8/−2 across two files).
Both previous findings are resolved, and the new numeric claims are correct — I re-measured
every one of them against origin/master rather than reading the note. I also re-ran the
document's embedded script at this head and it still diffs zero lines against the recorded
output. Two new Lows, both small, both in the annotations rather than the measurements: a date
that says tomorrow, and one board name in hardware-alignment.md spelled with the wrong
separator — which is, with some irony, the exact naming mismatch this document exists to record.

Previous findings — status

# Previous finding Status Evidence
1 Medium — eos#149's defect survives in docs/hardware-alignment.md:51, which asserts "Every eboot board has a matching eos board definition, and every eos board has a matching eboot port" Resolved in 905c9e8 docs/hardware-alignment.md:52 now carries a supersede note in the same shape as the other two, and it does the thing that matters: it names both halves of the sentence as false for the full inventories rather than softening one. I re-measured its numbers against origin/master today: 84 eos/boards/*.yaml, 83 eBoot/boards/*/, and 7 YAML stems that are also eBoot directory names. All three reproduce. The note points at three-way-alignment.md, which is where the evidence is.
2 Low — the PR body named three sections as carrying a supersede note and none of them did; :387 graded this very document ✅ all maps audited, contradicting its own banner Resolved in 905c9e8 + 237a37f + 9481429 The two missing notes now exist at three-way-alignment.md:304 (Build System Alignment) and :346 (eboot CMakeLists Board Coverage), and the Documentation Alignment rows at :390-391 are corrected: hardware-alignment.md⚠️ 25 of 84 board YAMLs | ⚠️ 25 of 83 board ports, and three-way-alignment.md⚠️ measured 2026-09-14; see the status table in all three columns. The self-contradiction with the banner is gone. 9481429 is the author catching their own arithmetic before anyone else did — the note first said 84 boards, and the correct decomposition is 86 branch lines / 84 distinct quoted literals / 3 of which are the "none" sentinel / 83 distinct board names. I ran all four counts against eBoot origin/master: 86, 84, 3, 83 — exact.

Findings

# Severity File:line Finding Recommended fix
1 Low (P3) docs/three-way-alignment.md:304 The new Build System note is dated 2026-09-15; everything else in the document, including the pins it depends on, is dated 2026-09-14. The file header at :9 says "Measured on 2026-09-14 against origin/master of eos, eBoot and ebuild (eos 9ed6831, eBoot 221325c, ebuild 76970c9)", and the three other supersede notes (:144, :178, :346) all say 2026-09-14. I reproduced this note's figures today, 2026-09-14, against the same eBoot 221325c — so the numbers are right and only the date is wrong. In an ordinary document this is a typo; in this one it is not, because the whole argument of the file is that every claim carries a date and a pin so the next reader can re-run it. A future date on one row invites exactly the question the format exists to prevent: was this measured against something newer than the pins at the top? 2026-09-152026-09-14.
2 Low (P3) docs/hardware-alignment.md:126 The Architecture Alignment table names the eBoot board qemu-arm64; the directory is qemu_arm64. I checked every board name in that table's two repo columns against both repositories mechanically. The eos column is prose ("nRF52840", "RPi4", "i.MX8M"), so it does not resolve to filenames and is not expected to. The eBoot column is in directory form and every other cell resolves — rpi4, imx8m, am64x, stm32mp1, nrf52, stm32f4, stm32h7, samd51, riscv64_virt, sifive_u, esp32, x86, x86_64_efi, mips, powerpc, sparc, m68k, sh4, v850, frv, h8300, mn103, strongarm, xscale all exist. qemu-arm64 does not; eBoot/boards/qemu_arm64/ does. The port is present, so this is a spelling error rather than a missing port — and it is the hyphen-versus-underscore split that is the reason only 7 of 84 names match across the two repos, reproduced inside the table written to document it. The eos side spells it boards/qemu-arm64.yaml, which the measured status table already lists among the YAMLs EOS_BOARD_MAP never maps. qemu-arm64qemu_arm64 in that cell. If you want the row to carry its own weight, qemu_arm64 (eos: qemu-arm64.yaml — names differ).

Checked and not a finding: hardware-alignment.md:144, "16/16 architectures aligned across
eos and eboot.
", is not the same defect as :51 and does not need a note. :51 asserted a
universal quantifier over all boards, which the measurements falsify; :144 is scoped to the 16
rows of the table immediately above it and every one of those rows does have both columns filled.
Recording it because it looks like a survivor of the same audit and is not one.

Verification performed for this review

Detached worktree at .ai/autoreview/state/scratch/eos-151 on refs/pull/151/head. The eos
checkout was clean before and after and was not touched. All measurements read origin/master
through git show / git ls-tree, never a working tree, so ebuild's dirty tree is irrelevant
and was not touched either. Nothing was committed or pushed.

Check Result
Do the three pinned SHAs still match origin/master? YES — eos 9ed6831, eBoot 221325c, ebuild 76970c9, unchanged since the last review. The reproduction below is therefore still a fair test.
Re-ran the document's embedded Python script at this head and diffed stdout against the recorded 18-line output block ZERO DIFFERENCES. The document's central property survives the three new commits.
grep -c 'EBLDR_BOARD STREQUAL' CMakeLists.txt on eBoot origin/master 86 ✅ matches the new note
Distinct quoted literals after EBLDR_BOARD STREQUAL 84
Occurrences of the "none" sentinel 3
Distinct board names excluding "none" 83 ✅ — 9481429's correction is right and the earlier 84 was wrong
eos/boards/*.yaml on origin/master 84 ✅ matches the hardware-alignment.md:52 note
eBoot/boards/*/ on origin/master 83
YAML stems that are also eBoot directory names 7
"EOS_PRODUCT is a free-form cache string whose accepted values are listed in its help text, not enumerated in CMake" CONFIRMEDeos/CMakeLists.txt:20 is set(EOS_PRODUCT "" CACHE STRING "Target product profile (robot|vacuum|…|fitness)"), and :25-28 only upper-cases whatever it is given and defines EOS_PRODUCT_<X>. Nothing validates the value.
Every board name in hardware-alignment.md's Architecture Alignment table, both repo columns, resolved mechanically against both repositories 16 rows; one eBoot cell does not resolve — finding 2
pytest tests/unit -q on this head PASS — 43 passed, 0.37s
Was anything weakened? No. The diff is two markdown files, +8/−2. No test, lint rule, assertion or permission is involved. git diff 6437af81..9481429d is exactly those two files, matching the body.

Architecture conformance

Conforms; unchanged from the previous review and re-checked against the new commits. §21 places
eos in Tier 1 — Foundation, and this is eos's own documentation, which is the right repository:
ebuild#109's error was correcting the vendored copy at
ebuild/core/eos/docs/three-way-alignment.md, which is pinned and therefore tripped ebuild's
vendor-drift guard. Fixing it upstream here and letting ebuild#132 revert its copy to the pin is
the correct sequence. §5.1 is not engaged — a markdown file creates no dependency edge. §22 ("Do
not market all board descriptors as equivalent hardware support") is the clause the content
serves, and the three commits extend that further into hardware-alignment.md, which was the one
file still marketing 25 descriptors as a complete, aligned inventory. §28's evidence model is
what the whole document now satisfies: the old text claimed Validated with no evidence, the new
text states what it measured, when, and against which commits — and, as of this head, every
surviving 25/25 and ✅ Aligned block in both files is preceded by a note saying what supersedes
it.

No architecture proposal appended for this PR. As last time: §22 defines five hardware support
tiers and nothing in this repository records which tier any of the 84 boards is in. That is a gap
in the repository against the design, not a gap in the design, so it belongs in an issue. §22
already says what should happen; nobody has done it. Recording it again because it is still true
and it is the most useful thing this measurement work exposes.

Proposed changes

Both one-line, neither blocking:
  docs/three-way-alignment.md:304   2026-09-15 -> 2026-09-14          (finding 1)
  docs/hardware-alignment.md:126    qemu-arm64 -> qemu_arm64          (finding 2)

Merge order: #144 first (this is stacked on it).

Separate, not this PR:
  an issue for §22 — no board in eos/boards/ is assigned a hardware support tier
  ebuild's core/UPSTREAM.yaml still pins the pre-correction copy; see below

No fix PR opened. Both findings are in lines this branch introduces or that only make sense
alongside it, so a branch cut from origin/master — what fix-start.sh produces — would either
have nothing to patch or would conflict. Both are one-character-class edits for the author.

Not checked

  • The 25-board subset tables at :142 and :176 were not re-verified row by row, nor were the
    9 shorthand exceptions the :144 note explains. The aggregate counts they sit under do reproduce.
  • docs/hardware-alignment.md was audited only for board-name resolvability and for universal
    "aligned" claims.
    Its peripheral-coverage matrix, memory-map rows and per-board checklists
    (~150 lines) were not checked against either repository. Finding 2 is what a mechanical check
    of one table found; it is not a statement that the rest of the file is correct.
  • The prose sections after ## Data Flow Alignment in three-way-alignment.md were skimmed for
    stale counts in the previous review, not audited, and I did not repeat even the skim here — the
    three new notes are where the previous skim's findings were, and they are now annotated.
  • Nothing outside docs/ was checked for stale figures. The previous review's pointer stands
    unexamined: CHANGELOG.md:68,88, CONTRIBUTING.md:168 and docs/book/README.md:19 assert "41
    product profiles" while this document measures 48 headers / 42 branches / 41 map keys. Still a
    pointer, still not a finding — "41" may be a defensible statement about PRODUCT_MAP coverage.
  • CI was not reproduced. 29 green on this head; logs not read.
  • The vendored copy is still stale, and merging this does not fix it. ebuild's
    core/UPSTREAM.yaml pins eos 5544c98, so until someone re-pins it to whatever commit this
    lands as, ebuild/core/eos/docs/three-way-alignment.md will still ship the old ✅ ALL ALIGNED
    text. Closing eos#149 here closes it for eos, not for what ebuild vendors. I did not verify
    what re-pinning would take.
  • mergeStateStatus is BLOCKEDREVIEW_REQUIRED plus the #144 stack. I did not verify
    #144 is mergeable.

Automated architecture review of 9481429d9017 — scheduled, model claude-opus-5, checked against the EmbeddedOS Master Design v2.0. Advisory only: this reviewer never approves, requests changes, or merges. Reply here to discuss or push back — a wrong finding is a bug worth reporting.

…the eBoot board as its directory

Review follow-up on embeddedos-org#151, both findings.

three-way-alignment.md:304 -- the Build System note said 2026-09-15 while
the file header and the three other supersede notes say 2026-09-14, the
date the pins at the top (eos 9ed6831, eBoot 221325c, ebuild 76970c9) were
measured against. The figures in the note were measured against that same
eBoot 221325c, so the date was the only thing wrong -- and in a document
whose argument is that every claim carries a date and a pin, a later date on
one row asks whether it was measured against something newer. Now 09-14.

hardware-alignment.md -- the Architecture Alignment table (:128) named the
eBoot board qemu-arm64; the directory is boards/qemu_arm64/. The cell now
says qemu_arm64 and notes that the eos side is qemu-arm64.yaml, since the
hyphen/underscore split is the reason only 7 of 84 names match across the
repos. The Detailed Board Inventory (:101) listed the same board as
`qemu-arm64/` in directory form, the only entry in that column that does not
resolve; fixed to `qemu_arm64/` for the same reason. `qemu-arm64.yaml` at :71
is the eos YAML and stays as it is.

Verified: every eBoot-column entry in the inventory table now resolves to a
directory under eBoot/boards/; the embedded script re-run still matches its
recorded 18-line block byte for byte; pytest tests/unit 43 passed.
@Kartikey1306

Copy link
Copy Markdown
Contributor Author

Both addressed at ad8ea82.

Finding 1three-way-alignment.md:304 now says 2026-09-14, matching the file header and the other three notes. Your reasoning is the reason it mattered: the figures were measured against the same eBoot 221325c the pins name, so the date was the one thing that could make a reader doubt that.

Finding 2hardware-alignment.md:128 now reads qemu_arm64 (eos: qemu-arm64.yaml — names differ), as you suggested. While checking that the whole column resolves, the Detailed Board Inventory at :101 had the same board as `qemu-arm64/` in directory form — the only entry in that column that does not exist under eBoot/boards/ — so it is `qemu_arm64/` there too. :71 (qemu-arm64.yaml, the eos side) is correct and unchanged.

Verified at ad8ea82, this shell: every eBoot-column entry in the inventory table resolves to a directory under eBoot/boards/ (none missing); the embedded script re-run still matches the recorded 18-line block byte for byte; pytest tests/unit -q → 43 passed.

Range for this round: 9481429..ad8ea82, two files, +3/−3. Merge order unchanged — #144 first. The §22 tier issue and ebuild's core/UPSTREAM.yaml pin stay separate, as you listed.

Kartikey1306 added a commit to Kartikey1306/eos that referenced this pull request Sep 15, 2026
…he key a device needs

Review follow-up on embeddedos-org#152. This PR opted the two CI builds of eBoot into
the development key ahead of eBoot#122's gate; the review measured that
eBoot#122 has since moved to exempt only Debug and refuse an unset
CMAKE_BUILD_TYPE, so the eight documented `cmake -B ... -DEBLDR_BOARD=<real
board>` commands in this repository -- none of which set a build type --
stop working the day it merges. CI and the docs break for one reason; only
CI had been fixed.

Seven development snippets (GETTING_STARTED.md:249, integration-guide.md:85
and :194, adding-hardware.md:134, three-way-alignment.md:209,
DEPLOYMENT.md:182, ch17-eboot.md:92) now pass -DCMAKE_BUILD_TYPE=Debug: a
reader following the guide is doing a development build, and Debug is what
the gate exempts. The one deployment snippet (DEPLOYMENT.md:133, "flash
eBoot first") says what a device image actually needs instead --
-DEBLDR_PRODUCTION_KEY=<64 hex characters: your Ed25519 public key> -- since
a Debug build is not what goes on a device. DEPLOYMENT.md:177 uses
EBLDR_BOARD=none and is exempt as it was.

Measured, not read, against both trees with configure-only runs:
  GETTING_STARTED.md:249 verbatim   eBoot master 682d005 rc=0   eBoot#122 1cd1265 rc=1
  ... + -DCMAKE_BUILD_TYPE=Debug     master rc=0                embeddedos-org#122 rc=0
  DEPLOYMENT.md:133 + a real Ed25519 public key (openssl genpkey)
                                    master rc=0                embeddedos-org#122 rc=0,
                                    "Trust anchor: production key from EBLDR_PRODUCTION_KEY"
so every edit is valid on today's master and this can land before eBoot#122.
A 64-character dummy is refused by cmake/ProductionKey.cmake ("not a usable
Ed25519 public key"), which is why the placeholder says what the key is.

The review's own sweep, re-run: no `cmake -B ... -DEBLDR_BOARD=<board>` in
any .md is left without a build type or a key within its command.
pytest tests/unit 43 passed. three-way-alignment.md:209 is the same line in
embeddedos-org#151's rewrite of that file, so whichever of embeddedos-org#151/embeddedos-org#152 lands second rebases
without conflict.

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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs/three-way-alignment.md asserts ✅ Aligned for board inventories that disagree (84 vs 83 vs 14/136)

2 participants