docs: hand the landing-page role from the README to maka.apache.org - #4686
docs: hand the landing-page role from the README to maka.apache.org#4686Astro-Han wants to merge 15 commits into
Conversation
Since #4660 the website is the landing page and the downloads path, but both READMEs still ran 290 lines as landing page, install guide and architecture summary, and opened with a different sentence from the site and the repository description. The READMEs and the .asf.yaml description now open with the sentence settled in #4307; "Why Maka", "Surfaces" and "Current capabilities" become one section of three paragraphs that link the site, ARCHITECTURE.md and docs/README.md; "Releases and downloads" becomes "Get Maka" with the same three labelled paths as the downloads page, and the requirements, start and first-run steps move under "Build from source". The website test now asserts the three surfaces carry the sentence, and the CI planner runs the website workspace for README changes so that check has teeth. The hero is one text-free image for both languages, generated with Codex's image tool from a text prompt in the mascot's existing style, replacing the two per-language images that baked in the old tagline. The provenance record lists the new file and how it was made. Committing this showed that the pre-commit Biome check from #4132 could not commit a binary or a Markdown file: it pipes every staged blob through git show and Biome with Node's default 1 MiB buffer, Biome rejects stdin that is not UTF-8, and for a language it parses without formatting it echoes nothing, which the hook read as unformatted. Binaries are skipped by git's NUL-byte heuristic, an empty echo is treated as no handler, and the buffer limits are lifted. Refs #4684 Generated-by: Claude Code
The mascot illustration did not look like the site the README now hands off to, so the hero is rendered from the built website instead: website/scripts/readme-hero.mjs screenshots the homepage headline and the RuntimeEvents scene per language and colour scheme, and the READMEs pick light or dark with a picture element. The generated illustration is removed and the provenance record says the heroes are renders of the site's own copy and styles, not generated art. The Website and Downloads links become badges in the style of the row above them, and "What Maka is" goes back to four short bullets and one linking sentence; the three dense paragraphs read worse than the list they replaced. Generated-by: Claude Code
The hero image already carries the headline, so the bold sentence and lede above it were the same words twice. The header is now title, badges and hero; the positioning sentence and lede open "What Maka is" as text, and the bullets restate the site's four claims (measured, log is the runtime, local machine and own model, one Runtime Host) instead of the local-first list the old README led with. Generated-by: Claude Code
Desktop Nightly has published macOS arm64 and x64, Windows x64 and Linux x64 and arm64 builds for some time, but the README and the website's three platform lines still said Apple Silicon only with a Windows preview; both now name the full matrix, with Windows and Linux as unsigned previews. ARCHITECTURE.md links four deep dives, not six, so the README stops counting them, and the repository layout gains the native/, skills/, patches/ and experiments/ directories it omitted. Generated-by: Claude Code
They were asked to look like the badges above them, but for-the-badge is a different shape: taller, uppercase and letter-spaced, so the header read as two unrelated badge styles stacked. Use the same flat style and accent colour as the row above. Generated-by: Claude Code
The heading already carries "(Incubating)" and the note right below it is the Incubator disclaimer in full, so the line between them said the same thing a third time. Generated-by: Claude Code
The header put seven badges of repository facts above the two links a reader actually came for, so the rows ran wide then short and the order said the facts mattered more. Put the site, the downloads page and the other language first, and the facts underneath in the muted colour. The three per-platform badges become one that names the platforms. The architectures and the unsigned-preview status they carried are stated under "Get Maka" and on the downloads page, so the header no longer has its own copy to keep current. Generated-by: Claude Code
Seven lines of incubation disclaimer sat between the hero and the first sentence about what Maka is, so a reader met the legal text before any content. Both notices move to the end, next to the licence and trademark paragraphs they belong with. The text is unchanged and the incubation disclaimer stays on the site footer, where the Incubator asks for it. The Chinese carried translations rather than sentences: "candidate criteria" had become 候选契约, "secrets" 秘密, "live record" 活记录, "hit the model" 打模型, and "one execution authority" 执行权威. Prompt now reads as prompt, matching the site copy. Generated-by: Claude Code
MicroGery
left a comment
There was a problem hiding this comment.
The README handoff is directionally right; this is a maintainability concern about the new derived assets.
| "preview": "astro preview", | ||
| "test:dist": "astro build && node --test test/site.test.mjs" | ||
| "test:dist": "astro build && node --test test/site.test.mjs", | ||
| "readme-hero": "astro build && node scripts/readme-hero.mjs" |
There was a problem hiding this comment.
Could we give this generator a reproducible contract, or avoid committing the rendered derivatives? It launches Chromium, but neither npm ci nor the README-triggered website lane installs a Playwright browser, and CI neither runs this command nor checks that the four committed PNGs still match the site. A clean checkout therefore has no declared regeneration path, while later website changes can leave the README hero stale. Please either document/automate the browser-install and regeneration or drift check, or simplify/remove the generated-hero path.
There was a problem hiding this comment.
Good catch, thank you — you're right that a clean checkout has no declared way to regenerate these.
Two changes coming: the script installs its own Chromium when there isn't one, so npm --workspace @maka/website run readme-hero works straight after npm ci; and it writes a manifest of the text it bakes into the images, which the website test compares against the site copy, so a copy change that leaves the hero stale fails CI without a browser or a pixel diff.
Style-only drift stays uncaught — hashing the CSS would mean a Chromium download on every unrelated tweak. Say the word if you'd rather draw the line elsewhere.
There was a problem hiding this comment.
Done in 48f45f9fbf.
The script fetches a Chromium when there isn't one, so your reproduction now works: PLAYWRIGHT_BROWSERS_PATH=/tmp/empty npm --workspace @maka/website run readme-hero downloads the browser and writes the four images.
For drift it records the hero copy it screenshotted in .github/assets/readme-hero.json, and the site test recomputes that text from the built pages, failing with the command to run. Both sides use the same extractor, so it needs no browser and compares text, not pixels. Changing a hero string and rebuilding fails the test; regenerating passes it.
jackwener
left a comment
There was a problem hiding this comment.
I reviewed exact head a752b040df133acca4e93d18fc28fe52dbab6f7c. One P2 and one P3. No P0 or P1.
The documentation work checks out. I verified the three corrected claims against the repository rather than the description: the Nightly workflow really does publish macOS arm64 and x64, Windows x64 and Linux x64 and arm64, with macOS signed and notarised and the other two unsigned previews; ARCHITECTURE.md and its Chinese mirror link four deep dives, not six; and native/, skills/, patches/ and experiments/ all exist. Both READMEs keep the same thirteen sections in the same order, and their local links resolve. The .asf.yaml change is the description only, matching the site and README sentence verbatim.
Dropping the release wording from the top of the README worried me until I read where it went: "Get Maka" still states that no Apache release exists, that the signed source archive will be the official release and packages elsewhere are convenience artifacts, and it still links ASF_SOURCE_RELEASE.md. The Nightly line is now more explicit than what it replaced — it adds "not intended for production use" alongside the corrected platform matrix.
The hook fix also has teeth where it matters. On main, a 2 MiB PNG throws ENOBUFS and a Markdown file fails outright; on this head both pass. A 2 MiB unformatted JavaScript file with no NUL still reaches Biome and is still rejected.
P2 — the NUL heuristic lets a legitimate source file skip the formatter
scripts/biome-staged-check.mjs:45-53 scans the whole blob for 0x00 and skips the file before it looks at the path or the handler. That is broader than "binary".
Staging a valid but unformatted valid.js with a single NUL byte inside a string literal: node --check returns 0, Biome returns 0 and rewrites the 26 bytes into a different 33, so it is a formatter-owned source file that needs formatting. The old hook on main returns false for it. This head returns true — the file is skipped entirely.
A second shape reaches the same place: a UTF-16 encoded JavaScript file contains NUL bytes by construction, so it is skipped too. The opposite direction is fine — a NUL-free file with invalid UTF-8 still fails, because Biome rejects the stdin.
So the change delivers "binaries can be committed" for the common case of NUL-containing binaries, but it buys that by letting any file with a NUL byte past the gate. Hosted CI is still a backstop, which is why this is not a P1.
The new test does not cover it: it stages a zero-filled 2 MiB buffer, which is both large and NUL-bearing, so it exercises the intersection of the two fixes rather than either one alone. Neither "no NUL, over 1 MiB" nor "small, valid source containing a NUL" is tested.
Fix: make the NUL signal conditional on the path or handler, so a file the formatter owns is never skipped on that byte alone, and add a valid-source-with-NUL regression.
P3 — the buffer limit is now unbounded rather than raised
Both maxBuffer values are Number.POSITIVE_INFINITY, and git show reads the entire blob into memory before the NUL check runs. That replaces a hard failure over 1 MiB with no ceiling at all. This is a local developer path and recoverable, so it does not rise higher — but "lift the limit" and "remove the limit" are different fixes, and only the second one is what landed.
On the hero images
There is an unresolved inline thread on this already, and I reproduced its substance independently, so I will not restate it as a finding: after npm ci, readme-hero only runs if a Chromium happens to be in the global cache — pointing PLAYWRIGHT_BROWSERS_PATH at an empty directory makes it fail asking for npx playwright install. A README-only change plans just the website tests, and CI neither runs readme-hero nor compares the four committed PNGs against a fresh render. So site copy or styles can change, everything stays green, and the committed heroes quietly go stale. Worth closing that thread one way or the other before merge.
Also worth a line
The Incubator disclaimer wording differs between surfaces: both READMEs say "sponsored by the Apache Incubator PMC", the website says "sponsored by the Apache Incubator". This is pre-existing on main, not introduced here — but this PR is already editing that block, so it is a cheap moment to make the two agree.
Checks
The required test job is red on a Desktop E2E case this PR does not touch (104 pass / 4 skip / 1 fail); main's latest test is green and that case passes on its own against this head, so it does not attribute here — but a red required check is still a hard gate. audit failed separately on an npm registry HTTP 503. The synthetic merge against current main is clean, and the 124 files main brings in have zero path overlap with this PR's 20.
简体中文
我审的是 a752b040df133acca4e93d18fc28fe52dbab6f7c。一条 P2、一条 P3,没有 P0/P1。
文档这部分是站得住的。那三条被修正的声明,我是对着仓库核的而不是对着描述:Nightly 工作流确实发布 macOS arm64 与 x64、Windows x64、Linux x64 与 arm64,其中 macOS 有签名并公证,另两个是无签名预览;ARCHITECTURE.md 及其中文镜像链接的是四篇深度文档,不是六篇;native/、skills/、patches/、experiments/ 都存在。中英两份 README 保持十三个同序章节,本地链接均可解析。.asf.yaml 只改了描述,与网站和 README 的那句逐字一致。
README 顶部那段发布声明被删,一度让我担心,直到我看清它去了哪里:「Get Maka」里仍然写明尚未发布 Apache release、签名源码包才是正式发布、别处分发的是便利产物,也仍然链接 ASF_SOURCE_RELEASE.md。而 Nightly 那一行比它替换掉的更明确——在修正过的平台矩阵之外,新增了「不适用于生产环境」。
hook 的修复在要紧处也确实有牙齿:在 main 上,2 MiB 的 PNG 会抛 ENOBUFS,Markdown 直接失败;在这个 head 上两者都能通过。而一个 2 MiB、不含 NUL、未格式化的 JavaScript 仍然会进入 Biome 并被拒绝。
P2:NUL 判据会让一个合法源文件跳过格式化检查
scripts/biome-staged-check.mjs:45-53 扫描整份 blob 找 0x00,并且在查看路径或 handler 之前就跳过该文件。这比「二进制」宽得多。
暂存一个合法但未格式化的 valid.js,在字符串字面量里放一个 NUL 字节:node --check 返回 0,Biome 返回 0 并把 26 字节重写成不同的 33 字节——所以它是一个归 formatter 管、且确实需要格式化的源文件。main 上的旧 hook 对它返回 false。这个 head 返回 true,文件被整个跳过。
还有第二种形态会落到同一处:UTF-16 编码的 JavaScript 天然含 NUL 字节,同样会被跳过。反方向是好的——不含 NUL 但 UTF-8 非法的文件仍然失败,因为 Biome 会拒绝该 stdin。
所以这个改动为「含 NUL 的常见二进制」实现了「二进制可以提交」,代价是让任何含 NUL 字节的文件都越过了这道门。托管 CI 仍是兜底,所以不定 P1。
新增的测试覆盖不到它:它暂存的是一个全 0 的 2 MiB 缓冲区,既大又含 NUL,所以练到的是两处修复的交集,而不是其中任何一处单独的行为。「无 NUL 且超过 1 MiB」和「小体积、合法、含 NUL 的源文件」都没有被测到。
修法:让 NUL 信号与路径/handler 判断合用,使 formatter 管辖的文件不会仅凭一个字节被跳过,并补一条「合法源文件含 NUL」的回归用例。
P3:缓冲上限不是被调高,而是被取消了
两处 maxBuffer 都是 Number.POSITIVE_INFINITY,而且 git show 在 NUL 检查运行之前就把整份 blob 读进了内存。这把「超过 1 MiB 硬失败」换成了完全没有上限。这是本地开发者路径且可恢复,所以不再往上定级——但**「放宽上限」和「取消上限」是两种不同的修法,落地的是后者**。
关于 hero 图
这上面已经有一条未解决的 inline 讨论,而且我独立复现了它的实质,所以不再把它作为一条 finding 重述:npm ci 之后,readme-hero 只有在全局缓存里恰好存在 Chromium 时才跑得起来——把 PLAYWRIGHT_BROWSERS_PATH 指向一个空目录,它就会失败并要求 npx playwright install。而仅改 README 的变更只会规划 website 测试,CI 既不运行 readme-hero,也不把已提交的四张 PNG 与新渲染做比较。于是网站文案或样式改动之后,一切照样全绿,而提交进来的 hero 悄悄过时。 合并前把那条讨论按某种方式了结掉是值得的。
另外值得一行
Incubator disclaimer 的措辞在不同位置不一致:两份 README 写的是「sponsored by the Apache Incubator PMC」,网站写的是「sponsored by the Apache Incubator」。这在 main 上就已存在,不是这次引入的——但这个 PR 本来就在改那一段,所以这是一个很省事的时机,把两者统一。
检查
必需的 test 任务红在一个本 PR 未触及的 Desktop E2E 用例上(104 通过 / 4 跳过 / 1 失败);main 最新的 test 是绿的,而且该用例在这个 head 上单独跑是通过的,所以归因不到这里——但一个红色的必需检查仍然是硬门禁。audit 是另外因为 npm registry 返回 HTTP 503 而失败。与当前 main 的合成合并树是干净的,main 带入的 124 个文件与本 PR 的 20 个文件路径零重叠。
Automated review notice: This comment was posted by an automated review agent operated by jackwener. It is not an independent human review and does not replace one.
…olding a NUL Skipping on a NUL byte was wider than "binary": a source file with a NUL inside a string literal, or a UTF-16 encoded one, is a file Biome formats, and the hook waved it through. Biome's actual limit is that it reads stdin as UTF-8, so skip a blob that does not decode as UTF-8 and leave every file the formatter owns inside the check. The buffer limit was removed rather than raised, and git show read the whole blob before anything looked at it. Ask git for the blob size first and skip past a ceiling no formatted file reaches. Generated-by: Claude Code
The site said "sponsored by the Apache Incubator" while DISCLAIMER-WIP and both READMEs said "sponsored by the Apache Incubator PMC", so the project published two wordings of the same required paragraph. The site test now reads the paragraph out of DISCLAIMER-WIP instead of holding a copy, which leaves one place to change it. Generated-by: Claude Code
|
Both findings were right, and both are fixed in P2. The NUL scan was the wrong predicate. Biome's actual limit is that it reads stdin as UTF-8 and errors on anything else, so the hook now skips a blob that does not decode as UTF-8 and leaves every file the formatter owns inside the check. P3. The limit is stated rather than removed: The coverage gap is closed too. Three tests now separate the two fixes instead of exercising their intersection:
Against On the disclaimer wording. Taken, in On the hero images. Being answered on MicroGrey's thread, where the substance is. On the checks. |
The header used two blues, one for the links and a lighter one for the repository facts, so neither read as the primary colour. Keep the blue for the row a reader clicks and make the facts underneath neutral grey. Generated-by: Claude Code
…t check npm ci installs the Playwright package but no browser, so the documented command only ran where a Chromium happened to be cached; pointing PLAYWRIGHT_BROWSERS_PATH at an empty directory made it fail. It now fetches one when there is none, so a clean checkout can regenerate the images. Nothing said when the committed heroes stopped matching the site either. The render records the hero copy it screenshotted beside the images, and the site test recomputes that text from the built pages and fails with the command to run. Both sides derive it with the same function, so the check needs no browser and compares text rather than pixels. A style-only change to the hero still goes unnoticed: hashing the stylesheet would mean a browser download on every unrelated tweak. Generated-by: Claude Code
The positioning sentence was baked into the hero PNG, so the one line that says what Maka is could not be copied, searched, translated or read by a screen reader as text. It is now README text under the title, and the image carries only the RuntimeEvents timeline it was always about. The links a reader clicks were badges too, which read as project metadata rather than navigation. Website, docs, downloads and the other language are plain links; the stars badge keeps its number and the licence and platforms become a quiet line beside it. DeepWiki moves to Documentation, where a third-party source sits better than in the first screen. Generated-by: Claude Code
Moving the sentence out of the image dropped it to body text, so the first screen lost the line that carries the project. It is a centred heading now, and the three facts beside it go back to badges, matching the layout the review sketched: identity, one sentence, navigation, metadata, timeline. Generated-by: Claude Code
|
Thank you — this is exactly the read I needed, and the first point especially. Baking the positioning sentence into a raster asset meant the one line that says what Maka is could not be copied, searched, translated or read as text, and I had no good answer for that. All six are in, and your mock is what I built against:
One deliberate difference from the mock: the heading carries the full sentence, "Apache Maka (Incubating) is a high-performance agent workspace that keeps a complete record of everything it did.", rather than the shortened site headline. #4307 settled that one sentence for the README, the homepage and the repository description, and a test checks the three agree. Using the short form here would mean repeating the full one a few lines later in "What Maka is", which is the duplication this PR set out to remove. The timeline itself is untouched, as you suggested. |
hqhq1025
left a comment
There was a problem hiding this comment.
Reviewed exact head 883b525274039260ee1cd6ce4828514ecaa7017a.
No actionable findings. This revision is ready to merge.
The PR correctly addresses two related maintenance problems: it refreshes the README and website presentation around Maka's RuntimeEvents model, and it makes the staged Biome check tolerate binary and large blobs without allowing formatter-owned source to bypass validation. The implementation follows the actual ownership boundaries: README hero copy is derived through the website extractor and checked by the website test, while staged blobs are size-bounded and decoded before Biome receives source text.
The earlier review concerns are closed in the current code:
- formatter-owned source containing NUL bytes is still checked;
- large blobs are bounded at 16 MiB instead of using an unlimited child-process buffer;
- small binary and large source cases have separate regression coverage;
- the hero generator can provision Chromium from a clean install;
- the committed hero manifest is checked against current built-page copy.
I also inspected all four committed English/Chinese light/dark hero images. They render at 2400x768 with complete content and no visible clipping, overlap, or blank output.
The problem definition and solution are consistent with first principles and Occam's razor. I found no production code or tests that should be deleted, and no deeper refactor is warranted. The remaining accepted risk is that style-only hero drift is not detected automatically; copy drift is covered, and avoiding a browser-backed pixel regeneration in normal CI is a reasonable boundary for this documentation asset.
Local verification:
node --test scripts/biome-staged-check.test.mjs scripts/ci-test-plan.test.mjs scripts/ci-workflow-policy.test.mjs— 83 passednpm --workspace @maka/website run test:dist— build succeeded, 10 passed- targeted
npx biome checkon changed text files — passed git diff --check— passed- GitHub checks — all completed successfully or skipped as intended
|
Updating my earlier findings against the current head The NUL bypass is closed for UTF-8 sourcesRe-running the same probe: a valid, unformatted That was the substance of the P2, and it is genuinely fixed. What remains: two shapes still skip the gate silentlyUTF-16 with a BOM. Without a BOM, a UTF-16 LE file decodes as UTF-8 (ASCII interleaved with Anything over 16 MiB. This is where my earlier P3 changed character rather than closing. I reported it as "the limit was removed rather than raised", a local memory concern. A ceiling now exists — but the far side of the ceiling is "Add a limit" and "add a limit and fail when it is exceeded" are different fixes, and only the first one landed. For both shapes, failing closed — refusing the commit with a message naming the file and why it could not be checked — keeps the availability goal while leaving no silent hole. That reads to me as the same correction in both places: the escape hatch should be loud. Neither rises to P0/P1: both need an unusual file to reach, and hosted CI still formats. But they are worth closing together, because they are now the only two ways a staged file leaves this gate unexamined without anyone being told. Evidence boundary: these are runs of 简体中文针对当前 head NUL 绕过:对 UTF-8 源文件已经关闭 用同一个探针重跑:一个合法、未格式化、字符串字面量里带原始 那正是那条 P2 的实质,它确实被修好了。 仍然存在的:两种形态依然会静默跳过这道门 带 BOM 的 UTF-16。 不带 BOM 时,UTF-16 LE 文件能按 UTF-8 解码(ASCII 与 任何超过 16 MiB 的文件。 这正是我先前那条 P3 改变性质、而非关闭的地方。 我当时报的是「上限不是被调高而是被取消了」,那是一个本地内存层面的担心。现在上限有了——但上限的另一侧是 「加一个上限」和「加一个上限并在超限时失败」是两种不同的修法,落地的只有前者。 对这两种形态,fail closed——拒绝提交,并给出一条指明文件和「为什么无法检查」的消息——既保住了可用性目标,又不留下静默的口子。在我看来这两处是同一个修正:逃生口应该是响的。 两者都到不了 P0/P1:都需要一个不寻常的文件才能触及,而且托管 CI 仍会格式化。但值得一并关掉,因为它们现在是「一个暂存文件不被检查、而且没人被告知」的仅有两条路径。 证据边界:这些是在这个 head 上对
|
The ceiling skipped anything above it, so an oversized source file left the formatter gate without anyone being told. Only an asset may pass that way: git already decides which staged blobs are binary, so ask it, skip those and refuse the commit for the rest with a message naming the file and the size. Generated-by: Claude Code
|
Taken on the ceiling, in It now asks git which staged blobs are binary — I did not make the undecodable path fail closed, and I don't think it should. Every image commit takes that exit: a PNG is exactly a blob Biome cannot read. Refusing there brings back the bug this branch started from. To fail closed only for the files the formatter owns, the hook would have to carry its own table of formatter-owned extensions — a second copy of a decision Biome already makes from On UTF-16 with a BOM specifically: git calls such a file binary, as it does a PNG — |
Astro-Han
left a comment
There was a problem hiding this comment.
Reviewed current head f86e6d8d96f12a7078da32590bb45923db56843d (OPEN, MERGEABLE). NO-GO — one new P2 below; the docs-side facts checked on the previous head still hold and are not repeated here.
P2 (new regression) — oversized valid-UTF-8 sources containing NUL are silently skipped as binary
scripts/biome-staged-check.mjs:45-69,96-102: binaryStagedPaths() relies on git diff --numstat -z emitting -\t-, but git marks a .js source containing NUL as binary; a subsequent binary.has(path) then just continues. Reproduced on this head in a scratch repo: a 2071-byte valid UTF-8 huge.js containing const value = "\0" yields -\t-\thuge.js with maxBytes: 1024 and the function returns true (skipped); with the limit at 4096, Biome reports it unformatted (function returns false). This contradicts the contract already established in scripts/biome-staged-check.test.mjs:76-84 (NUL-bearing sources must be checked) and bypasses this change's own "stop oversized text at commit" protection.
Suggested fix: do not use git's NUL-binary heuristic as the sole source/asset authority for oversized files — classify Biome source extensions independently (or fail closed on oversized NUL-bearing files not explicitly allowed), and add a regression test with an oversized valid-UTF-8 NUL-bearing JS file.
What was checked on this head
Delta scope only (staged-check commits on top of the verified baseline): current staged-check plus CI planner tests 45/45, website test:dist 10/10, format:check over 1919 files, lint over 3213 files, git diff --check — all pass. What I could not judge: concurrent-write pressure during the check itself was not run.
Automated review notice: This comment was posted by an automated review agent operated by Astro-Han. It is not an independent human review and does not replace one.
简体中文
本条结论全部来自 @未开智选手 的审查。我自己没有读这份 diff;我核的是当前 head 有没有漂移、以及 exact-head 的 CI 状态。当前 head 是 f86e6d8,可合并。P2 是新增回归:含 NUL 的合法大源文件会被当二进制静默跳过。修好再合。

Summary
Since #4660 the website is the landing page and the downloads path, but both READMEs still ran 290 lines as landing page, install guide and architecture summary, and opened with a different sentence from the site and the repository description.
README.md,README.zh-CN.mdand the.asf.yamldescription carry the sentence settled in [DISCUSS] Rebuild the Maka website and project narrative #4307. The header is title, badges and hero; the hero carries the headline, so the sentence and lede appear once, as text opening "What Maka is". That section replaces "Why Maka", "Surfaces" and "Current capabilities" with the site's four claims (measured not claimed, the log is the runtime, your machine and your model, one Runtime Host) and a sentence linking the site andARCHITECTURE.md. "Releases and downloads" becomes "Get Maka" with the same three labelled paths as the downloads page and links there instead of to GitHub Releases. Requirements, start and first run move under "Build from source". Website and Downloads are badges in the style of the row above them. The rest of the README is unchanged apart from awebsite/line in the layout and a website link in Documentation. Both languages stay section-for-section identical.website/scripts/readme-hero.mjs(run withnpm --workspace @maka/website run readme-hero) builds the site and screenshots the homepage headline and RuntimeEvents scene per language and colour scheme into.github/assets/readme-hero.*.png, and the READMEs pick light or dark with a<picture>element. The two per-language illustrations that baked in the old tagline are removed, anddocs/code-origin-audit.mdnow records that the heroes are renders of the site's own copy and styles rather than generated art.ARCHITECTURE.mdlinks four deep dives, not six, so the README stops counting; and the repository layout gainsnative/,skills/,patches/andexperiments/.website/test/site.test.mjsasserts the two READMEs and the description carry the sentence, and the CI planner runs the website workspace for a README change so the check runs when it matters..asf.yamlkeeps its existing release-contract lane.git showand Biome with Node's default 1 MiB buffer, Biome rejects stdin that is not UTF-8, and for a language it parses without formatting it echoes nothing, which the hook read as unformatted. Binaries are now skipped by git's NUL-byte heuristic, an empty echo is treated as no handler, and the buffer limits are lifted, with a test for each.Fixes #4684
Verification
npm --workspace @maka/website run test:dist: 9/9, including the new cross-surface sentence test.npm --workspace @maka/website run readme-hero: writes the four PNGs above from the built site.node --test scripts/ci-test-plan.test.mjs scripts/ci-workflow-policy.test.mjs scripts/biome-staged-check.test.mjs: 80/80. The new planner test and the hook's binary and Markdown cases fail onmain; the first two commit attempts of this branch failed on exactly those two hook paths.npm run format,npm run lint,npm run check:asf-headers: clean.AI use
Select exactly one:
Tool(s) and scope: Claude Code set the section skeleton, wrote the render script, the tests, the planner and hook changes and this description; Gemini 3.8 Flash (Antigravity CLI) drafted the README prose from that skeleton, which I then corrected against the site copy and cut back to bullets. I reviewed every line of both READMEs.
Checklist
Does this PR entail a change in behavior?