site/org: the .org pages in the starshipos-f18.com look
Build / v4 tests (32- and 64-bit cells) (push) Successful in 13m44s
Build / Image RASPI (push) Successful in 2m43s
Build / Image PC (push) Successful in 2m55s
Build / Image MILKV (push) Successful in 2m55s

Captain Bob, 2026-11-07: style .org like the StarshipOS.com design canvas.
build.py makes the three pages from one source, as {{html}} blocks in the
canvas's look (navy, orange accent, JetBrains Mono and Exo 2), and the same
pages as the canvas's .org artboards.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
This commit is contained in:
Claude
2026-11-07 11:36:09 +00:00
parent 51dd4a8391
commit 6f14d8d6bc
5 changed files with 522 additions and 126 deletions
+54 -37
View File
@@ -1,37 +1,54 @@
= Admin Dashboard =
{{info}}
Only the project's administrator can see this page (its space's rights: view and edit, ##XWiki.rajames## alone).
{{/info}}
== CI ==
|=Workflow|=Status|=Runs
|Acceptance -- the gate on every PR into master|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/acceptance.yml/badge.svg]]|[[runs>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=acceptance.yml]]
|Build -- the quick check on StarForth-v4.0.0|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/build.yml/badge.svg?branch=StarForth-v4.0.0]]|[[runs>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=build.yml]]
|Nightly -- acceptance, images to Nexus, proofs (03:00 UTC)|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly.yml/badge.svg?branch=master]]|[[runs>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=nightly.yml]]
|Nightly documents (04:00 UTC)|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly-docs.yml/badge.svg?branch=master]]|[[runs>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=nightly-docs.yml]]
|Runner image|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/runner-image.yml/badge.svg?branch=master]]|[[runs>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=runner-image.yml]]
|Release (a v<version> tag)|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/release.yml/badge.svg]]|[[runs>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=release.yml]]
== Work ==
* [[Open pull requests>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/pulls?state=open]]
* [[Open issues>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open]] -- [[in progress>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=23]], [[blocked>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=20]], [[needs acceptance>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=21]]
* [[Milestones>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/milestones]] and [[the project board>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/projects]]
* [[Branch protection and secrets>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/settings/branches]] -- ##master##: no pushes, merges only after Acceptance
* [[Actions secrets>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/settings/actions/secrets]] -- ##NEXUS_CI_PASSWORD##, ##PACKAGES_TOKEN##, ##CAPSULE_SIGN_KEY##
* [[Runners>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/settings/actions/runners]]
* [[Access tokens>>https://gitea.starshipos-f18.org/user/settings/applications]] -- revoke what a session no longer needs
== Artifacts ==
* [[Nexus: org.starship snapshots>>https://nexus.starshipos-f18.org/#browse/browse:starshipos-snapshots:org%2Fstarship]] -- ##kernelImage## (##pc##, ##raspi5##, ##milkv##, ##logs##), ##documentation## (##book##, ##vol1##-##vol3##, ##api##)
* [[Nexus: releases>>https://nexus.starshipos-f18.org/#browse/browse:starshipos-releases:org%2Fstarship]]
* [[Container images>>https://gitea.starshipos-f18.org/rajames/-/packages]] -- ##lithosananke-runner##, the CI runner image
== Sites ==
* [[starshipos-f18.com>>https://starshipos-f18.com/]] -- the public face, and [[Try it>>https://starshipos-f18.com/bin/view/TryIt/]]
* [[Contributors' dashboard>>Contributors.WebHome]]
* [[Wiki administration>>path:/bin/admin/XWiki/XWikiPreferences]] -- users, groups (##XWiki.StarshipContributors##), rights
{{html clean="false"}}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&amp;family=Exo+2:wght@600;700&amp;display=swap" rel="stylesheet">
<div style="background: #0A1222; color: #EEF2F7; font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 16px; line-height: 1.6">
<header style="border-bottom: 1px solid #22324D">
<nav aria-label="Main" style="max-width: 1120px; margin: 0 auto; padding: 20px 24px; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px">
<a href="/bin/view/Main/" style="font-family: 'Exo 2', sans-serif; font-weight: 700; font-size: 22px; color: #EEF2F7; text-decoration: none; letter-spacing: 0.02em">starship<span style="color: #F5891F">OS</span><span style="font-size: 14px; color: #A3AEC2; margin-left: 6px">.org</span></a>
<div style="display: flex; flex-wrap: wrap; gap: 24px; font-size: 14px"><a href="/bin/view/Main/" style="color: #C8D1DE; text-decoration: none">Home</a><a href="/bin/view/Contributors/" style="color: #C8D1DE; text-decoration: none">Contributors</a><a href="/bin/view/Admin/" aria-current="page" style="color: #EEF2F7; text-decoration: none; border-bottom: 2px solid #F5891F">Admin</a><a href="https://starshipos-f18.com/" style="color: #F5891F; text-decoration: none">starshipos-f18.com &#8594;</a></div>
</nav>
</header>
<section style="max-width: 1120px; margin: 0 auto; padding: 80px 24px 48px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #4FD1B0">Administrator only</p>
<h1 style="margin: 0 0 20px; font-family: 'Exo 2', sans-serif; font-weight: 700; font-size: clamp(36px, 5vw, 56px); line-height: 1.08">Admin dashboard.</h1>
<p style="margin: 0 0 32px; max-width: 680px; font-size: 18px; color: #C8D1DE">Seen by <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">XWiki.rajames</code> alone: the Admin space allows view and edit to that account and nobody else.</p>
</section>
<section style="max-width: 1120px; margin: 0 auto; padding: 0 24px 48px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #F5891F">CI</p>
<h2 style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 34px; line-height: 1.15; max-width: 760px">Every workflow, live.</h2>
<div style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px"><div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Acceptance -- the gate on every PR into master</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/acceptance.yml/badge.svg" alt="acceptance.yml status" style="display: block; height: 20px"> <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=acceptance.yml" style="font-size: 13px">runs</a></span></div>
<div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Build -- the quick check on StarForth-v4.0.0</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/build.yml/badge.svg?branch=StarForth-v4.0.0" alt="build.yml status" style="display: block; height: 20px"> <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=build.yml" style="font-size: 13px">runs</a></span></div>
<div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Nightly -- acceptance, images to Nexus, proofs (03:00 UTC)</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly.yml/badge.svg?branch=master" alt="nightly.yml status" style="display: block; height: 20px"> <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=nightly.yml" style="font-size: 13px">runs</a></span></div>
<div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Nightly documents (04:00 UTC)</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly-docs.yml/badge.svg?branch=master" alt="nightly-docs.yml status" style="display: block; height: 20px"> <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=nightly-docs.yml" style="font-size: 13px">runs</a></span></div>
<div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Runner image</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/runner-image.yml/badge.svg?branch=master" alt="runner-image.yml status" style="display: block; height: 20px"> <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=runner-image.yml" style="font-size: 13px">runs</a></span></div>
<div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Release -- a v&lt;version&gt; tag</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/release.yml/badge.svg" alt="release.yml status" style="display: block; height: 20px"> <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=release.yml" style="font-size: 13px">runs</a></span></div></div>
</section>
<section style="max-width: 1120px; margin: 0 auto; padding: 0 24px 96px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #F5891F">Run the project</p>
<h2 style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 34px; line-height: 1.15; max-width: 760px">Work, artifacts, sites.</h2>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 24px">
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px">
<h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 22px">Work</h3>
<p style="margin: 0 0 14px; font-size: 13px; color: #F5891F">Gitea</p>
<ul style="margin: 0; padding-left: 20px; color: #C8D1DE; font-size: 15px; display: flex; flex-direction: column; gap: 8px"><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/pulls?state=open">Open pull requests</a></li><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open">Open issues</a> &#8212; <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=23">in progress</a>, <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=20">blocked</a>, <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=21">needs acceptance</a></li><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/milestones">Milestones</a> and <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/projects">the project board</a></li><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/settings/branches">Branch protection</a> &#8212; master: no pushes, merges only after Acceptance</li><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/settings/actions/secrets">Actions secrets</a> &#8212; <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">NEXUS_CI_PASSWORD</code>, <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">PACKAGES_TOKEN</code>, <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">CAPSULE_SIGN_KEY</code></li><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/settings/actions/runners">Runners</a></li><li><a href="https://gitea.starshipos-f18.org/user/settings/applications">Access tokens</a> &#8212; revoke what a session no longer needs</li></ul>
</article>
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px">
<h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 22px">Artifacts</h3>
<p style="margin: 0 0 14px; font-size: 13px; color: #F5891F">Nexus and packages</p>
<ul style="margin: 0; padding-left: 20px; color: #C8D1DE; font-size: 15px; display: flex; flex-direction: column; gap: 8px"><li><a href="https://nexus.starshipos-f18.org/#browse/browse:starshipos-snapshots:org%2Fstarship">Snapshots</a> &#8212; <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">kernelImage</code> (pc, raspi5, milkv, logs), <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">documentation</code> (book, vol1&#8211;vol3, api)</li><li><a href="https://nexus.starshipos-f18.org/#browse/browse:starshipos-releases:org%2Fstarship">Releases</a></li><li><a href="https://gitea.starshipos-f18.org/rajames/-/packages">Container images</a> &#8212; <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">lithosananke-runner</code></li></ul>
</article>
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px">
<h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 22px">Sites</h3>
<p style="margin: 0 0 14px; font-size: 13px; color: #F5891F">and the wiki itself</p>
<ul style="margin: 0; padding-left: 20px; color: #C8D1DE; font-size: 15px; display: flex; flex-direction: column; gap: 8px"><li><a href="https://starshipos-f18.com/">starshipos-f18.com</a> and <a href="https://starshipos-f18.com/bin/view/TryIt/">Try it</a></li><li><a href="/bin/view/Contributors/">Contributors' dashboard</a></li><li><a href="/bin/admin/XWiki/XWikiPreferences">Wiki administration</a> &#8212; users, the group <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">XWiki.StarshipContributors</code>, rights</li></ul>
</article>
</div>
</section>
<footer style="border-top: 1px solid #22324D">
<div style="max-width: 1120px; margin: 0 auto; padding: 32px 24px; display: flex; flex-wrap: wrap; gap: 16px 32px; justify-content: space-between; font-size: 13px; color: #A3AEC2">
<span>&#169; 2026 Robert Allan James &#183; A Starship Foundation project (in formation)</span>
<span style="display: flex; flex-wrap: wrap; gap: 24px"><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke" style="color: #C8D1DE">Source</a><a href="https://starshipos-f18.com/" style="color: #C8D1DE">starshipos-f18.com</a></span>
</div>
</footer>
</div>
{{/html}}
+61 -48
View File
@@ -1,51 +1,64 @@
= Contributors' Dashboard =
{{info}}
For members of ##XWiki.StarshipContributors## and the administrator. Ask Captain Bob to be added.
{{/info}}
== How We Work: the Captain Bob Method ==
Neither agile nor waterfall. One process from the developer's desk to ##master##:
1. **Found** -- an issue says what is wrong or missing, with the evidence (a log, a line of code).
1. **Ruled** -- Captain Bob decides what is to be done. Nothing is built without a ruling, and no fix nobody asked for.
1. **Built** -- on the working branch, ##StarForth-v4.0.0##. C99, no GNU extensions; compose in FORTH before adding a C word.
1. **Verified** -- the acceptance protocol, below; its logs are committed under ##logs/##.
1. **Merged** -- a pull request into ##master##, which runs acceptance by itself. ##master## takes nothing else.
== The Acceptance Protocol ==
Run in this order, one QEMU at a time, in the foreground:
{{code language="none"}}
make -f kernel/Makefile ARCH=amd64 clean qemu
{{html clean="false"}}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&amp;family=Exo+2:wght@600;700&amp;display=swap" rel="stylesheet">
<div style="background: #0A1222; color: #EEF2F7; font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 16px; line-height: 1.6">
<header style="border-bottom: 1px solid #22324D">
<nav aria-label="Main" style="max-width: 1120px; margin: 0 auto; padding: 20px 24px; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px">
<a href="/bin/view/Main/" style="font-family: 'Exo 2', sans-serif; font-weight: 700; font-size: 22px; color: #EEF2F7; text-decoration: none; letter-spacing: 0.02em">starship<span style="color: #F5891F">OS</span><span style="font-size: 14px; color: #A3AEC2; margin-left: 6px">.org</span></a>
<div style="display: flex; flex-wrap: wrap; gap: 24px; font-size: 14px"><a href="/bin/view/Main/" style="color: #C8D1DE; text-decoration: none">Home</a><a href="/bin/view/Contributors/" aria-current="page" style="color: #EEF2F7; text-decoration: none; border-bottom: 2px solid #F5891F">Contributors</a><a href="https://starshipos-f18.com/" style="color: #F5891F; text-decoration: none">starshipos-f18.com &#8594;</a></div>
</nav>
</header>
<section style="max-width: 1120px; margin: 0 auto; padding: 80px 24px 48px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #4FD1B0">Contributors</p>
<h1 style="margin: 0 0 20px; font-family: 'Exo 2', sans-serif; font-weight: 700; font-size: clamp(36px, 5vw, 56px); line-height: 1.08">Contributors' dashboard.</h1>
<p style="margin: 0 0 32px; max-width: 680px; font-size: 18px; color: #C8D1DE">For the members of <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">XWiki.StarshipContributors</code> and the administrator. Ask Captain Bob to be added.</p>
</section>
<section style="max-width: 1120px; margin: 0 auto; padding: 0 24px 48px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #F5891F">How we work</p>
<h2 style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 34px; line-height: 1.15; max-width: 760px">The Captain Bob method.</h2>
<p style="margin: 0 0 32px; max-width: 720px; color: #C8D1DE">Neither agile nor waterfall: one process from the developer's desk to master.</p>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 24px">
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px"><div style="font-family: 'Exo 2', sans-serif; font-size: 28px; font-weight: 700; color: #F5891F">1</div><h3 style="margin: 4px 0 8px; font-family: 'Exo 2', sans-serif; font-size: 22px">Found</h3><p style="margin: 0; color: #C8D1DE; font-size: 14px">An issue says what is wrong or missing, with the evidence: a log, a line of code.</p></article>
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px"><div style="font-family: 'Exo 2', sans-serif; font-size: 28px; font-weight: 700; color: #F5891F">2</div><h3 style="margin: 4px 0 8px; font-family: 'Exo 2', sans-serif; font-size: 22px">Ruled</h3><p style="margin: 0; color: #C8D1DE; font-size: 14px">Captain Bob decides what is to be done. Nothing is built without a ruling, and no fix nobody asked for.</p></article>
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px"><div style="font-family: 'Exo 2', sans-serif; font-size: 28px; font-weight: 700; color: #F5891F">3</div><h3 style="margin: 4px 0 8px; font-family: 'Exo 2', sans-serif; font-size: 22px">Built</h3><p style="margin: 0; color: #C8D1DE; font-size: 14px">On the working branch, <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">StarForth-v4.0.0</code>. C99, no GNU extensions; compose in FORTH before adding a C word.</p></article>
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px"><div style="font-family: 'Exo 2', sans-serif; font-size: 28px; font-weight: 700; color: #F5891F">4</div><h3 style="margin: 4px 0 8px; font-family: 'Exo 2', sans-serif; font-size: 22px">Verified</h3><p style="margin: 0; color: #C8D1DE; font-size: 14px">The acceptance protocol, below; its logs are committed under <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">logs/</code>.</p></article>
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px"><div style="font-family: 'Exo 2', sans-serif; font-size: 28px; font-weight: 700; color: #F5891F">5</div><h3 style="margin: 4px 0 8px; font-family: 'Exo 2', sans-serif; font-size: 22px">Merged</h3><p style="margin: 0; color: #C8D1DE; font-size: 14px">A pull request into <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">master</code>, which runs acceptance by itself. master takes nothing else.</p></article>
</div>
</section>
<section style="max-width: 1120px; margin: 0 auto; padding: 48px 24px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #F5891F">The acceptance protocol</p>
<h2 style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 34px; line-height: 1.15; max-width: 760px">In this order, one QEMU at a time, in the foreground.</h2>
<pre style="margin: 0 0 24px; background: #0E182B; border: 1px solid #22324D; border-radius: 6px; padding: 24px; overflow-x: auto; font-size: 14px; color: #EEF2F7">make -f kernel/Makefile ARCH=amd64 clean qemu
make -f kernel/Makefile ARCH=aarch64 clean qemu
make -f kernel/Makefile ARCH=riscv64 clean qemu
make -f kernel/Makefile ARCH=amd64 clean qemu-stick-high
make -C v4 test-32
{{/code}}
Each boot reaches ##[zuse@Hera] ok>## with ##POST: PASSED## and every POST check passing, and the
three architectures report the same ##dict_hash##. ##make ARCH=amd64,aarch64,riscv64 init##
installs everything this needs.
|=Check|=Status
|Acceptance|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/acceptance.yml/badge.svg]]
|Build (StarForth-v4.0.0)|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/build.yml/badge.svg?branch=StarForth-v4.0.0]]
|Nightly|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly.yml/badge.svg?branch=master]]
== Where Things Are ==
* [[The repository>>https://gitea.starshipos-f18.org/rajames/LithosAnanke]] -- start with ##README.md## and ##docs/README.md##; the design record is ##docs/fabric/FABRIC-3.md##
* [[New issue>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues/new/choose]] -- the forms: bug, work, ruling, board
* [[Open features>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=2]] and [[bugs>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=1]]
* [[Board bring-up>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&milestone=2]] -- ##boards/BRINGUP.md##
* Before touching a capsule (##capsules/*.4th##): read ##experiments/bare_metal/README.md## -- the block ranges are shared by every capsule
== Rules That Bite ==
* No new branch, no ##git stash##, without Captain Bob's say-so.
* Never modify a registered, tested FORTH word to "fix" it; the problem is in the caller.
* ACL policy lives in ##ACL.4th##, not in C.
* Tags are sacred: each has the logs proving its state.
make -C v4 test-32</pre>
<p style="margin: 0 0 24px; max-width: 760px; color: #C8D1DE">Each boot reaches <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">[zuse@Hera] ok&gt;</code> with <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">POST: PASSED</code> and every POST check passing, and the three architectures report the same <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">dict_hash</code>. <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">make ARCH=amd64,aarch64,riscv64 init</code> installs everything this needs.</p>
<div style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px"><div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Acceptance -- the gate on every PR into master</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/acceptance.yml/badge.svg" alt="acceptance.yml status" style="display: block; height: 20px"> <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=acceptance.yml" style="font-size: 13px">runs</a></span></div>
<div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Build -- the quick check on StarForth-v4.0.0</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/build.yml/badge.svg?branch=StarForth-v4.0.0" alt="build.yml status" style="display: block; height: 20px"> <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=build.yml" style="font-size: 13px">runs</a></span></div>
<div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Nightly -- acceptance, images to Nexus, proofs (03:00 UTC)</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly.yml/badge.svg?branch=master" alt="nightly.yml status" style="display: block; height: 20px"> <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions?workflow=nightly.yml" style="font-size: 13px">runs</a></span></div></div>
</section>
<section style="max-width: 1120px; margin: 0 auto; padding: 0 24px 96px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #F5891F">Reference</p>
<h2 style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 34px; line-height: 1.15; max-width: 760px">Where things are, and what not to do.</h2>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); gap: 24px">
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px">
<h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 22px">Where things are</h3>
<p style="margin: 0 0 14px; font-size: 13px; color: #F5891F">start here</p>
<ul style="margin: 0; padding-left: 20px; color: #C8D1DE; font-size: 15px; display: flex; flex-direction: column; gap: 8px"><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke">The repository</a> &#8212; <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">README.md</code>, <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">docs/README.md</code>; the design record is <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">docs/fabric/FABRIC-3.md</code></li><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues/new/choose">New issue</a> &#8212; the forms: bug, work, ruling, board</li><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=2">Open features</a> and <a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&labels=1">bugs</a></li><li><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues?state=open&milestone=2">Board bring-up</a> &#8212; <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">boards/BRINGUP.md</code></li><li>Before touching a capsule: read <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">experiments/bare_metal/README.md</code> &#8212; the block ranges are shared by every capsule</li></ul>
</article>
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px">
<h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 22px">Rules that bite</h3>
<p style="margin: 0 0 14px; font-size: 13px; color: #F5891F">learned the hard way</p>
<ul style="margin: 0; padding-left: 20px; color: #C8D1DE; font-size: 15px; display: flex; flex-direction: column; gap: 8px"><li>No new branch, no <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">git stash</code>, without Captain Bob's say-so.</li><li>Never modify a registered, tested FORTH word to fix it: the problem is in the caller.</li><li>ACL policy lives in <code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">ACL.4th</code>, not in C.</li><li>Tags are sacred: each has the logs proving its state.</li></ul>
</article>
</div>
</section>
<footer style="border-top: 1px solid #22324D">
<div style="max-width: 1120px; margin: 0 auto; padding: 32px 24px; display: flex; flex-wrap: wrap; gap: 16px 32px; justify-content: space-between; font-size: 13px; color: #A3AEC2">
<span>&#169; 2026 Robert Allan James &#183; A Starship Foundation project (in formation)</span>
<span style="display: flex; flex-wrap: wrap; gap: 24px"><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke" style="color: #C8D1DE">Source</a><a href="https://starshipos-f18.com/" style="color: #C8D1DE">starshipos-f18.com</a></span>
</div>
</footer>
</div>
{{/html}}
+69 -40
View File
@@ -1,40 +1,69 @@
{{box cssClass="floatinginfobox" title="**StarshipOS**"}}
* **Kernel**: LithosAnanke v2.1.0 (UEFI, bare metal)
* **Runtime**: StarForth v4, the F18 engine (v3.2.0 kept)
* **Architectures**: amd64, aarch64, riscv64
* **Boards**: PC (UEFI stick), Raspberry Pi 5, Milk-V Mars
* **Language**: C99 and FORTH
{{/box}}
= StarshipOS =
StarshipOS is an operating system with no other operating system underneath it. **LithosAnanke**, a
UEFI microkernel, boots straight from the firmware and runs **StarForth** -- a FORTH virtual
machine -- as its only runtime. There is no libc and no shell: the system speaks FORTH.
This wiki is the project's working home: its design, its record and its dashboards. The public
face of StarshipOS -- what it is, and a machine to try in your browser -- is
[[starshipos-f18.com>>https://starshipos-f18.com/]].
== The Project ==
* [[The source>>https://gitea.starshipos-f18.org/rajames/LithosAnanke]] -- the kernel, StarForth, the proofs and the documents, in one repository
* [[Issues>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues]] -- what is found, ruled, built and verified
* [[Pull requests>>https://gitea.starshipos-f18.org/rajames/LithosAnanke/pulls]] -- the only way into ##master##
== How a Change Is Accepted ==
Every change passes the same **acceptance protocol**, by hand or in CI: the kernel booted in QEMU on
amd64, aarch64 and riscv64 to its prompt, its power-on self-test passing every check; the PC stick
loaded the way a PC loads it; and the 32-bit build's tests. A pull request into ##master## runs it
by itself, and nothing that fails it is merged.
|=Check|=Status
|Acceptance (pull requests)|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/acceptance.yml/badge.svg]]
|Nightly: acceptance, images, proofs|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly.yml/badge.svg?branch=master]]
|Nightly: documents|[[image:https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly-docs.yml/badge.svg?branch=master]]
== Contributors ==
Contributors have a dashboard of their own: [[log in>>path:/bin/login/XWiki/XWikiLogin]], then
[[Contributors>>Contributors.WebHome]].
{{html clean="false"}}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&amp;family=Exo+2:wght@600;700&amp;display=swap" rel="stylesheet">
<div style="background: #0A1222; color: #EEF2F7; font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 16px; line-height: 1.6">
<header style="border-bottom: 1px solid #22324D">
<nav aria-label="Main" style="max-width: 1120px; margin: 0 auto; padding: 20px 24px; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px">
<a href="/bin/view/Main/" style="font-family: 'Exo 2', sans-serif; font-weight: 700; font-size: 22px; color: #EEF2F7; text-decoration: none; letter-spacing: 0.02em">starship<span style="color: #F5891F">OS</span><span style="font-size: 14px; color: #A3AEC2; margin-left: 6px">.org</span></a>
<div style="display: flex; flex-wrap: wrap; gap: 24px; font-size: 14px"><a href="/bin/view/Main/" aria-current="page" style="color: #EEF2F7; text-decoration: none; border-bottom: 2px solid #F5891F">Home</a><a href="/bin/view/Contributors/" style="color: #C8D1DE; text-decoration: none">Contributors</a><a href="https://starshipos-f18.com/" style="color: #F5891F; text-decoration: none">starshipos-f18.com &#8594;</a></div>
</nav>
</header>
<section style="max-width: 1120px; margin: 0 auto; padding: 80px 24px 48px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #4FD1B0">ok&gt; the working home</p>
<h1 style="margin: 0 0 20px; font-family: 'Exo 2', sans-serif; font-weight: 700; font-size: clamp(36px, 5vw, 56px); line-height: 1.08">Where StarshipOS is built.</h1>
<p style="margin: 0 0 32px; max-width: 680px; font-size: 18px; color: #C8D1DE">StarshipOS is an operating system with no other operating system underneath it. LithosAnanke, a UEFI microkernel, boots straight from the firmware and runs StarForth, a FORTH virtual machine, as its only runtime. This wiki holds its design, its record and its dashboards; the public face is <a href="https://starshipos-f18.com/">starshipos-f18.com</a>.</p>
<div style="display: flex; flex-wrap: wrap; gap: 16px"><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke" style="display: inline-block; padding: 14px 24px; background: #F5891F; color: #0A1222; font-weight: 700; text-decoration: none; border-radius: 4px">Browse the source</a><a href="https://starshipos-f18.com/bin/view/TryIt/" style="display: inline-block; padding: 14px 24px; border: 1px solid #34486A; color: #EEF2F7; text-decoration: none; border-radius: 4px">Try it in a browser</a></div>
</section>
<section aria-label="At a glance" style="border-top: 1px solid #22324D; border-bottom: 1px solid #22324D; background: #0E182B">
<div style="max-width: 1120px; margin: 0 auto; padding: 32px 24px; display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 24px"><div><div style="font-family: 'Exo 2', sans-serif; font-size: 32px; font-weight: 700; color: #F5891F">v2.1.0</div><div style="font-size: 14px; color: #A3AEC2">LithosAnanke, the UEFI microkernel</div></div><div><div style="font-family: 'Exo 2', sans-serif; font-size: 32px; font-weight: 700; color: #F5891F">v4</div><div style="font-size: 14px; color: #A3AEC2">StarForth, the F18 engine</div></div><div><div style="font-family: 'Exo 2', sans-serif; font-size: 32px; font-weight: 700; color: #F5891F">3 ISAs</div><div style="font-size: 14px; color: #A3AEC2">amd64 &#183; aarch64 &#183; riscv64</div></div><div><div style="font-family: 'Exo 2', sans-serif; font-size: 32px; font-weight: 700; color: #F5891F">538</div><div style="font-size: 14px; color: #A3AEC2">POST checks on every boot</div></div></div>
</section>
<section style="max-width: 1120px; margin: 0 auto; padding: 96px 24px 48px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #F5891F">The project</p>
<h2 style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 34px; line-height: 1.15; max-width: 760px">One repository, one process, one line to master.</h2>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 24px">
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px">
<h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 22px">The source</h3>
<p style="margin: 0 0 14px; font-size: 13px; color: #F5891F">kernel, StarForth, proofs, documents</p>
<p style="margin: 0 0 16px; color: #C8D1DE">Everything in one repository: LithosAnanke, StarForth v3 and v4, the Isabelle/HOL proofs and the books.</p><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke">Browse it &#8594;</a>
</article>
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px">
<h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 22px">Issues</h3>
<p style="margin: 0 0 14px; font-size: 13px; color: #F5891F">found, ruled, built, verified</p>
<p style="margin: 0 0 16px; color: #C8D1DE">Every piece of work starts as an issue with its evidence, and is ruled before it is built.</p><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/issues">Open issues &#8594;</a>
</article>
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px">
<h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 22px">Pull requests</h3>
<p style="margin: 0 0 14px; font-size: 13px; color: #F5891F">the only way into master</p>
<p style="margin: 0 0 16px; color: #C8D1DE">master takes nothing but a pull request that passed the acceptance protocol.</p><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/pulls">Pull requests &#8594;</a>
</article>
</div>
</section>
<section style="max-width: 1120px; margin: 0 auto; padding: 48px 24px">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #F5891F">How a change is accepted</p>
<h2 style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 34px; line-height: 1.15; max-width: 760px">Booted on three architectures, every time.</h2>
<p style="margin: 0 0 24px; max-width: 760px; color: #C8D1DE">The kernel boots in QEMU on amd64, aarch64 and riscv64 to its prompt, its power-on self-test passing every check; the PC stick boots loaded the way a PC loads it; the 32-bit build passes its tests. A developer runs it by hand, a pull request runs it by itself, and the nightly runs it again before it publishes.</p>
<div style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px"><div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Acceptance -- the gate on every PR into master</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/acceptance.yml/badge.svg" alt="acceptance.yml status" style="display: block; height: 20px"></span></div>
<div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Nightly -- acceptance, images to Nexus, proofs (03:00 UTC)</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly.yml/badge.svg?branch=master" alt="nightly.yml status" style="display: block; height: 20px"></span></div>
<div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid #22324D"><span style="color: #C8D1DE; font-size: 14px">Nightly documents (04:00 UTC)</span><span style="display: flex; align-items: center; gap: 16px"><img src="https://gitea.starshipos-f18.org/rajames/LithosAnanke/actions/workflows/nightly-docs.yml/badge.svg?branch=master" alt="nightly-docs.yml status" style="display: block; height: 20px"></span></div></div>
</section>
<section style="max-width: 1120px; margin: 0 auto; padding: 48px 24px 96px">
<div style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px; padding: 40px; display: flex; flex-wrap: wrap; gap: 32px; align-items: center">
<div style="flex: 999 1 480px; min-width: 0">
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #F5891F">Contributors</p>
<h2 style="margin: 0 0 12px; font-family: 'Exo 2', sans-serif; font-size: 30px">Working on StarshipOS?</h2>
<p style="margin: 0; color: #C8D1DE">Contributors have a dashboard of their own: the method, the acceptance commands, the open work. Log in to see it.</p>
</div>
<div style="flex: 1 1 220px; display: flex; flex-direction: column; gap: 12px">
<a href="/bin/login/XWiki/XWikiLogin?xredirect=/bin/view/Contributors/" style="display: inline-block; padding: 14px 24px; background: #F5891F; color: #0A1222; font-weight: 700; text-decoration: none; border-radius: 4px; text-align: center">Log in</a>
<a href="/bin/view/Contributors/" style="display: inline-block; padding: 14px 24px; border: 1px solid #34486A; color: #EEF2F7; text-decoration: none; border-radius: 4px; text-align: center">Contributors' dashboard</a>
</div>
</div>
</section>
<footer style="border-top: 1px solid #22324D">
<div style="max-width: 1120px; margin: 0 auto; padding: 32px 24px; display: flex; flex-wrap: wrap; gap: 16px 32px; justify-content: space-between; font-size: 13px; color: #A3AEC2">
<span>&#169; 2026 Robert Allan James &#183; A Starship Foundation project (in formation)</span>
<span style="display: flex; flex-wrap: wrap; gap: 24px"><a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke" style="color: #C8D1DE">Source</a><a href="https://starshipos-f18.com/" style="color: #C8D1DE">starshipos-f18.com</a></span>
</div>
</footer>
</div>
{{/html}}
+6 -1
View File
@@ -9,7 +9,12 @@ The project's working wiki at `starshipos-f18.org` (the public face is the `.com
| `Admin.WebHome` -- the admin dashboard | `Admin.WebHome.xwiki` | the administrator (`XWiki.rajames`) alone |
| `Contributors.WebHome` -- the contributors' dashboard | `Contributors.WebHome.xwiki` | the group `XWiki.StarshipContributors`, and the administrator |
The dashboards show CI as Gitea's live workflow badges, which need no login and no script rights.
They are in the starshipos-f18.com look -- the "StarshipOS.com" design canvas (navy `#0A1222`, accent
`#F5891F`, JetBrains Mono with Exo 2 headings), where they are also drawn as the `.org` artboards.
`build.py` writes the three `.xwiki` files (and, with `--canvas <dir>`, the artboards) from one
source: edit it, not the `.xwiki` files. Each page is one `{{html}}` block, which needs a page author
with script rights (the administrator has them). CI is shown as Gitea's live workflow badges, which
need no login.
`install.sh` puts them on the wiki through its REST API, makes the group and the rights, and checks
as a guest that the landing page is readable and the dashboards are not:
+332
View File
@@ -0,0 +1,332 @@
#!/usr/bin/env python3
"""build.py -- the .org XWiki's three pages in the starshipos-f18.com look (the "StarshipOS.com"
design canvas: navy #0A1222, accent #F5891F, JetBrains Mono, Exo 2 headings), from one source.
site/org/build.py writes Main.WebHome.xwiki, Admin.WebHome.xwiki,
Contributors.WebHome.xwiki (each one {{html}} block)
site/org/build.py --canvas <dir>
also writes <dir>/project/Org*.dc.html, the same pages as
design-canvas artboards (status badges drawn as placeholders:
a canvas loads nothing from Gitea)
The {{html}} macro needs a page author with script rights. install.sh puts the pages on the wiki.
"""
import os
import sys
GITEA = "https://gitea.starshipos-f18.org/rajames/LithosAnanke"
COM = "https://starshipos-f18.com/"
ISSUES = GITEA + "/issues?state=open"
ACCENT = "#F5891F"
TEAL = "#4FD1B0"
FONTS = ('<link rel="preconnect" href="https://fonts.googleapis.com">\n'
'<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700'
'&amp;family=Exo+2:wght@600;700&amp;display=swap" rel="stylesheet">')
H = "font-family: 'Exo 2', sans-serif"
CARD = "background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px"
EYEBROW = ("margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; "
"color: {accent}")
BTN = ("display: inline-block; padding: 14px 24px; background: {accent}; color: #0A1222; "
"font-weight: 700; text-decoration: none; border-radius: 4px")
BTN2 = ("display: inline-block; padding: 14px 24px; border: 1px solid #34486A; color: #EEF2F7; "
"text-decoration: none; border-radius: 4px")
WRAP = "max-width: 1120px; margin: 0 auto"
WORKFLOWS = { # file -> (branch for the badge, what it is)
"acceptance.yml": (None, "Acceptance -- the gate on every PR into master"),
"build.yml": ("StarForth-v4.0.0", "Build -- the quick check on StarForth-v4.0.0"),
"nightly.yml": ("master", "Nightly -- acceptance, images to Nexus, proofs (03:00 UTC)"),
"nightly-docs.yml": ("master", "Nightly documents (04:00 UTC)"),
"runner-image.yml": ("master", "Runner image"),
"release.yml": (None, "Release -- a v&lt;version&gt; tag"),
}
def badge(wf, canvas):
branch = WORKFLOWS[wf][0]
if canvas:
return ('<span style="display: inline-block; padding: 2px 10px; border: 1px dashed #34486A; '
'border-radius: 4px; font-size: 12px; color: #A3AEC2">[LIVE STATUS]</span>')
q = "?branch=" + branch if branch else ""
return ('<img src="%s/actions/workflows/%s/badge.svg%s" alt="%s status" '
'style="display: block; height: 20px">' % (GITEA, wf, q, wf))
def status_rows(wfs, canvas, runs=True):
rows = []
for wf in wfs:
link = (' <a href="%s/actions?workflow=%s" style="font-size: 13px">runs</a>' % (GITEA, wf)
if runs else "")
rows.append('<div style="display: flex; flex-wrap: wrap; align-items: center; '
'justify-content: space-between; gap: 12px; padding: 14px 0; '
'border-top: 1px solid #22324D">'
'<span style="color: #C8D1DE; font-size: 14px">%s</span>'
'<span style="display: flex; align-items: center; gap: 16px">%s%s</span></div>'
% (WORKFLOWS[wf][1], badge(wf, canvas), link))
return "\n".join(rows)
def nav(here, links):
items = []
for label, href, key in links:
cur = ' aria-current="page"' if key == here else ""
style = ("color: #EEF2F7; text-decoration: none; border-bottom: 2px solid {accent}"
if key == here else "color: #C8D1DE; text-decoration: none")
items.append('<a href="%s"%s style="%s">%s</a>' % (href, cur, style, label))
items.append('<a href="%s" style="color: {accent}; text-decoration: none">starshipos-f18.com &#8594;</a>'
% COM)
return ('<header style="border-bottom: 1px solid #22324D">\n'
'<nav aria-label="Main" style="%s; padding: 20px 24px; display: flex; flex-wrap: wrap; '
'align-items: center; justify-content: space-between; gap: 16px">\n'
'<a href="%s" style="%s; font-weight: 700; font-size: 22px; color: #EEF2F7; '
'text-decoration: none; letter-spacing: 0.02em">starship<span style="color: {accent}">OS</span>'
'<span style="font-size: 14px; color: #A3AEC2; margin-left: 6px">.org</span></a>\n'
'<div style="display: flex; flex-wrap: wrap; gap: 24px; font-size: 14px">%s</div>\n'
'</nav>\n</header>' % (WRAP, links[0][1], H, "".join(items)))
FOOTER = ('<footer style="border-top: 1px solid #22324D">\n'
'<div style="%s; padding: 32px 24px; display: flex; flex-wrap: wrap; gap: 16px 32px; '
'justify-content: space-between; font-size: 13px; color: #A3AEC2">\n'
'<span>&#169; 2026 Robert Allan James &#183; A Starship Foundation project (in formation)</span>\n'
'<span style="display: flex; flex-wrap: wrap; gap: 24px"><a href="%s" style="color: #C8D1DE">Source</a>'
'<a href="%s" style="color: #C8D1DE">starshipos-f18.com</a></span>\n</div>\n</footer>' % (WRAP, GITEA, COM))
def hero(eyebrow, title, text, buttons=""):
return ('<section style="%s; padding: 80px 24px 48px">\n'
'<p style="%s">%s</p>\n'
'<h1 style="margin: 0 0 20px; %s; font-weight: 700; font-size: clamp(36px, 5vw, 56px); '
'line-height: 1.08">%s</h1>\n'
'<p style="margin: 0 0 32px; max-width: 680px; font-size: 18px; color: #C8D1DE">%s</p>\n%s'
'</section>' % (WRAP, EYEBROW.replace("{accent}", TEAL), eyebrow, H, title, text,
('<div style="display: flex; flex-wrap: wrap; gap: 16px">%s</div>\n' % buttons)
if buttons else ""))
def section(eyebrow, title, body, pad="48px 24px"):
return ('<section style="%s; padding: %s">\n<p style="%s">%s</p>\n'
'<h2 style="margin: 0 0 32px; %s; font-size: 34px; line-height: 1.15; max-width: 760px">%s</h2>\n'
'%s\n</section>' % (WRAP, pad, EYEBROW, eyebrow, H, title, body))
def card(title, sub, body):
return ('<article style="%s">\n<h3 style="margin: 0 0 4px; %s; font-size: 22px">%s</h3>\n'
'<p style="margin: 0 0 14px; font-size: 13px; color: {accent}">%s</p>\n%s\n</article>'
% (CARD, H, title, sub, body))
def grid(items, min_w=280):
return ('<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(%dpx, 1fr)); '
'gap: 24px">\n%s\n</div>' % (min_w, "\n".join(items)))
def links(items):
return ('<ul style="margin: 0; padding-left: 20px; color: #C8D1DE; font-size: 15px; '
'display: flex; flex-direction: column; gap: 8px">%s</ul>'
% "".join("<li>%s</li>" % i for i in items))
def a(href, text):
return '<a href="%s">%s</a>' % (href, text)
def code(s):
return '<code style="color: #EEF2F7; background: #0A1222; padding: 1px 6px; border-radius: 3px">%s</code>' % s
def page_main(canvas, url):
links_ = [("Home", url("Main"), "Main"), ("Contributors", url("Contributors"), "Contributors")]
glance = [("v2.1.0", "LithosAnanke, the UEFI microkernel"), ("v4", "StarForth, the F18 engine"),
("3 ISAs", "amd64 &#183; aarch64 &#183; riscv64"), ("538", "POST checks on every boot")]
strip = ('<section aria-label="At a glance" style="border-top: 1px solid #22324D; border-bottom: 1px solid '
'#22324D; background: #0E182B">\n<div style="%s; padding: 32px 24px; display: grid; '
'grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 24px">%s</div>\n</section>'
% (WRAP, "".join('<div><div style="%s; font-size: 32px; font-weight: 700; color: {accent}">%s</div>'
'<div style="font-size: 14px; color: #A3AEC2">%s</div></div>' % (H, n, t)
for n, t in glance)))
project = section("The project", "One repository, one process, one line to master.", grid([
card("The source", "kernel, StarForth, proofs, documents",
'<p style="margin: 0 0 16px; color: #C8D1DE">Everything in one repository: LithosAnanke, '
'StarForth v3 and v4, the Isabelle/HOL proofs and the books.</p>' + a(GITEA, "Browse it &#8594;")),
card("Issues", "found, ruled, built, verified",
'<p style="margin: 0 0 16px; color: #C8D1DE">Every piece of work starts as an issue with its '
'evidence, and is ruled before it is built.</p>' + a(GITEA + "/issues", "Open issues &#8594;")),
card("Pull requests", "the only way into master",
'<p style="margin: 0 0 16px; color: #C8D1DE">master takes nothing but a pull request that '
'passed the acceptance protocol.</p>' + a(GITEA + "/pulls", "Pull requests &#8594;")),
]), pad="96px 24px 48px")
accept = section("How a change is accepted", "Booted on three architectures, every time.",
'<p style="margin: 0 0 24px; max-width: 760px; color: #C8D1DE">The kernel boots in QEMU '
'on amd64, aarch64 and riscv64 to its prompt, its power-on self-test passing every check; '
'the PC stick boots loaded the way a PC loads it; the 32-bit build passes its tests. A '
'developer runs it by hand, a pull request runs it by itself, and the nightly runs it '
'again before it publishes.</p>\n<div style="%s">%s</div>'
% (CARD, status_rows(["acceptance.yml", "nightly.yml", "nightly-docs.yml"], canvas, False)))
contrib = ('<section style="%s; padding: 48px 24px 96px">\n<div style="%s; padding: 40px; display: flex; '
'flex-wrap: wrap; gap: 32px; align-items: center">\n<div style="flex: 999 1 480px; min-width: 0">\n'
'<p style="%s">Contributors</p>\n<h2 style="margin: 0 0 12px; %s; font-size: 30px">'
'Working on StarshipOS?</h2>\n<p style="margin: 0; color: #C8D1DE">Contributors have a dashboard '
'of their own: the method, the acceptance commands, the open work. Log in to see it.</p>\n</div>\n'
'<div style="flex: 1 1 220px; display: flex; flex-direction: column; gap: 12px">\n'
'<a href="%s" style="%s; text-align: center">Log in</a>\n'
'<a href="%s" style="%s; text-align: center">Contributors\' dashboard</a>\n</div>\n</div>\n</section>'
% (WRAP, CARD, EYEBROW, H, url("login"), BTN, url("Contributors"), BTN2))
return "\n".join([
nav("Main", links_),
hero("ok&gt; the working home", "Where StarshipOS is built.",
"StarshipOS is an operating system with no other operating system underneath it. LithosAnanke, a "
"UEFI microkernel, boots straight from the firmware and runs StarForth, a FORTH virtual machine, "
"as its only runtime. This wiki holds its design, its record and its dashboards; the public face "
"is " + a(COM, "starshipos-f18.com") + ".",
'<a href="%s" style="%s">Browse the source</a><a href="%s" style="%s">Try it in a browser</a>'
% (GITEA, BTN, COM + "bin/view/TryIt/", BTN2)),
strip, project, accept, contrib, FOOTER])
def page_admin(canvas, url):
links_ = [("Home", url("Main"), "Main"), ("Contributors", url("Contributors"), "Contributors"),
("Admin", url("Admin"), "Admin")]
ci = section("CI", "Every workflow, live.", '<div style="%s">%s</div>' % (CARD, status_rows(list(WORKFLOWS), canvas)),
pad="0 24px 48px")
work = card("Work", "Gitea", links([
a(GITEA + "/pulls?state=open", "Open pull requests"),
a(ISSUES, "Open issues") + " &#8212; " + a(ISSUES + "&labels=23", "in progress") + ", "
+ a(ISSUES + "&labels=20", "blocked") + ", " + a(ISSUES + "&labels=21", "needs acceptance"),
a(GITEA + "/milestones", "Milestones") + " and " + a(GITEA + "/projects", "the project board"),
a(GITEA + "/settings/branches", "Branch protection") + " &#8212; master: no pushes, merges only after Acceptance",
a(GITEA + "/settings/actions/secrets", "Actions secrets") + " &#8212; " + code("NEXUS_CI_PASSWORD") + ", "
+ code("PACKAGES_TOKEN") + ", " + code("CAPSULE_SIGN_KEY"),
a(GITEA + "/settings/actions/runners", "Runners"),
a("https://gitea.starshipos-f18.org/user/settings/applications", "Access tokens")
+ " &#8212; revoke what a session no longer needs"]))
arts = card("Artifacts", "Nexus and packages", links([
a("https://nexus.starshipos-f18.org/#browse/browse:starshipos-snapshots:org%2Fstarship", "Snapshots")
+ " &#8212; " + code("kernelImage") + " (pc, raspi5, milkv, logs), " + code("documentation")
+ " (book, vol1&#8211;vol3, api)",
a("https://nexus.starshipos-f18.org/#browse/browse:starshipos-releases:org%2Fstarship", "Releases"),
a("https://gitea.starshipos-f18.org/rajames/-/packages", "Container images") + " &#8212; "
+ code("lithosananke-runner"), ]))
sites = card("Sites", "and the wiki itself", links([
a(COM, "starshipos-f18.com") + " and " + a(COM + "bin/view/TryIt/", "Try it"),
a(url("Contributors"), "Contributors' dashboard"),
a(url("admin"), "Wiki administration") + " &#8212; users, the group " + code("XWiki.StarshipContributors")
+ ", rights"]))
return "\n".join([
nav("Admin", links_),
hero("Administrator only", "Admin dashboard.",
"Seen by " + code("XWiki.rajames") + " alone: the Admin space allows view and edit to that "
"account and nobody else."),
ci, section("Run the project", "Work, artifacts, sites.", grid([work, arts, sites], 300), pad="0 24px 96px"),
FOOTER])
def page_contrib(canvas, url):
links_ = [("Home", url("Main"), "Main"), ("Contributors", url("Contributors"), "Contributors")]
steps = [("Found", "An issue says what is wrong or missing, with the evidence: a log, a line of code."),
("Ruled", "Captain Bob decides what is to be done. Nothing is built without a ruling, and no fix "
"nobody asked for."),
("Built", "On the working branch, " + code("StarForth-v4.0.0") + ". C99, no GNU extensions; compose "
"in FORTH before adding a C word."),
("Verified", "The acceptance protocol, below; its logs are committed under " + code("logs/") + "."),
("Merged", "A pull request into " + code("master") + ", which runs acceptance by itself. master takes "
"nothing else.")]
method = section("How we work", "The Captain Bob method.",
'<p style="margin: 0 0 32px; max-width: 720px; color: #C8D1DE">Neither agile nor waterfall: '
'one process from the developer\'s desk to master.</p>\n' + grid(
['<article style="%s"><div style="%s; font-size: 28px; font-weight: 700; color: {accent}">'
'%d</div><h3 style="margin: 4px 0 8px; %s; font-size: 22px">%s</h3>'
'<p style="margin: 0; color: #C8D1DE; font-size: 14px">%s</p></article>'
% (CARD, H, i + 1, H, t, d) for i, (t, d) in enumerate(steps)], 190), pad="0 24px 48px")
cmds = ("make -f kernel/Makefile ARCH=amd64 clean qemu\n"
"make -f kernel/Makefile ARCH=aarch64 clean qemu\n"
"make -f kernel/Makefile ARCH=riscv64 clean qemu\n"
"make -f kernel/Makefile ARCH=amd64 clean qemu-stick-high\n"
"make -C v4 test-32")
accept = section("The acceptance protocol", "In this order, one QEMU at a time, in the foreground.",
'<pre style="margin: 0 0 24px; background: #0E182B; border: 1px solid #22324D; '
'border-radius: 6px; padding: 24px; overflow-x: auto; font-size: 14px; color: #EEF2F7">'
'%s</pre>\n<p style="margin: 0 0 24px; max-width: 760px; color: #C8D1DE">Each boot reaches '
'%s with %s and every POST check passing, and the three architectures report the same '
'%s. %s installs everything this needs.</p>\n<div style="%s">%s</div>'
% (cmds, code("[zuse@Hera] ok&gt;"), code("POST: PASSED"), code("dict_hash"),
code("make ARCH=amd64,aarch64,riscv64 init"), CARD,
status_rows(["acceptance.yml", "build.yml", "nightly.yml"], canvas)))
where = card("Where things are", "start here", links([
a(GITEA, "The repository") + " &#8212; " + code("README.md") + ", " + code("docs/README.md")
+ "; the design record is " + code("docs/fabric/FABRIC-3.md"),
a(GITEA + "/issues/new/choose", "New issue") + " &#8212; the forms: bug, work, ruling, board",
a(ISSUES + "&labels=2", "Open features") + " and " + a(ISSUES + "&labels=1", "bugs"),
a(ISSUES + "&milestone=2", "Board bring-up") + " &#8212; " + code("boards/BRINGUP.md"),
"Before touching a capsule: read " + code("experiments/bare_metal/README.md")
+ " &#8212; the block ranges are shared by every capsule"]))
rules = card("Rules that bite", "learned the hard way", links([
"No new branch, no " + code("git stash") + ", without Captain Bob's say-so.",
"Never modify a registered, tested FORTH word to fix it: the problem is in the caller.",
"ACL policy lives in " + code("ACL.4th") + ", not in C.",
"Tags are sacred: each has the logs proving its state."]))
return "\n".join([
nav("Contributors", links_),
hero("Contributors", "Contributors' dashboard.",
"For the members of " + code("XWiki.StarshipContributors") + " and the administrator. "
"Ask Captain Bob to be added."),
method, accept, section("Reference", "Where things are, and what not to do.",
grid([where, rules], 360), pad="0 24px 96px"),
FOOTER])
PAGES = { # name -> (builder, title, canvas file, canvas height)
"Main": (page_main, "StarshipOS", "OrgHome.dc.html", 2300),
"Admin": (page_admin, "Admin Dashboard", "OrgAdmin.dc.html", 1900),
"Contributors": (page_contrib, "Contributors' Dashboard", "OrgContributors.dc.html", 2500),
}
def wiki_url(key):
return {"login": "/bin/login/XWiki/XWikiLogin?xredirect=/bin/view/Contributors/",
"admin": "/bin/admin/XWiki/XWikiPreferences"}.get(key, "/bin/view/%s/" % key)
def canvas_url(key):
files = {k: v[2] for k, v in PAGES.items()}
return files.get(key, "https://starshipos-f18.org" + wiki_url(key))
def body(name, canvas):
html = PAGES[name][0](canvas, canvas_url if canvas else wiki_url)
return ('<div style="background: #0A1222; color: #EEF2F7; font-family: \'JetBrains Mono\', ui-monospace, '
'monospace; font-size: 16px; line-height: 1.6">\n%s\n</div>' % html)
def write_wiki(name):
html = body(name, False).replace("{accent}", ACCENT)
with open("%s.WebHome.xwiki" % name, "w") as f:
f.write('{{html clean="false"}}\n%s\n%s\n{{/html}}\n' % (FONTS, html))
def write_canvas(name, root):
title, file, h = PAGES[name][1], PAGES[name][2], PAGES[name][3]
html = body(name, True).replace("{accent}", "{{accent}}")
doc = ('<!doctype html>\n<html lang="en">\n<head>\n<meta charset="utf-8">\n<title>StarshipOS.org &#8212; %s'
'</title>\n<script src="./support.js"></script>\n</head>\n<body>\n<x-dc>\n<helmet>\n%s\n<style>\n'
'body{margin:0;background:#0A1222}\na{color:#F5891F}a:hover{color:#FFB061}\n</style>\n</helmet>\n%s\n'
'</x-dc>\n<script type="text/x-dc" data-dc-script data-props=\'{"accent":{"editor":"color","default":'
'"#F5891F","options":["#F5891F","#5FD3C4","#8FB8FF"]},"$preview":{"width":1280,"height":%d}}\'>\n'
'class Component extends DCLogic {\n renderVals() {\n return { accent: this.props.accent ?? '
'\'#F5891F\' };\n }\n}\n</script>\n</body>\n</html>\n' % (title, FONTS, html, h))
os.makedirs(os.path.join(root, "project"), exist_ok=True)
with open(os.path.join(root, "project", file), "w") as f:
f.write(doc)
if __name__ == "__main__":
os.chdir(os.path.dirname(os.path.abspath(__file__)))
canvas_root = sys.argv[2] if len(sys.argv) > 2 and sys.argv[1] == "--canvas" else None
for n in PAGES:
write_wiki(n)
if canvas_root:
write_canvas(n, canvas_root)
print("wrote", ", ".join("%s.WebHome.xwiki" % n for n in PAGES),
"and the canvas artboards" if canvas_root else "")