Compare commits

...
Author SHA1 Message Date
jarvis-at-skic 42b876e82e [verified] docs: reconcile AeroSim Wave 2 progress
Build and publish Corp v1 Board portal / build (pull_request) Successful in 39s
2026-09-03 21:32:16 +00:00
jarvis-at-skic 62c647f516 Merge pull request 'ui: reorder top-level navigation' (#22)
Build and publish Corp v1 Board portal / build (push) Successful in 38s
2026-09-03 12:25:55 -07:00
jarvis-at-skic 90f3aa0c11 [verified] ui: reorder top-level navigation
Build and publish Corp v1 Board portal / build (pull_request) Successful in 38s
2026-09-03 19:24:34 +00:00
jarvis-at-skic 04e2b2ceee Merge pull request 'docs: report AeroSim delivery progress' (#21) from docs/aerosim-delivery-progress into main
Build and publish Corp v1 Board portal / build (push) Successful in 50s
2026-09-03 12:19:57 -07:00
jarvis-at-skic fc20f12128 [verified] docs: report AeroSim delivery progress
Build and publish Corp v1 Board portal / build (pull_request) Successful in 49s
2026-09-03 19:18:41 +00:00
jarvis-at-skic 1be8fcfd6d Governance: align AeroSim channel membership (#20)
Build and publish Corp v1 Board portal / build (push) Successful in 36s
Approved by RootAtSkic in AeroSim General message 1543962382978514964.
2026-08-31 05:40:58 -07:00
jarvis-at-skic 23ad72c038 governance: align AeroSim channel membership
Build and publish Corp v1 Board portal / build (pull_request) Successful in 36s
2026-08-31 12:39:14 +00:00
jarvis-at-skic 481e2b0ea8 docs: complete 3D Architecture Wizzard kickoff
Build and publish Corp v1 Board portal / build (push) Successful in 36s
2026-08-31 10:40:39 +00:00
jarvis-at-skic 7fcbccc1fb docs: record 3D Architecture Wizzard kickoff
Build and publish Corp v1 Board portal / build (push) Successful in 49s
2026-08-31 10:05:41 +00:00
jarvis-at-skic a7cedaaab1 docs: add Corp pilot Ways of Working onboarding
Build and publish Corp v1 Board portal / build (push) Successful in 36s
Publish the Board-requested onboarding guide and navigation.
2026-08-27 14:54:52 -07:00
jarvis-at-skic 9e6514de51 docs: add Corp pilot onboarding guide
Build and publish Corp v1 Board portal / build (pull_request) Successful in 36s
2026-08-27 21:53:44 +00:00
jarvis-at-skic 1226329a7a docs: record final shared SSO rollout refs
Build and publish Corp v1 Board portal / build (push) Successful in 35s
Record final central and adopted UI/UX refs after login-routing correction.
2026-08-27 13:58:57 -07:00
19 changed files with 795 additions and 13 deletions
@@ -0,0 +1,36 @@
---
title: 3D Architecture Wizzard kickoff
---
# 3D Architecture Wizzard kickoff — 2026-08-31
## Decision
Provision **3D Architecture Wizzard**, code `3darch`, as a public Corp v1 project. Linas (`discord:1483820991720329227`) is the accountable team lead and initial member.
RootAtSkic (`discord:1518725627845283888`) explicitly requested project setup in Board message `1543918340882436166` and approved the complete kickoff proposal in the same Board session. RootAtSkic explicitly retained the spelling **Wizzard**.
## Purpose
Create an interactive 3D application for exploring, designing, and communicating software and system architecture.
## Initial deliverable
A browser-based proof of concept that visualizes one architecture model in navigable 3D.
## Authorized resources
- Dedicated category `corp-v1-3darch` with exactly seven lifecycle channels in approved order.
- Project organization `corp-v1-3darch` and skills organization `corp-v1-3darch-skills-code-agent`.
- Application and documentation repositories.
- Seven adopted engineering skills and seven adopted channel skills.
- Project and skills organization teams for verified Gitea user `linas`.
- Required Harbor non-secret variables and secret-name-only validation.
- Global Draw.io and glossary references.
- No project cronjobs or scheduler jobs.
## Current state
Provisioned and remotely verified. Application `847c8291f100547ec9104743ab7d0d8761a5ec20` and documentation `73cf70f0f333c187b28821fb76a44c779bdfbbdb` have successful exact-head Actions; the documentation page body was read back through the Gondor operator route. Exactly seven project channels, two organizations, two teams, two project repositories, and fourteen adopted skills exist.
The project is **Active — lead activation pending**. Gitea user `linas` is assigned to both teams but remains inactive. The Harbor secret name is present; its value was neither requested nor accessed.
@@ -0,0 +1,14 @@
---
title: "AeroSim channel membership alignment"
description: "Record the approved onboarding of four channel-authorized people into the AeroSim team."
---
# AeroSim channel membership alignment
- **Approved by:** RootAtSkic (`<@1518725627845283888>`)
- **Approval evidence:** AeroSim General message `1543962382978514964`
- **Date:** 2026-08-31
Andrius (`<@204689314796273674>`, account `whyt6249`), Dovydas (`<@1543952051212656684>`, account `dovydaszelenkevicius`), Giedrius K (`<@1543940246071410706>`, account `giedriusk_62552`), and Jone Tamulaite - Nong (`<@1067100220321714278>`, account `jtamul`) are AeroSim human project members.
Each person has verified effective `VIEW_CHANNEL`, `SEND_MESSAGES`, and `READ_MESSAGE_HISTORY` access to `corp-v1-aerosim-general`. Their Gitea identities remain unresolved, so membership in `aerosim-maintainers` and `aerosim-skill-maintainers` is pending verified usernames or account creation. No Gitea identity was inferred from display-name similarity.
+19
View File
@@ -0,0 +1,19 @@
---
title: "Andrius"
description: "Identify Andrius's AeroSim project membership and verified access state."
---
# Andrius
| Field | Value |
|---|---|
| Status | Active |
| Discord | `<@204689314796273674>` — `whyt6249` / Andrius |
| Governance roles | AeroSim human team member |
| Team | [AeroSim Team](/teams/aerosim/) |
| Active projects | [AeroSim](/projects/aerosim/) |
| Gitea | Pending a verified username or account |
Andrius has verified effective `VIEW_CHANNEL`, `SEND_MESSAGES`, and `READ_MESSAGE_HISTORY` access to the AeroSim General channel. Gitea searches did not establish an unambiguous account mapping, so membership in `aerosim-maintainers` and `aerosim-skill-maintainers` remains pending.
The membership alignment was approved by RootAtSkic (`discord:1518725627845283888`) in AeroSim General message `1543962382978514964` on 2026-08-31.
+19
View File
@@ -0,0 +1,19 @@
---
title: "Dovydas"
description: "Identify Dovydas's AeroSim project membership and verified access state."
---
# Dovydas
| Field | Value |
|---|---|
| Status | Active |
| Discord | `<@1543952051212656684>` — `dovydaszelenkevicius` / Dovydas |
| Governance roles | AeroSim human team member |
| Team | [AeroSim Team](/teams/aerosim/) |
| Active projects | [AeroSim](/projects/aerosim/) |
| Gitea | Pending a verified username or account |
Dovydas has verified effective `VIEW_CHANNEL`, `SEND_MESSAGES`, and `READ_MESSAGE_HISTORY` access to the AeroSim General channel. No matching Gitea account was resolved, so membership in `aerosim-maintainers` and `aerosim-skill-maintainers` remains pending.
The membership alignment was approved by RootAtSkic (`discord:1518725627845283888`) in AeroSim General message `1543962382978514964` on 2026-08-31.
+19
View File
@@ -0,0 +1,19 @@
---
title: "Giedrius K"
description: "Identify Giedrius K's AeroSim project membership and verified access state."
---
# Giedrius K
| Field | Value |
|---|---|
| Status | Active |
| Discord | `<@1543940246071410706>` — `giedriusk_62552` / Giedrius K |
| Governance roles | AeroSim human team member |
| Team | [AeroSim Team](/teams/aerosim/) |
| Active projects | [AeroSim](/projects/aerosim/) |
| Gitea | Pending a verified username or account |
Giedrius K has verified effective `VIEW_CHANNEL`, `SEND_MESSAGES`, and `READ_MESSAGE_HISTORY` access to the AeroSim General channel. No matching Gitea account was resolved, so membership in `aerosim-maintainers` and `aerosim-skill-maintainers` remains pending.
The membership alignment was approved by RootAtSkic (`discord:1518725627845283888`) in AeroSim General message `1543962382978514964` on 2026-08-31.
+4
View File
@@ -16,5 +16,9 @@ sidebar_position: 1
| [Linas](/members/linas/) | Active | Board member; AeroSim member | AeroSim Team | 1 |
| [Jenny](/members/jenny/) | Active | Board member; AeroSim and Maze Next Gen member | AeroSim Team; Maze Next Gen Team | 2 |
| [Piotras](/members/piotras/) | Active | Board member; AeroSim and Maze Next Gen member | AeroSim Team; Maze Next Gen Team | 2 |
| [Andrius](/members/andrius/) | Active | AeroSim member | AeroSim Team | 1 |
| [Dovydas](/members/dovydas/) | Active | AeroSim member | AeroSim Team | 1 |
| [Giedrius K](/members/giedrius-k/) | Active | AeroSim member | AeroSim Team | 1 |
| [Jone Tamulaite - Nong](/members/jone-tamulaite-nong/) | Active | AeroSim member | AeroSim Team | 1 |
Only governance-relevant professional information belongs here. Do not store secrets, credentials, private contact details, or unnecessary personal data.
+19
View File
@@ -0,0 +1,19 @@
---
title: "Jone Tamulaite - Nong"
description: "Identify Jone Tamulaite - Nong's AeroSim project membership and verified access state."
---
# Jone Tamulaite - Nong
| Field | Value |
|---|---|
| Status | Active |
| Discord | `<@1067100220321714278>` — `jtamul` / Jone Tamulaite - Nong |
| Governance roles | AeroSim human team member |
| Team | [AeroSim Team](/teams/aerosim/) |
| Active projects | [AeroSim](/projects/aerosim/) |
| Gitea | Pending a verified username or account |
Jone Tamulaite - Nong has verified effective `VIEW_CHANNEL`, `SEND_MESSAGES`, and `READ_MESSAGE_HISTORY` access to the AeroSim General channel. No matching Gitea account was resolved, so membership in `aerosim-maintainers` and `aerosim-skill-maintainers` remains pending.
The membership alignment was approved by RootAtSkic (`discord:1518725627845283888`) in AeroSim General message `1543962382978514964` on 2026-08-31.
+2 -2
View File
@@ -9,9 +9,9 @@ description: "Identify Linas's Corp v1 Board and AeroSim responsibilities and ve
|---|---|
| Status | Active |
| Discord | `<@1483820991720329227>` — `linas_02251` / Linas |
| Governance roles | Corp v1 Board member; AeroSim human team member |
| Governance roles | Corp v1 Board member; AeroSim human team member; 3D Architecture Wizzard team lead |
| Gitea | `linas` — assigned; login activation pending |
Linas has verified Discord access to the Board and AeroSim channels and is assigned to both AeroSim Gitea organization teams.
Linas has verified Discord access to the Board and AeroSim channels and is assigned to both AeroSim Gitea organization teams and both 3D Architecture Wizzard teams. The `linas` account remains inactive, so effective 3D Architecture Wizzard Gitea access is pending activation.
The membership change was approved by RootAtSkic (`discord:1518725627845283888`) in Board message `1538808717301252116` on 2026-08-17.
+86
View File
@@ -0,0 +1,86 @@
---
title: 3D Architecture Wizzard
sidebar_position: 4
---
# 3D Architecture Wizzard
| Field | Value |
|---|---|
| Code | `3darch` |
| Status | Active — lead activation pending |
| Started | 2026-08-31 |
| Sponsor | RootAtSkic |
| Accountable lead | Linas |
| Initial members | Linas |
| Team | [3D Architecture Wizzard Team](/teams/3darch/) |
| Visibility | Public |
## Purpose
Create an interactive 3D application for exploring, designing, and communicating software and system architecture.
## Initial deliverable
A browser-based proof of concept that visualizes one architecture model in navigable 3D.
## Resources
- Project organization: [corp-v1-3darch](https://gitea.lego-cloud.eu/corp-v1-3darch)
- Skills organization: [corp-v1-3darch-skills-code-agent](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent)
- [Application repository](https://gitea.lego-cloud.eu/corp-v1-3darch/corp-v1-3darch) — `test` at `847c8291f100547ec9104743ab7d0d8761a5ec20`
- [Documentation repository](https://gitea.lego-cloud.eu/corp-v1-3darch/corp-v1-3darch-documentation) — `test` at `73cf70f0f333c187b28821fb76a44c779bdfbbdb`
- [Published documentation](https://pages.apps.lego-cloud.eu/corp-v1-3darch/corp-v1-3darch-documentation/)
- Global [Draw.io](https://gitea.lego-cloud.eu/home-v1-skills-code-agent/drawio-main) and [glossary governance](https://gitea.lego-cloud.eu/home-v1-skills-code-agent/corp-v1--glossary) references.
## Discord
Dedicated category `corp-v1-3darch` (`1543925242832101387`) contains exactly seven channels in lifecycle order:
- `corp-v1-3darch-general` — `1543925245755392051`
- `corp-v1-3darch-scope` — `1543925247361814568`
- `corp-v1-3darch-architecture` — `1543925248917770251`
- `corp-v1-3darch-ui-ux` — `1543925251191349260`
- `corp-v1-3darch-kanban` — `1543925252474798100`
- `corp-v1-3darch-delivery` — `1543925253502406749`
- `corp-v1-3darch-releases` — `1543925255523803146`
Hermes bot `1526860732917088266` posted purpose guidance in every channel, pinned the general introduction, and pinned the mapped project-skill guidance in every channel. No project scheduler job exists.
## Adopted project skills
All fourteen repositories are public, use default branch `test`, retain source history and assets, record immutable central source commits, and are assigned to the skills team:
- [`development-branching-strategy--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/development-branching-strategy--3darch) — source `test` / `636aba2b9e0957705fc874f07b310a4be9916f1c`, adopted `d0653755bda8104213e1e5aa3ce293a4a99ee8b3`
- [`development-gitops-argo-cd--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/development-gitops-argo-cd--3darch) — source `test` / `510b2bb590118362804d6036cbbf37db72dc21d0`, adopted `f4dd556573380363129bc9843b71d2630f2db393`
- [`development-monorepo-pnpm--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/development-monorepo-pnpm--3darch) — source `test` / `ff69bcca2fb3b673297230710a74c70410fd1996`, adopted `d6c800285f3393dd653350b6b7e3923e9d4c03e8`
- [`development-scripts--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/development-scripts--3darch) — source `test` / `5960d5e74713e6b95a403962f479b2b97cb76286`, adopted `ffdb143782833225fa3519e0108256e36c221e16`
- [`devsecops-ci-cd-gitea--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/devsecops-ci-cd-gitea--3darch) — source `test` / `8f46c3faa5ba074b8a48971b87365e0d3e2a4c40`, adopted `2fa1db97207685555f7a03cf26765db89d10cf6f`
- [`documentation-docusaurus--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/documentation-docusaurus--3darch) — source `test` / `f810f8c92005e5d55b08700b67fd34a37be435bc`, adopted `aaa49271748024b4ca97a015fb33a1847d5287ec`
- [`template-engine-copier--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/template-engine-copier--3darch) — source `test` / `97991021fff9e1f73202a82d29eea496ea0eb7aa`, adopted `73e4b53ee916269fe3c5d481e0d05bab0176711e`
- [`corp-v1-channel-general--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/corp-v1-channel-general--3darch) — source `test` / `a5e79c24dd4ec1fa0d1a3258ecc184d9808daa62`, adopted `1fff9bf1c9fbfe2693601a0e46c7de4c82c50298`
- [`corp-v1-channel-scope--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/corp-v1-channel-scope--3darch) — source `test` / `1916761e471535356bff38e2239aeb4d8fcd232d`, adopted `83d98aed66ac569ea8edfb18c9da4548942c0f1a`
- [`corp-v1-channel-architecture--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/corp-v1-channel-architecture--3darch) — source `test` / `c7620c804a0de210f35fc829a38a53e44d40bfd8`, adopted `31c62cedcc89f6b9f2ebba5a2c76ca4ae3111e6e`
- [`corp-v1-channel-ui-ux--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/corp-v1-channel-ui-ux--3darch) — source `test` / `de8c40cf43e08a63ca0be38a4b4404fbe2427885`, adopted `7a5dd48846ffce24be9c2541f00c7022faa56975`
- [`corp-v1-channel-kanban--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/corp-v1-channel-kanban--3darch) — source `test` / `87a50a926a7256201ce1771aad7764898f24ff60`, adopted `8c1e7fd3a749993f477566c249b8ba9111f5705c`
- [`corp-v1-channel-delivery--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/corp-v1-channel-delivery--3darch) — source `test` / `20cb78ce0942b35fe6528399c22764fbfb4cf06a`, adopted `2945874b0475901facef3bf6b4c36a845975ccc3`
- [`corp-v1-channel-releases--3darch`](https://gitea.lego-cloud.eu/corp-v1-3darch-skills-code-agent/corp-v1-channel-releases--3darch) — source `test` / `94d147880f6c957967d6612cbd846f9a2f2f6c00`, adopted `ced7e30deb06aa933d4a10cc232ecc05d700f274`
## Verification
- Application exact-head Actions: `1621` (success) at `847c8291f100547ec9104743ab7d0d8761a5ec20`.
- Documentation exact-head Actions: `1619` (success) at `73cf70f0f333c187b28821fb76a44c779bdfbbdb`.
- Documentation page body was read back through the Gondor operator path with the project title and initial-deliverable markers.
- Project team `3darch-maintainers` (`39`) covers both project repositories.
- Skills team `3darch-skill-maintainers` (`40`) covers all fourteen project-skill repositories.
- Gitea account `linas` is assigned to both teams, but its account remains inactive; effective human Gitea access is not claimed.
- Both required non-secret Harbor variables are configured. The organization secret name is present; its value was never requested or accessed.
- Board portal kickoff record was published and verified by exact-head Actions and deployed body readback.
## Outstanding gate
Linas must activate/sign in to Gitea account `linas`; team membership is already assigned.
## Approval
RootAtSkic (`discord:1518725627845283888`) requested setup in Board message `1543918340882436166` and approved the complete proposal in the same Board session, retaining the spelling **3D Architecture Wizzard**.
+17 -4
View File
@@ -11,7 +11,7 @@ sidebar_position: 1
| Status | Active — lifecycle alignment reviewed |
| Started | 2026-08-12 |
| Sponsor and accountable lead | RootAtSkic |
| Team members | RootAtSkic; Panther Skeleton; MartynasP; Eduard; Linas; Jenny; Piotras; `jarvis-at-skic` / Hermes code agent |
| Team members | RootAtSkic; Panther Skeleton; MartynasP; Eduard; Linas; Jenny; Piotras; Andrius; Dovydas; Giedrius K; Jone Tamulaite - Nong; `jarvis-at-skic` / Hermes code agent |
| Team | [AeroSim Team](/teams/aerosim/) |
## Purpose
@@ -48,10 +48,22 @@ A playable MVP covering a light trainer, commercial airliner, and fighter-style
- Project organization: [corp-v1-aerosim](https://gitea.lego-cloud.eu/corp-v1-aerosim)
- Skills organization: [corp-v1-aerosim-skills-code-agent](https://gitea.lego-cloud.eu/corp-v1-aerosim-skills-code-agent)
- [Application repository](https://gitea.lego-cloud.eu/corp-v1-aerosim/corp-v1-aerosim) — `test` at `14b5c0e8f25215d8bb4f41edcc0cdff4a87c342c`
- [Documentation repository](https://gitea.lego-cloud.eu/corp-v1-aerosim/corp-v1-aerosim-documentation) — `test` at `5f674525f6c8b5ce29fe2653350c6188fb97ea01`
- [Application repository](https://gitea.lego-cloud.eu/corp-v1-aerosim/corp-v1-aerosim) — `test` at `efbf3967548f1cbf5e06f97fa9d659535e35a7b4`
- [Documentation repository](https://gitea.lego-cloud.eu/corp-v1-aerosim/corp-v1-aerosim-documentation) — `test` at `f686610a8b1b21825c66dc424f484fb2672933d7`
- [Published documentation](https://pages.apps.lego-cloud.eu/corp-v1-aerosim/corp-v1-aerosim-documentation/) — protected by the existing Keycloak access layer
## Delivery progress checkpoint — 2026-09-03
Release `1.0.0` contains 114 Tasks. Progress is reported by lifecycle checkpoint rather than collapsing implementation and release into one percentage.
| Measure | Progress | Meaning |
|---|---:|---|
| Canonical `ToBeReleased` | 8 / 114 (7.0%) | Wave 1 Tasks `TASK-0001`, `TASK-0008`, `TASK-0011`, and `TASK-0014` plus Wave 2 Tasks `TASK-0012`, `TASK-0015`, `TASK-0073`, and `TASK-0114` have reconciled canonical delivery evidence. The remaining 106 ReadyForDelivery Tasks have not reached this checkpoint. |
| Repository-verified implementation | 8 / 114 (7.0%) | The same eight Tasks are implemented at application `test` SHA `efbf3967548f1cbf5e06f97fa9d659535e35a7b4`; integrated publish task `1760` and validate task `1761` succeeded. This implementation measure is reported separately from canonical lifecycle and release state. |
| Released | 0 / 114 (0%) | No Release `1.0.0` artifact has been approved and released. `ToBeReleased` is not release authorization. |
Wave 2 is complete: its final application head is `efbf3967548f1cbf5e06f97fa9d659535e35a7b4`, and its canonical documentation was merged through PR #143 at documentation `test` SHA `f686610a8b1b21825c66dc424f484fb2672933d7`. Documentation exact-head build task `1762` and integrated build task `1763` succeeded, and the deployed release-readiness readback passed. Wave 3 is active: `TASK-0013`, `TASK-0016`, `TASK-0074`, and `TASK-0115` are claimed and in progress, but are not yet implemented or merged. The authoritative task-level lifecycle remains in the [AeroSim documentation](https://pages.apps.lego-cloud.eu/corp-v1-aerosim/corp-v1-aerosim-documentation/); this Board record is a dated portfolio checkpoint, not a second task database.
## Discord
Exactly seven same-project channels exist in dedicated category `corp-v1-aerosim` (`1542627633123299359`), in lifecycle order:
@@ -105,6 +117,7 @@ Each repository records the central source branch and commit in `ADOPTION.md`. A
- Application tests: four passed across web, API, and shared flight core.
- Application and documentation production builds: passed.
- Project-team access across four current project-organization repositories: verified for `jarvis-at-skic`, `root-at-skic`, `martynas-pazusis`, and `piotras`; pending verified Gitea identities for Panther Skeleton, Eduard, and Jenny.
- Andrius, Dovydas, Giedrius K, and Jone Tamulaite - Nong are recorded as AeroSim human team members from 2026-08-31. Effective General-channel view, send, and history access is verified; Gitea project-team and skills-team access remains pending verified account mappings.
- Skills-team organization membership covers all fourteen current project-skill repositories for `piotras`: verified.
- Harbor organization variable names and secret name `HL_V1_HARBOR_ROBOT_GITEA_ACTIONS_V1_SECRET`: verified without reading secret values.
- Product lifecycle, solution traceability, and release-readiness registries now exist in project documentation. No Epic or Feature was assigned human approval retrospectively.
@@ -114,4 +127,4 @@ Each repository records the central source branch and commit in `ADOPTION.md`. A
A human team member must approve the desired branch-protection policy for both project `test` branches before protection is configured. No protection was added autonomously because required approvals and merge semantics are a governance decision.
Panther Skeleton, Eduard, and Jenny must provide or create their Gitea usernames before they can be added to `aerosim-maintainers` and `aerosim-skill-maintainers`. Piotras is mapped to Gitea account `piotras` and has verified membership in both teams, covering four current project repositories and fourteen project-skill repositories. Their Discord project access is already verified.
Panther Skeleton, Eduard, Jenny, Andrius, Dovydas, Giedrius K, and Jone Tamulaite - Nong must provide or create their Gitea usernames before they can be added to `aerosim-maintainers` and `aerosim-skill-maintainers`. Piotras is mapped to Gitea account `piotras` and has verified membership in both teams, covering four current project repositories and fourteen project-skill repositories. Their recorded Discord project access is already verified.
+1
View File
@@ -11,6 +11,7 @@ sidebar_position: 1
| [AeroSim](/projects/aerosim/) | Active — Harbor gated | RootAtSkic | RootAtSkic | [AeroSim Team](/teams/aerosim/) | 2026-08-12 | — |
| [Maze Next Gen](/projects/mazeng/) | Active — Harbor gated | RootAtSkic | RootAtSkic | [Maze Next Gen Team](/teams/mazeng/) | 2026-08-17 | — |
| [E-Shop v1](/projects/eshopv1/) | Active — application deployment gated | RootAtSkic | RootAtSkic | [E-Shop v1 Team](/teams/eshopv1/) | 2026-08-26 | — |
| [3D Architecture Wizzard](/projects/3darch/) | Active — lead activation pending | RootAtSkic | Linas | [3D Architecture Wizzard Team](/teams/3darch/) | 2026-08-31 | — |
## Required project record
+30
View File
@@ -0,0 +1,30 @@
---
title: 3D Architecture Wizzard Team
sidebar_position: 4
---
# 3D Architecture Wizzard Team
| Field | Value |
|---|---|
| Status | Active — Gitea lead activation pending |
| Lead | Linas |
| Members | Linas |
| Assigned project | [3D Architecture Wizzard](/projects/3darch/) |
## Mandate
Deliver the 3D Architecture Wizzard browser experience, its documentation, and the project-specific engineering practices required to operate it.
## Responsibilities
- Product and delivery coordination.
- Interactive 3D architecture visualization and model contracts.
- Application, CI/CD, GitOps, and documentation delivery.
- Adoption and maintenance of the fourteen mandatory project skills.
## Access
- Discord: `<@1483820991720329227>` — `linas_02251`; seven project channels provisioned and verified.
- Gitea: `linas` (user ID `21`) is assigned to both project teams, covering two project repositories and fourteen skill repositories.
- Gitea reports the account inactive, so effective login/write access remains pending activation.
+2 -1
View File
@@ -9,7 +9,7 @@ sidebar_position: 1
|---|---|
| Status | Active |
| Lead | RootAtSkic |
| Members | RootAtSkic; Panther Skeleton; MartynasP; Eduard; Linas; Jenny; Piotras; `jarvis-at-skic` / Hermes code agent |
| Members | RootAtSkic; Panther Skeleton; MartynasP; Eduard; Linas; Jenny; Piotras; Andrius; Dovydas; Giedrius K; Jone Tamulaite - Nong; `jarvis-at-skic` / Hermes code agent |
| Assigned project | [AeroSim](/projects/aerosim/) |
## Mandate
@@ -30,6 +30,7 @@ Deliver the AeroSim browser flight-simulation platform, its documentation, and t
- `jarvis-at-skic`, `root-at-skic`, `martynas-pazusis`, and `piotras` membership and effective repository assignments are verified in both teams.
- Piotras maps to Gitea account `piotras` and has verified membership in `aerosim-maintainers` and `aerosim-skill-maintainers`, covering four current project repositories and fourteen project-skill repositories.
- Panther Skeleton, Eduard, and Jenny have verified Discord identities and project access, but no matching Gitea accounts could be resolved. Their Gitea team access remains pending verified usernames or account creation.
- Andrius, Dovydas, Giedrius K, and Jone Tamulaite - Nong have verified effective Discord access to the AeroSim General channel. Their Gitea team access remains pending verified usernames or account creation; no account mapping was inferred from names alone.
## Communication
+1
View File
@@ -11,5 +11,6 @@ sidebar_position: 1
| [AeroSim Team](/teams/aerosim/) | Active | RootAtSkic | 8 | 1 |
| [Maze Next Gen Team](/teams/mazeng/) | Active | RootAtSkic | 4 | 1 |
| [E-Shop v1 Team](/teams/eshopv1/) | Active | RootAtSkic | 2 | 1 |
| [3D Architecture Wizzard Team](/teams/3darch/) | Active — Gitea lead activation pending | Linas | 1 | 1 |
A team record defines its mandate, lead, members, responsibilities, communication channels, and assigned projects.
+23
View File
@@ -0,0 +1,23 @@
---
title: "Ways of Working"
description: "Use the shared operating practices for participating safely and effectively in the Corp v1 pilot."
slug: /
sidebar_position: 1
---
# Ways of Working
Corp v1 is a governed AI-assisted delivery pilot. People set outcomes, authority, and constraints; Hermes helps turn those decisions into traceable designs, code, documentation, releases, and operated evidence.
Use this area to understand how to join the pilot, where work belongs, how decisions become delivery, and which evidence is required before something is called complete.
## Start here
1. Read [Onboarding](./onboarding) before contributing.
2. Find your project in the [project registry](/projects/).
3. Confirm your responsibilities in the [team](/teams/) and [member](/members/) registries.
4. Follow the [project lifecycle](/governance/project-lifecycle/) and the authority recorded for your project.
## Core principle
Keep conversation, decisions, implementation, deployment, and runtime proof connected—but do not treat them as the same thing. An approved idea is not implemented work; a merged change is not a deployed change; a healthy runtime is not release or product acceptance.
+117
View File
@@ -0,0 +1,117 @@
---
title: "Onboarding"
description: "Join the Corp v1 pilot with the right access, context, channel routing, authority, security practices, and evidence expectations."
sidebar_position: 1
---
# Onboarding
Use this page when joining the Corp v1 pilot or entering a project for the first time. You should finish with the right access, a clear role, and enough context to contribute without bypassing project governance.
## What the pilot is
Corp v1 tests whether one AI agent can support several focused project workstreams while people retain explicit authority and durable oversight. The pilot currently includes:
- [AeroSim](/projects/aerosim/)
- [Maze Next Gen](/projects/mazeng/)
- [E-Shop v1](/projects/eshopv1/)
The [Board](/board/) governs project kickoff, closure, and changes to the main Corp v1 operating model. Each project has its own sponsor, team, approved scope, repositories, documentation, Discord category, and preserved authority decisions.
## Your first 20 minutes
1. **Confirm your identity and role.** Check the [member registry](/members/) and your [team record](/teams/). If either is wrong, raise it before taking ownership of work.
2. **Open the project record.** Read its purpose, initial deliverable, current status, resources, and outstanding gates in the [project registry](/projects/).
3. **Open the project documentation.** It is the durable source for scope, architecture, design, Kanban state, ways of working, engineering guidance, and release evidence.
4. **Verify Discord access.** Every project has one dedicated `corp-v1-<code>` category with seven lifecycle channels. Confirm that you can see the channels needed for your role and read their pinned guidance.
5. **Verify Gitea access.** Confirm access to the project and skills organizations through the appropriate teams. Do not request direct repository access when team membership is the intended route.
6. **Choose one current outcome.** Start from an existing Epic, Feature, task, issue, design package, or release gate. Do not create parallel records because an item is difficult to find.
## Use the seven channels correctly
Work moves through this shared lifecycle:
```text
General → Scope → Architecture → UI/UX → Kanban → Delivery → Releases
```
| Channel | Use it for |
|---|---|
| **General** | Project-wide direction, coordination, questions, outcomes, and cross-channel issues |
| **Scope** | Ideas, Epics, Features, value, acceptance outcomes, and product decisions |
| **Architecture** | Solution design, interfaces, constraints, risks, and implementation task definitions |
| **UI/UX** | User journeys, Penpot designs, responsive behavior, accessibility, and implementation handoff |
| **Kanban** | Flow visibility, task admission, sequencing, dependencies, and blockers |
| **Delivery** | Implementation, tests, reviews, CI, build health, and delivery evidence |
| **Releases** | Version readiness, changelogs, deployment approval, rollout, rollback, and runtime verification |
Post in the channel that owns the decision or artifact. Cross-link evidence instead of copying whole conversations between channels. Keep one project’s information inside that project’s seven-channel boundary unless a Board-level concern requires escalation.
## Understand authority
- **Board authority** covers project kickoff, project closure, and changes to `corp-v1--main`.
- **Project-team authority** covers decisions inside the project’s approved boundary.
- **Hermes authority** is project-specific. It may range from preparing proposals to full delegated delivery and merge authority. Use the preserved project record and channel skill; never infer authority from activity, silence, CI success, or an agent statement.
- **Explicit gates remain explicit.** A decision must identify the item, actor, conditions, and evidence. Delegation changes who may decide; it does not remove security, quality, traceability, or validation gates.
When authority is unclear, stop at a reversible proposal and ask in the owning channel.
## Know what “done” means
Keep these states separate:
1. **Approved** — an authorized person or delegate accepted the exact scope or decision.
2. **Implemented** — source changes exist and passed the required local/review checks.
3. **Merged** — the reviewed change is integrated into the repository’s default branch.
4. **Deployed / runtime verified** — the intended immutable revision is running and has passed live readback or acceptance checks.
5. **Released / accepted** — the project’s release authority approved the version and required outcomes.
Always state the highest level actually proven and link the evidence. Do not use “live” as a shortcut for release approval or product maturity.
## Security and credentials
- Never paste passwords, tokens, API keys, connection strings, secret values, or Bitwarden object metadata into Discord, issues, repositories, prompts, screenshots, or documentation.
- Use the approved SSO and secret-injection paths. A credential being available does not authorize unrelated access, account administration, spending, or destructive work.
- Record secret **names and readiness only** when governance requires it.
- Report suspected exposure immediately in the owning project and follow the approved rotation path.
- Treat private project repositories, project-channel history, and customer or operational data as project-bound information.
## How to make a useful contribution
A useful contribution is small enough to review and complete, but durable enough to help the next person:
- start from a stable item or create a clearly marked proposal;
- cite the source message, decision, requirement, design, issue, or runtime observation;
- work in the owning channel and canonical repository;
- preserve project naming, branch, testing, and documentation conventions;
- run the required validation and match CI to the exact commit;
- read back remote and deployed state before claiming completion;
- report the outcome, evidence, remaining gates, owner, and next action concisely.
If a task crosses channels, finish the source-owned result and hand off one clear requested action with evidence and unresolved risks.
## Where truth lives
| Information | Authoritative location |
|---|---|
| Portfolio governance, Board decisions, teams, and project registry | This Corp v1 portal |
| Product scope and project delivery records | Project documentation repository and deployed documentation |
| Source, reviews, commits, CI, and releases | Project Gitea repositories |
| Discussion, approvals, coordination, and handoffs | Exact project Discord channels and message IDs |
| Deployment and runtime state | GitOps source, Argo CD, workload state, and live acceptance evidence |
| Editable interface design | Project-owned Penpot files linked from project records |
No single status message replaces these sources. Reconcile them when they disagree.
## Onboarding complete
You are ready to contribute when you can answer:
- Which project and outcome am I supporting?
- What is my role and decision authority?
- Which channel owns my next action?
- Where is the canonical record?
- What evidence is required before I call it complete?
- Which security or release gates still apply?
If any answer is missing, ask in the project’s **General** channel and link the record you already checked.
+5 -2
View File
@@ -39,6 +39,7 @@ const config: Config = {
['@docusaurus/plugin-content-docs', {...docsCommon, id: 'projects', path: 'docs/projects', routeBasePath: 'projects', sidebarPath: './sidebars/projects.ts'}],
['@docusaurus/plugin-content-docs', {...docsCommon, id: 'teams', path: 'docs/teams', routeBasePath: 'teams', sidebarPath: './sidebars/teams.ts'}],
['@docusaurus/plugin-content-docs', {...docsCommon, id: 'members', path: 'docs/members', routeBasePath: 'members', sidebarPath: './sidebars/members.ts'}],
['@docusaurus/plugin-content-docs', {...docsCommon, id: 'ways-of-working', path: 'docs/ways-of-working', routeBasePath: 'ways-of-working', sidebarPath: './sidebars/ways-of-working.ts'}],
['@docusaurus/plugin-content-docs', {...docsCommon, id: 'board', path: 'docs/board', routeBasePath: 'board', sidebarPath: './sidebars/board.ts'}],
['@docusaurus/plugin-content-docs', {...docsCommon, id: 'governance', path: 'docs/governance', routeBasePath: 'governance', sidebarPath: './sidebars/governance.ts'}],
],
@@ -49,7 +50,7 @@ const config: Config = {
indexDocs: true,
indexBlog: false,
indexPages: true,
docsRouteBasePath: ['/', 'architecture-high-level', 'projects', 'teams', 'members', 'board', 'governance'],
docsRouteBasePath: ['/', 'architecture-high-level', 'projects', 'teams', 'members', 'ways-of-working', 'board', 'governance'],
language: ['en'],
highlightSearchTermsOnTargetPage: true,
explicitSearchResultPath: true,
@@ -62,11 +63,12 @@ const config: Config = {
navbar: {
title: 'CORP V1 / BOARD',
items: [
{type: 'docSidebar', sidebarId: 'boardSidebar', docsPluginId: 'board', label: 'Board', position: 'left'},
{type: 'docSidebar', sidebarId: 'projectsSidebar', docsPluginId: 'projects', label: 'Projects', position: 'left'},
{type: 'docSidebar', sidebarId: 'teamsSidebar', docsPluginId: 'teams', label: 'Teams', position: 'left'},
{type: 'docSidebar', sidebarId: 'membersSidebar', docsPluginId: 'members', label: 'Members', position: 'left'},
{type: 'docSidebar', sidebarId: 'boardSidebar', docsPluginId: 'board', label: 'Board', position: 'left'},
{type: 'docSidebar', sidebarId: 'governanceSidebar', docsPluginId: 'governance', label: 'Governance', position: 'left'},
{type: 'docSidebar', sidebarId: 'waysOfWorkingSidebar', docsPluginId: 'ways-of-working', label: 'Ways of Working', position: 'left'},
{type: 'docSidebar', sidebarId: 'architectureHighLevelSidebar', docsPluginId: 'architecture-high-level', label: 'Architecture', position: 'left'},
{href: 'https://gitea.lego-cloud.eu/corp-v1/portal', label: 'Gitea ↗', position: 'right'},
],
@@ -76,6 +78,7 @@ const config: Config = {
links: [{title: 'Registry', items: [
{label: 'Architecture', to: '/architecture-high-level/context/'},
{label: 'Projects', to: '/projects/'},
{label: 'Ways of Working', to: '/ways-of-working/'},
{label: 'Teams', to: '/teams/'},
{label: 'Members', to: '/members/'},
{label: 'Board', to: '/board/'},
+366 -4
View File
@@ -21,16 +21,29 @@ for (const section of ['projects', 'teams', 'members', 'board', 'governance']) {
assert.match(config, new RegExp(`sidebarId:\\s*'${section}Sidebar'`), `${section} navbar item does not target its dedicated sidebar`);
assert.ok(existsSync(join(root, `sidebars/${section}.ts`)), `${section} sidebar file is missing`);
}
assert.match(config, /id:\s*'ways-of-working'/, 'Ways of Working docs plugin is missing');
assert.match(config, /sidebarId:\s*'waysOfWorkingSidebar'/, 'Ways of Working navbar item does not target its dedicated sidebar');
assert.ok(existsSync(join(root, 'sidebars/ways-of-working.ts')), 'Ways of Working sidebar file is missing');
assert.ok(existsSync(join(root, 'docs/ways-of-working/index.md')), 'Ways of Working entry page is missing');
assert.ok(existsSync(join(root, 'docs/ways-of-working/onboarding.md')), 'Onboarding page is missing');
assert.match(config, /id:\s*'architecture-high-level'/, 'Architecture High Level docs plugin is missing');
assert.match(config, /sidebarId:\s*'architectureHighLevelSidebar'/, 'Architecture High Level navbar item does not target its dedicated sidebar');
assert.match(config, /label:\s*'Architecture'/, 'Architecture navbar label is missing');
assert.doesNotMatch(config, /label:\s*'Architecture High Level'/, 'legacy Architecture High Level menu label must not remain');
assert.ok(existsSync(join(root, 'sidebars/architecture-high-level.ts')), 'Architecture High Level sidebar file is missing');
const expectedLeftNavLabels = ['Projects', 'Teams', 'Members', 'Board', 'Governance', 'Architecture'];
const expectedLeftNavLabels = ['Board', 'Projects', 'Teams', 'Members', 'Governance', 'Ways of Working', 'Architecture'];
const leftNavLabels = [...config.matchAll(/\{type:\s*'docSidebar',[^\n]+label:\s*'([^']+)',\s*position:\s*'left'\}/g)]
.map((match) => match[1]);
assert.deepEqual(leftNavLabels, expectedLeftNavLabels, 'Architecture must be the final left-side menu item');
assert.deepEqual(leftNavLabels, expectedLeftNavLabels, 'Top-level navigation must follow the approved Board-first order');
const waysOfWorkingSidebar = read('sidebars/ways-of-working.ts');
assert.match(waysOfWorkingSidebar, /link:\s*\{type:\s*'doc',\s*id:\s*'index'\}/, 'Ways of Working must link to its entry page');
assert.match(waysOfWorkingSidebar, /items:\s*\[\{type:\s*'doc',\s*id:\s*'onboarding',\s*label:\s*'Onboarding'\}\]/, 'Onboarding must be the first child page');
const onboarding = read('docs/ways-of-working/onboarding.md');
for (const term of ['Your first 20 minutes', 'Use the seven channels correctly', 'Understand authority', 'Know what “done” means', 'Security and credentials', 'Onboarding complete']) {
assert.ok(onboarding.includes(term), `Onboarding is missing: ${term}`);
}
assert.match(config, /baseUrl:\s*'\/corp-v1\/portal\/'/, 'Pages base URL must follow the renamed repository');
assert.match(config, /projectName:\s*'portal'/, 'Docusaurus project name must be portal');
@@ -44,6 +57,355 @@ for (const memberId of ['1518725627845283888', '476287310627864587', '7731098554
assert.match(board, /Only these Board members may approve a project kickoff or project closure/i);
assert.match(board, /Only these Board members may approve changes to `corp-v1--main`/i);
const aerosimProject = read('docs/projects/aerosim.md');
const APP_SHA = 'efbf3967548f1cbf5e06f97fa9d659535e35a7b4';
const DOC_SHA = 'f686610a8b1b21825c66dc424f484fb2672933d7';
const markdownSection = (document, heading) => {
const marker = `## ${heading}`;
const start = document.indexOf(marker);
assert.notEqual(start, -1, `AeroSim section is missing: ${heading}`);
const end = document.indexOf('\n## ', start + marker.length);
return document.slice(start, end === -1 ? document.length : end);
};
const uniqueLine = (text, predicate, description) => {
const matches = text.split('\n').filter(predicate);
assert.equal(matches.length, 1, `AeroSim must contain exactly one ${description}`);
return matches[0];
};
function verifyAeroSimProject(document) {
const requiredSectionHeadings = [
'Resources',
'Delivery progress checkpoint — 2026-09-03',
'Discord',
];
const documentLines = document.split('\n');
const requiredSectionIndices = requiredSectionHeadings.map((heading) => {
const indices = documentLines.flatMap((line, index) => line === `## ${heading}` ? [index] : []);
assert.equal(indices.length, 1, `AeroSim required section heading must appear exactly once: ${heading}`);
return indices[0];
});
assert.ok(
requiredSectionIndices.every((index, position) => position === 0 || requiredSectionIndices[position - 1] < index),
'AeroSim required sections must follow Resources, checkpoint, Discord order',
);
for (const marker of [
'Delivery progress checkpoint — 2026-09-03',
'8 / 114',
'7.0%',
'0 / 114',
'TASK-0012',
'TASK-0015',
'TASK-0073',
'TASK-0114',
'TASK-0013',
'TASK-0016',
'TASK-0074',
'TASK-0115',
'PR #143',
'1760',
'1761',
'1762',
'1763',
'efbf3967548f1cbf5e06f97fa9d659535e35a7b4',
'f686610a8b1b21825c66dc424f484fb2672933d7',
'106 ReadyForDelivery',
]) {
assert.ok(document.includes(marker), `AeroSim progress checkpoint is missing: ${marker}`);
}
const resources = markdownSection(document, 'Resources');
const applicationResource = uniqueLine(resources, (line) => line.startsWith('- [Application repository]'), 'application repository resource');
const documentationResource = uniqueLine(resources, (line) => line.startsWith('- [Documentation repository]'), 'documentation repository resource');
assert.match(applicationResource, new RegExp(`application.*\\b${APP_SHA}\\b`, 'i'), 'application repository must reference the application SHA');
assert.match(documentationResource, new RegExp(`documentation.*\\b${DOC_SHA}\\b`, 'i'), 'documentation repository must reference the documentation SHA');
const checkpoint = markdownSection(document, 'Delivery progress checkpoint — 2026-09-03');
const checkpointLines = checkpoint.split('\n');
const checkpointTableHeader = '| Measure | Progress | Meaning |';
const checkpointTableHeaderIndices = checkpointLines.flatMap(
(line, index) => line === checkpointTableHeader ? [index] : [],
);
assert.equal(checkpointTableHeaderIndices.length, 1, 'AeroSim checkpoint table header must appear exactly once');
const checkpointTableHeaderIndex = checkpointTableHeaderIndices[0];
assert.equal(
checkpointLines[checkpointTableHeaderIndex + 1],
'|---|---:|---|',
'AeroSim checkpoint table separator must exactly preserve its three columns and progress alignment',
);
assert.deepEqual(
checkpointLines.slice(checkpointTableHeaderIndex + 2, checkpointTableHeaderIndex + 5).map(
(line) => line.match(/^\| (Canonical `ToBeReleased`|Repository-verified implementation|Released) \|/)?.[1],
),
['Canonical `ToBeReleased`', 'Repository-verified implementation', 'Released'],
'AeroSim checkpoint rows must follow canonical, implementation, released order',
);
const canonicalRow = uniqueLine(checkpoint, (line) => line.startsWith('| Canonical `ToBeReleased` |'), 'canonical ToBeReleased row');
const implementationRow = uniqueLine(checkpoint, (line) => line.startsWith('| Repository-verified implementation |'), 'repository-verified implementation row');
const releasedRow = uniqueLine(checkpoint, (line) => line.startsWith('| Released |'), 'released row');
const waveStatus = uniqueLine(checkpoint, (line) => line.startsWith('Wave 2 is complete:'), 'Wave 2/Wave 3 status paragraph');
assert.match(releasedRow, /\|\s*0\s*\/\s*114\s*\(0%\)/i, 'AeroSim must distinguish released progress');
assert.match(canonicalRow, /\|\s*8\s*\/\s*114\s*\(7\.0%\)/i, 'AeroSim must expose canonical delivery completion');
assert.match(implementationRow, /\|\s*8\s*\/\s*114\s*\(7\.0%\)/i, 'AeroSim must expose repository-verified implementation separately');
assert.match(
canonicalRow,
/Wave 2 Tasks `TASK-0012`, `TASK-0015`, `TASK-0073`, and `TASK-0114`/,
'AeroSim Wave 2 task group must remain on the canonical completion row',
);
assert.match(
implementationRow,
new RegExp('application `test` SHA `' + APP_SHA + '`; integrated publish task `1760` and validate task `1761` succeeded', 'i'),
'AeroSim implementation row must bind the application SHA, publish task 1760, and validate task 1761',
);
assert.match(waveStatus, new RegExp('final application head is `' + APP_SHA + '`'), 'Wave 2 status must bind the final application head to the application SHA');
assert.match(waveStatus, new RegExp('documentation `test` SHA `' + DOC_SHA + '`'), 'Wave 2 status must bind the documentation merge to the documentation SHA');
assert.match(
waveStatus,
/Documentation exact-head build task `1762` and integrated build task `1763` succeeded/,
'Wave 2 status must bind exact-head build task 1762 and integrated build task 1763',
);
assert.match(
waveStatus,
/Wave 3 is active: `TASK-0013`, `TASK-0016`, `TASK-0074`, and `TASK-0115` are claimed/,
'AeroSim Wave 3 task group must remain in the active Wave 3 clause',
);
assert.match(waveStatus, /Wave 3[^\n]*claimed[^\n]*not (?:yet )?implemented or merged/i, 'AeroSim must distinguish active Wave 3 claims from implementation');
assert.match(waveStatus, /dated portfolio checkpoint, not a second task database/i, 'AeroSim must remain a non-authoritative portfolio checkpoint');
for (const [staleMarker, stalePattern] of [
['4 / 114', /(?<!\d)4\s*\/\s*114(?!\d)/],
['3.5%', /(?<![\d.])3\.5%(?![\d.])/],
['5 / 114', /(?<!\d)5\s*\/\s*114(?!\d)/],
['4.4%', /(?<![\d.])4\.4%(?![\d.])/],
['58d33ffbd3ca21ffdc5882a75de8fe71c25188b6', /58d33ffbd3ca21ffdc5882a75de8fe71c25188b6/],
['29d5e7810e63f3407f62730c1b2c71bc0644310b', /29d5e7810e63f3407f62730c1b2c71bc0644310b/],
]) {
assert.doesNotMatch(document, stalePattern, `stale AeroSim checkpoint marker must not remain: ${staleMarker}`);
}
assert.doesNotMatch(waveStatus, /Wave 2 is active/i, 'Wave 2 must not remain active');
}
verifyAeroSimProject(aerosimProject);
if (process.argv.includes('--self-test')) {
const replaceExactly = (document, oldText, newText) => {
assert.equal(document.split(oldText).length - 1, 1, `mutation fixture must find exactly one occurrence: ${oldText}`);
return document.replace(oldText, newText);
};
const swap = (document, left, right) => {
const placeholder = '__VERIFY_PORTAL_MUTATION_PLACEHOLDER__';
return replaceExactly(replaceExactly(replaceExactly(document, left, placeholder), right, left), placeholder, right);
};
const swapAll = (document, left, right) => {
assert.ok(document.includes(left), `mutation fixture must find: ${left}`);
assert.ok(document.includes(right), `mutation fixture must find: ${right}`);
const placeholder = '__VERIFY_PORTAL_MUTATION_PLACEHOLDER__';
return document.replaceAll(left, placeholder).replaceAll(right, left).replaceAll(placeholder, right);
};
const checkpointRow = (document, prefix) => uniqueLine(
markdownSection(document, 'Delivery progress checkpoint — 2026-09-03'),
(line) => line.startsWith(prefix),
`${prefix} mutation source row`,
);
const sectionBlock = (document, heading) => {
const section = markdownSection(document, heading);
return section.endsWith('\n') ? section : `${section}\n`;
};
const futureCountFixtures = [14, 15, 24, 25, 114].flatMap((count) => [
{
name: `accepts legitimate future count ${count} / 114`,
document: replaceExactly(
aerosimProject,
'Release `1.0.0` contains 114 Tasks.',
`Release \`1.0.0\` contains 114 Tasks. Forecast example: ${count} / 114.`,
),
accepted: true,
},
{
name: `accepts legitimate compact future count ${count}/114`,
document: replaceExactly(
aerosimProject,
'Release `1.0.0` contains 114 Tasks.',
`Release \`1.0.0\` contains 114 Tasks. Forecast example: ${count}/114.`,
),
accepted: true,
},
]);
const staleCountFixtures = [4, 5].flatMap((count) => [
{
name: `rejects stale count ${count} / 114`,
document: replaceExactly(
aerosimProject,
'Release `1.0.0` contains 114 Tasks.',
`Release \`1.0.0\` contains 114 Tasks. Superseded snapshot: ${count} / 114.`,
),
accepted: false,
message: new RegExp(`stale AeroSim checkpoint marker must not remain: ${count} / 114`),
},
{
name: `rejects compact stale count ${count}/114`,
document: replaceExactly(
aerosimProject,
'Release `1.0.0` contains 114 Tasks.',
`Release \`1.0.0\` contains 114 Tasks. Superseded snapshot: ${count}/114.`,
),
accepted: false,
message: new RegExp(`stale AeroSim checkpoint marker must not remain: ${count} / 114`),
},
]);
const canonicalRowFixture = checkpointRow(aerosimProject, '| Canonical `ToBeReleased` |');
const implementationRowFixture = checkpointRow(aerosimProject, '| Repository-verified implementation |');
const releasedRowFixture = checkpointRow(aerosimProject, '| Released |');
const resourcesSectionFixture = sectionBlock(aerosimProject, 'Resources');
const checkpointSectionFixture = sectionBlock(aerosimProject, 'Delivery progress checkpoint — 2026-09-03');
const discordSectionFixture = sectionBlock(aerosimProject, 'Discord');
const fixtures = [
...futureCountFixtures,
...staleCountFixtures,
{
name: 'rejects removed checkpoint table header',
document: replaceExactly(aerosimProject, '| Measure | Progress | Meaning |\n', ''),
accepted: false,
message: /checkpoint table header/,
},
{
name: 'rejects malformed checkpoint table header',
document: replaceExactly(aerosimProject, '| Measure | Progress | Meaning |', '| Measure | Meaning | Progress |'),
accepted: false,
message: /checkpoint table header/,
},
{
name: 'rejects removed checkpoint table separator',
document: replaceExactly(aerosimProject, '|---|---:|---|\n', ''),
accepted: false,
message: /checkpoint table separator/,
},
{
name: 'rejects malformed checkpoint table separator',
document: replaceExactly(aerosimProject, '|---|---:|---|', '|---|---|---|'),
accepted: false,
message: /checkpoint table separator/,
},
{
name: 'rejects swapped canonical and implementation rows',
document: swap(aerosimProject, canonicalRowFixture, implementationRowFixture),
accepted: false,
message: /checkpoint rows must follow canonical, implementation, released order/,
},
{
name: 'rejects swapped implementation and released rows',
document: swap(aerosimProject, implementationRowFixture, releasedRowFixture),
accepted: false,
message: /checkpoint rows must follow canonical, implementation, released order/,
},
{
name: 'rejects removed Resources heading',
document: replaceExactly(aerosimProject, '## Resources\n', ''),
accepted: false,
message: /required section heading.*Resources/i,
},
{
name: 'rejects renamed Resources heading',
document: replaceExactly(aerosimProject, '## Resources', '## Project resources'),
accepted: false,
message: /required section heading.*Resources/i,
},
{
name: 'rejects removed checkpoint heading',
document: replaceExactly(aerosimProject, '## Delivery progress checkpoint — 2026-09-03\n', ''),
accepted: false,
message: /required section heading.*Delivery progress checkpoint/i,
},
{
name: 'rejects renamed checkpoint heading',
document: replaceExactly(aerosimProject, '## Delivery progress checkpoint — 2026-09-03', '## Delivery status — 2026-09-03'),
accepted: false,
message: /required section heading.*Delivery progress checkpoint/i,
},
{
name: 'rejects removed Discord heading',
document: replaceExactly(aerosimProject, '## Discord\n', ''),
accepted: false,
message: /required section heading.*Discord/i,
},
{
name: 'rejects renamed Discord heading',
document: replaceExactly(aerosimProject, '## Discord', '## Project channels'),
accepted: false,
message: /required section heading.*Discord/i,
},
{
name: 'rejects Resources and checkpoint sections in reverse order',
document: swap(aerosimProject, resourcesSectionFixture, checkpointSectionFixture),
accepted: false,
message: /required sections must follow Resources, checkpoint, Discord order/,
},
{
name: 'rejects checkpoint and Discord sections in reverse order',
document: swap(aerosimProject, checkpointSectionFixture, discordSectionFixture),
accepted: false,
message: /required sections must follow Resources, checkpoint, Discord order/,
},
{
name: 'rejects swapped application and documentation SHA associations',
document: swapAll(aerosimProject, APP_SHA, DOC_SHA),
accepted: false,
message: /application repository.*SHA|documentation repository.*SHA/i,
},
{
name: 'rejects swapped publish and validate CI task associations',
document: replaceExactly(
aerosimProject,
'publish task `1760` and validate task `1761`',
'publish task `1761` and validate task `1760`',
),
accepted: false,
message: /publish task.*1760|validate task.*1761/i,
},
{
name: 'rejects swapped documentation CI task associations',
document: replaceExactly(
aerosimProject,
'exact-head build task `1762` and integrated build task `1763`',
'exact-head build task `1763` and integrated build task `1762`',
),
accepted: false,
message: /exact-head build task.*1762|integrated build task.*1763/i,
},
{
name: 'rejects Wave 2 and Wave 3 task-group permutations',
document: swap(
aerosimProject,
'`TASK-0012`, `TASK-0015`, `TASK-0073`, and `TASK-0114`',
'`TASK-0013`, `TASK-0016`, `TASK-0074`, and `TASK-0115`',
),
accepted: false,
message: /Wave 2 task group|Wave 3 task group/i,
},
];
const failures = [];
for (const fixture of fixtures) {
try {
verifyAeroSimProject(fixture.document);
if (!fixture.accepted) throw new assert.AssertionError({message: 'mutated document was incorrectly accepted'});
console.log(`ok - ${fixture.name}`);
} catch (error) {
if (!fixture.accepted && fixture.message?.test(error.message)) {
console.log(`ok - ${fixture.name}`);
} else {
failures.push(`${fixture.name}: ${error.message}`);
console.error(`not ok - ${fixture.name}: ${error.message}`);
}
}
}
assert.equal(failures.length, 0, `AeroSim verifier self-tests failed:\n${failures.join('\n')}`);
console.log('AeroSim verifier self-tests passed.');
}
const lifecycle = read('docs/governance/project-lifecycle.md');
assert.match(lifecycle, /Board approval/i, 'project lifecycle must require Board approval');
assert.match(lifecycle, /central project-channel reference skill/i, 'lifecycle must govern central channel-reference skill changes');
@@ -68,7 +430,7 @@ assert.match(config, /indexPages:\s*true/, 'custom pages must be indexed');
const searchRoutesMatch = config.match(/docsRouteBasePath:\s*\[([^\]]+)\]/);
assert.ok(searchRoutesMatch, 'search route configuration is missing');
const searchRoutes = searchRoutesMatch[1];
for (const route of ['/', 'architecture-high-level', 'projects', 'teams', 'members', 'board', 'governance']) {
for (const route of ['/', 'architecture-high-level', 'projects', 'teams', 'members', 'ways-of-working', 'board', 'governance']) {
assert.ok(searchRoutes.includes(`'${route}'`), `search does not include route base ${route}`);
}
@@ -145,7 +507,7 @@ if (existsSync(join(root, 'build'))) {
const filename = readdirSync(join(root, 'build')).find((name) => /^search-index(?:-[a-f0-9]+)?\.json$/.test(name));
assert.ok(filename, 'production search index is missing');
const search = readFileSync(join(root, 'build', filename), 'utf8').toLowerCase();
for (const term of ['projects registry', 'teams registry', 'members registry', 'board members', 'project lifecycle', 'corp v1 board', 'container overview', 'operating model', 'overview channels', 'overview skills', 'overview repositories']) {
for (const term of ['projects registry', 'teams registry', 'members registry', 'board members', 'project lifecycle', 'corp v1 board', 'ways of working', 'your first 20 minutes', 'onboarding complete', 'container overview', 'operating model', 'overview channels', 'overview skills', 'overview repositories']) {
assert.ok(search.includes(term), `search index is missing: ${term}`);
}
}
+15
View File
@@ -0,0 +1,15 @@
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
const sidebars: SidebarsConfig = {
waysOfWorkingSidebar: [
{
type: 'category',
label: 'Ways of Working',
link: {type: 'doc', id: 'index'},
collapsed: false,
items: [{type: 'doc', id: 'onboarding', label: 'Onboarding'}],
},
],
};
export default sidebars;