docs(alignment): replace the ✅ Aligned table with measured inventories - #151
Kartikey1306 wants to merge 13 commits into
Conversation
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
left a comment
There was a problem hiding this comment.
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
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
:142and:176were not re-verified row by row. The note
at:144asserts "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.mdwas 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(:228onward — Verification Checklist,
Build System Alignment, Cross-Linking Verification, Coding Convention Alignment) were skimmed
for stale counts, not audited.:342and:386are what that skim found; there may be more. - Nothing outside
docs/was checked for stale figures. A quick grep found41 product profilesasserted inCHANGELOG.md:68,88,CONTRIBUTING.md:168anddocs/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
aboutPRODUCT_MAPcoverage — so this is a pointer, not a finding. - CI checks were not reproduced. 29 green on this head; logs not read. The
assignjob
showsskipping, 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-pinscore/UPSTREAM.yaml, ebuild's
vendoredthree-way-alignment.mdwill still be the old✅ ALL ALIGNEDtext. 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.
|
Both findings addressed at Finding 1 — Finding 2 — the body was wrong, not the file; corrected both ways. Verified at Not done here, as agreed: the §22 hardware-tier issue is separate. Merge order unchanged: #144 first; review |
|
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
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.
|
Correction to my reply above, visible rather than silent: the head is now
Verified at |
srpatcha
left a comment
There was a problem hiding this comment.
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-15 → 2026-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-arm64 → qemu_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" |
CONFIRMED — eos/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
:142and:176were not re-verified row by row, nor were the
9 shorthand exceptions the:144note explains. The aggregate counts they sit under do reproduce. docs/hardware-alignment.mdwas 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 Alignmentinthree-way-alignment.mdwere 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:168anddocs/book/README.md:19assert "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 aboutPRODUCT_MAPcoverage. - 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.yamlpins eos5544c98, so until someone re-pins it to whatever commit this
lands as,ebuild/core/eos/docs/three-way-alignment.mdwill still ship the old✅ ALL ALIGNED
text. Closing eos#149 here closes it foreos, not for whatebuildvendors. I did not verify
what re-pinning would take. mergeStateStatusisBLOCKED—REVIEW_REQUIREDplus 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.
|
Both addressed at Finding 1 — Finding 2 — Verified at Range for this round: |
…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.
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.mdsaid "✅ ALL ALIGNED" and, for board definitions, "25 YAML files ineos/boards/| 25 board ports ineboot/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 copycore/eos/docs/three-way-alignment.md, pinned to eos5544c98, 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⚠️ where inventories disagree or nothing compares them, and ✅ only where a comparison was actually made. Headlines:
origin/masterof eos (9ed6831), eBoot (221325c) and ebuild (76970c9), and the table now shows measured numbers withboards/*.yaml; eBoot 83boards/*/= 83eboot_add_board()calls; ebuildTARGET_ARCH14,EBOOT_BOARD14,MCU_TO_EBOOT_BOARD136 keys (56 distinct eboot dirs; 27 eboot dirs never targeted);EOS_BOARD_MAP116 keys (81 distinct eos YAMLs; 3 never mapped)PRODUCT_MAPkeys — seven headers with no map entryEOS_ENABLE_*defines; acrossebuild/**/*.py29 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 filesebuild/templates/templates/at the ebuild root; eos names four of them by theirebuild new --templatespelling, all of which exist; eBoot names noneComponentDBdocstring's 200+ is 114A
## How this was measuredsection 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/unit43 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⚠️ with the measurement date (:390–391).
EBLDR_BOARD STREQUALbranches naming 83 distinct boards, the sentinel"none"appearing three times) andeboot CMakeLists.txt Board Coverage (25/25)(:344). The Documentation Alignment section carries no note; instead the two rows that graded this file andhardware-alignment.mdas fully aligned are re-gradeddocs/hardware-alignment.md:51carries 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