Compare commits

...
Author SHA1 Message Date
jarvis-at-skic fcbed3e8ee Merge pull request 'governance: transition AeroSim Scope ownership' (#26) from governance/aerosim-scope-owner-transition-20260928 into main
Build and publish Corp v1 Board portal / build (push) Successful in 52s
2026-09-28 03:16:35 -07:00
jarvis-at-skic efb6115531 governance: transition AeroSim Scope ownership
Build and publish Corp v1 Board portal / build (pull_request) Successful in 52s
2026-09-28 10:07:03 +00:00
jarvis-at-skic 6fc3f9f74b docs: update AeroSim Wave 15 portfolio roll-up
Build and publish Corp v1 Board portal / build (push) Successful in 37s
Reviewed portfolio reconciliation with exact-head CI.
2026-09-06 21:42:01 -07:00
jarvis-at-skic 61aa7d6454 [verified] docs: update AeroSim Wave 15 roll-up
Build and publish Corp v1 Board portal / build (pull_request) Successful in 40s
2026-09-07 04:40:52 +00:00
jarvis-at-skic 5e2857e918 Merge pull request 'Governance: onboard Friday to portal and Discord workspaces' (#24) from governance/friday-portal-discord-onboarding into main
Build and publish Corp v1 Board portal / build (push) Successful in 40s
Record Friday portal and Discord onboarding
2026-09-05 04:52:03 -07:00
10 changed files with 169 additions and 121 deletions
@@ -0,0 +1,26 @@
---
title: AeroSim Scope Owner Transition
description: Record Jone Tamulaite - Nong's offboarding and MartynasP's appointment as primary AeroSim Scope owner.
---
# AeroSim Scope Owner Transition
- **Status:** Approved
- **Decision date:** 2026-09-28
- **Approver:** RootAtSkic (`discord:1518725627845283888`)
- **Evidence:** AeroSim Scope message `1554069052773900391`
- **Affected project:** [AeroSim](/projects/aerosim/)
## Decision
1. Jone Tamulaite - Nong (`discord:1067100220321714278`) leaves the AeroSim project and relinquishes the primary Scope-owner role.
2. MartynasP (`discord:773109855497093191`) succeeds Jone as primary AeroSim Scope owner.
3. MartynasP may make routine Epic and Feature lifecycle, priority, outcome, and `Approved for Solution` decisions under the existing AeroSim Scope authority contract.
4. RootAtSkic remains backup owner across all AeroSim domains.
5. Historical decisions made under the prior ownership assignment remain preserved; this decision changes current authority prospectively.
## Access consequences
- MartynasP was already an AeroSim team member and has a verified Gitea identity, `martynas-pazusis`, in both AeroSim organization teams; onboarding does not require duplicate team membership.
- Jone never had a verified Gitea mapping or membership in either AeroSim organization team, so there is no Gitea team membership to revoke.
- Jone's Discord project access must be removed and MartynasP's effective view, send, and history permissions across the current eight-channel project topology must be freshly verified before operational offboarding/onboarding is closed.
+2 -2
View File
@@ -12,7 +12,7 @@ sidebar_position: 1
| [Jarvis at SKIC](/members/jarvis-at-skic/) | Active | Board member; executing code agent; all-project technical member | AeroSim; Maze Next Gen; E-Shop v1; 3D Architecture Wizzard; DPVP | 5 |
| [Friday Jr at SKIC](/members/friday-at-skic/) | Access provisioned; Gitea activation pending | Board-support and all-project code agent; no human decision authority | 3D Architecture Wizzard; AeroSim; E-Shop v1; Maze Next Gen; DPVP Discord workspace | 5 |
| [Panther Skeleton](/members/panther-skeleton/) | Active | Board member; AeroSim member | AeroSim Team | 1 |
| [MartynasP](/members/martynasp/) | Active | Board member; AeroSim member | AeroSim Team | 1 |
| [MartynasP](/members/martynasp/) | Active | Board member; AeroSim primary Scope owner | AeroSim Team | 1 |
| [Eduard](/members/eduard/) | Active | Board member; AeroSim member | AeroSim Team | 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 |
@@ -20,6 +20,6 @@ sidebar_position: 1
| [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 |
| [Jone Tamulaite - Nong](/members/jone-tamulaite-nong/) | Offboarded from AeroSim | Former AeroSim Scope owner | None | 0 |
Only governance-relevant professional information belongs here. Do not store secrets, credentials, private contact details, or unnecessary personal data.
+8 -8
View File
@@ -1,19 +1,19 @@
---
title: "Jone Tamulaite - Nong"
description: "Identify Jone Tamulaite - Nong's AeroSim project membership and verified access state."
description: "Record Jone Tamulaite - Nong's former AeroSim project membership and offboarding state."
---
# Jone Tamulaite - Nong
| Field | Value |
|---|---|
| Status | Active |
| Status | Offboarded from AeroSim on 2026-09-28 |
| 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 |
| Governance roles | Former AeroSim human team member and primary Scope owner |
| Team | None |
| Active projects | None |
| Gitea | No verified AeroSim account mapping; no team membership existed to revoke |
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.
RootAtSkic recorded Jone Tamulaite - Nong's departure from AeroSim in Scope message `1554069052773900391` on 2026-09-28. MartynasP (`discord:773109855497093191`) succeeded her as primary Scope owner. Jone never had a verified Gitea mapping or membership in `aerosim-maintainers` or `aerosim-skill-maintainers`; Discord project-access removal remains subject to fresh remote verification.
The membership alignment was approved by RootAtSkic (`discord:1518725627845283888`) in AeroSim General message `1543962382978514964` on 2026-08-31.
The original membership alignment was approved by RootAtSkic (`discord:1518725627845283888`) in AeroSim General message `1543962382978514964` on 2026-08-31 and is preserved as historical evidence.
+2 -2
View File
@@ -10,9 +10,9 @@ sidebar_position: 4
|---|---|
| Status | Active |
| Discord | `<@773109855497093191>` — `w4rl0ck_21` / MartynasP |
| Governance roles | Corp v1 Board member; AeroSim human team member |
| Governance roles | Corp v1 Board member; AeroSim human team member; primary AeroSim Scope owner |
| Team | [AeroSim Team](/teams/aerosim/) |
| Active projects | [AeroSim](/projects/aerosim/) |
| Gitea | `martynas-pazusis` — verified in both AeroSim organization teams |
MartynasP has verified effective access to `corp-v1-board` and all six AeroSim channels. The verified Gitea identity belongs to both `aerosim-maintainers` and `aerosim-skill-maintainers`, which cover the two project repositories and all thirteen adopted skill repositories. Board authority covers project kickoff, project closure, and approval of changes to `corp-v1-main`.
RootAtSkic assigned MartynasP as AeroSim's primary Scope owner in Scope message `1554069052773900391` on 2026-09-28, succeeding Jone Tamulaite - Nong. This authority covers routine Epic and Feature lifecycle, priority, outcome, and `Approved for Solution` decisions under the AeroSim Scope contract. MartynasP's verified Gitea identity already belongs to both `aerosim-maintainers` and `aerosim-skill-maintainers`; fresh effective Discord access verification across the current eight-channel topology remains part of transition closure. Board authority continues to cover project kickoff, project closure, and approval of changes to `corp-v1-main`.
+13 -10
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; Andrius; Dovydas; Giedrius K; Jone Tamulaite - Nong; `jarvis-at-skic` / Hermes code agent; `friday-at-skic` / Friday code agent |
| Team members | RootAtSkic; Panther Skeleton; MartynasP; Eduard; Linas; Jenny; Piotras; Andrius; Dovydas; Giedrius K; `jarvis-at-skic` / Hermes code agent; `friday-at-skic` / Friday code agent |
| Team | [AeroSim Team](/teams/aerosim/) |
## Purpose
@@ -48,21 +48,23 @@ 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 `efbf3967548f1cbf5e06f97fa9d659535e35a7b4`
- [Documentation repository](https://gitea.lego-cloud.eu/corp-v1-aerosim/corp-v1-aerosim-documentation) — `test` at `f686610a8b1b21825c66dc424f484fb2672933d7`
- [Application repository](https://gitea.lego-cloud.eu/corp-v1-aerosim/corp-v1-aerosim) — `test` at `09628fbb828380fbe159be7530da26f4bbf02129`
- [Documentation repository](https://gitea.lego-cloud.eu/corp-v1-aerosim/corp-v1-aerosim-documentation) — `test` at `d8a45594c33efc3acbd1523955d4f235facc9a1f`
- [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
## Delivery progress checkpoint — 2026-09-07
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. |
| Canonical `ToBeReleased` | 49 / 114 (43.0%) | Canonical records place the Tasks in Waves 1–8 and 12–14 at the release-handoff state. This is not a release. |
| Repository-verified implementation pending reconciliation | 6 / 114 (5.3%) | `TASK-0048`, `TASK-0061`, `TASK-0065`, `TASK-0077`, `TASK-0083`, and `TASK-0111` are merged into the validated current application integration head, while their canonical records remain `InProgress`. This repository checkpoint does not replace canonical reconciliation. |
| Canonical `InProgress` | 7 / 114 (6.1%) | Wave 15 Tasks are claimed as one Delivery ownership unit and remain under implementation. |
| Canonical `ReadyForDelivery` | 58 / 114 (50.9%) | Unfinished Tasks in Waves 9–11 and 16–30 remain ready but unclaimed while Wave 15 is active. |
| Released | 0 / 114 (0.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.
Wave 15 is active, and 6 of its 7 Tasks are repository-verified through merged application PRs #85, #89, #90, #95, #96, and #97. The current application integration head is `09628fbb828380fbe159be7530da26f4bbf02129`; its integrated tasks `2718`–`2720` succeeded. `TASK-0078` remains canonical `InProgress`, and its implementation PR #92 is closed without merge, so Wave 16 remains unclaimed. The canonical Wave 15 claim remains at documentation `test` SHA `d8a45594c33efc3acbd1523955d4f235facc9a1f`, verified by PR #155 exact-head build task `2581` and integrated build task `2582`. 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
@@ -118,7 +120,8 @@ Each repository records the central source branch and commit in `ADOPTION.md`. A
- 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.
- Jarvis Board/all-project onboarding was reverified on 2026-09-05: Discord view, send, and history access passes in all seven channels; Gitea team IDs `23` and `24` include `jarvis-at-skic` and all organization repositories.
- 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.
- Andrius, Dovydas, and Giedrius K 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.
- On 2026-09-28, RootAtSkic recorded Jone Tamulaite - Nong's departure from AeroSim and assigned MartynasP as the primary Scope owner. MartynasP was already an AeroSim member with verified membership in both AeroSim Gitea teams. Jone never had a verified Gitea mapping, so no Gitea team membership existed to revoke; Discord access removal requires fresh remote verification.
- 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.
@@ -128,4 +131,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, 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.
Panther Skeleton, Eduard, Jenny, Andrius, Dovydas, and Giedrius K 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.
+3 -2
View File
@@ -9,7 +9,7 @@ sidebar_position: 1
|---|---|
| Status | Active |
| Lead | RootAtSkic |
| Members | RootAtSkic; Panther Skeleton; MartynasP; Eduard; Linas; Jenny; Piotras; Andrius; Dovydas; Giedrius K; Jone Tamulaite - Nong; `jarvis-at-skic` / Hermes code agent; `friday-at-skic` / Friday code agent |
| Members | RootAtSkic; Panther Skeleton; MartynasP; Eduard; Linas; Jenny; Piotras; Andrius; Dovydas; Giedrius K; `jarvis-at-skic` / Hermes code agent; `friday-at-skic` / Friday code agent |
| Assigned project | [AeroSim](/projects/aerosim/) |
## Mandate
@@ -32,7 +32,8 @@ Deliver the AeroSim browser flight-simulation platform, its documentation, and t
- `friday-at-skic` membership is verified in both teams, covering four project repositories and fourteen skill repositories. The account reports inactive, so its own login/API use remains pending administrator activation.
- 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.
- Andrius, Dovydas, and Giedrius K 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.
- Jone Tamulaite - Nong left AeroSim on 2026-09-28. MartynasP succeeded her as primary Scope owner and retains the already verified `aerosim-maintainers` and `aerosim-skill-maintainers` memberships.
## Communication
+6
View File
@@ -50,5 +50,11 @@
},
"engines": {
"node": ">=20.0"
},
"pnpm": {
"overrides": {
"fast-uri": "3.1.6",
"serialize-javascript": "7.0.3"
}
}
}
+14 -18
View File
@@ -4,6 +4,10 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
overrides:
fast-uri: 3.1.6
serialize-javascript: 7.0.3
importers:
.:
@@ -3061,8 +3065,8 @@ packages:
fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
fast-uri@3.1.5:
resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==}
fast-uri@3.1.6:
resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==}
fast-xml-builder@1.3.1:
resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==}
@@ -4763,9 +4767,6 @@ packages:
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
engines: {node: '>=10'}
randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
range-parser@1.2.0:
resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==}
engines: {node: '>= 0.6'}
@@ -5035,8 +5036,9 @@ packages:
resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==}
engines: {node: '>= 0.8.0'}
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
serialize-javascript@7.0.3:
resolution: {integrity: sha512-h+cZ/XXarqDgCjo+YSyQU/ulDEESGGf8AMK9pPNmhNSl/FzPl6L8pMp1leca5z6NuG6tvV/auC8/43tmovowww==}
engines: {node: '>=20.0.0'}
serve-handler@6.1.7:
resolution: {integrity: sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==}
@@ -8904,7 +8906,7 @@ snapshots:
ajv@8.20.0:
dependencies:
fast-deep-equal: 3.1.3
fast-uri: 3.1.5
fast-uri: 3.1.6
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
@@ -9337,7 +9339,7 @@ snapshots:
globby: 13.2.2
normalize-path: 3.0.0
schema-utils: 4.3.3
serialize-javascript: 6.0.2
serialize-javascript: 7.0.3
webpack: 5.109.2(@swc/core@1.15.47)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(html-minifier-terser@7.2.0)(postcss@8.5.26)
core-js-compat@3.50.0:
@@ -9404,7 +9406,7 @@ snapshots:
jest-worker: 29.7.0
postcss: 8.5.26
schema-utils: 4.3.3
serialize-javascript: 6.0.2
serialize-javascript: 7.0.3
webpack: 5.109.2(@swc/core@1.15.47)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(html-minifier-terser@7.2.0)(postcss@8.5.26)
optionalDependencies:
clean-css: 5.3.3
@@ -9847,7 +9849,7 @@ snapshots:
fast-json-stable-stringify@2.1.0: {}
fast-uri@3.1.5: {}
fast-uri@3.1.6: {}
fast-xml-builder@1.3.1:
dependencies:
@@ -11890,10 +11892,6 @@ snapshots:
quick-lru@5.1.1: {}
randombytes@2.1.0:
dependencies:
safe-buffer: 5.2.1
range-parser@1.2.0: {}
range-parser@1.2.1: {}
@@ -12247,9 +12245,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
serialize-javascript@6.0.2:
dependencies:
randombytes: 2.1.0
serialize-javascript@7.0.3: {}
serve-handler@6.1.7:
dependencies:
+56 -79
View File
@@ -85,8 +85,9 @@ for (const marker of ['corp-v1-dpvp', 'dpvp-maintainers', 'dpvp-skill-maintainer
}
const aerosimProject = read('docs/projects/aerosim.md');
const APP_SHA = 'efbf3967548f1cbf5e06f97fa9d659535e35a7b4';
const DOC_SHA = 'f686610a8b1b21825c66dc424f484fb2672933d7';
const APP_SHA = '09628fbb828380fbe159be7530da26f4bbf02129';
const DOC_SHA = 'd8a45594c33efc3acbd1523955d4f235facc9a1f';
const AEROSIM_CHECKPOINT_HEADING = 'Delivery progress checkpoint — 2026-09-07';
const markdownSection = (document, heading) => {
const marker = `## ${heading}`;
@@ -103,11 +104,7 @@ const uniqueLine = (text, predicate, description) => {
};
function verifyAeroSimProject(document) {
const requiredSectionHeadings = [
'Resources',
'Delivery progress checkpoint — 2026-09-03',
'Discord',
];
const requiredSectionHeadings = ['Resources', AEROSIM_CHECKPOINT_HEADING, 'Discord'];
const documentLines = document.split('\n');
const requiredSectionIndices = requiredSectionHeadings.map((heading) => {
const indices = documentLines.flatMap((line, index) => line === `## ${heading}` ? [index] : []);
@@ -119,28 +116,27 @@ function verifyAeroSimProject(document) {
'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',
]) {
const requiredMarkers = [
AEROSIM_CHECKPOINT_HEADING,
'49 / 114',
'43.0%',
'6 / 114 (5.3%)',
'7 / 114 (6.1%)',
'58 / 114 (50.9%)',
'PR #155',
'2581',
'2582',
APP_SHA,
DOC_SHA,
'Wave 15 is active',
'6 of its 7 Tasks are repository-verified',
'PRs #85, #89, #90, #95, #96, and #97',
'integrated tasks `2718`–`2720`',
'`TASK-0078` remains canonical `InProgress`',
'PR #92 is closed without merge',
'Wave 16 remains unclaimed',
];
for (const marker of requiredMarkers) {
assert.ok(document.includes(marker), `AeroSim progress checkpoint is missing: ${marker}`);
}
@@ -150,7 +146,7 @@ function verifyAeroSimProject(document) {
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 checkpoint = markdownSection(document, AEROSIM_CHECKPOINT_HEADING);
const checkpointLines = checkpoint.split('\n');
const checkpointTableHeader = '| Measure | Progress | Meaning |';
const checkpointTableHeaderIndices = checkpointLines.flatMap(
@@ -158,62 +154,43 @@ function verifyAeroSimProject(document) {
);
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.equal(checkpointLines[checkpointTableHeaderIndex + 1], '|---|---:|---|', 'AeroSim checkpoint table separator must exactly preserve its three columns and progress alignment');
const expectedRows = [
'Canonical `ToBeReleased`',
'Repository-verified implementation pending reconciliation',
'Canonical `InProgress`',
'Canonical `ReadyForDelivery`',
'Released',
];
assert.deepEqual(
checkpointLines.slice(checkpointTableHeaderIndex + 2, checkpointTableHeaderIndex + 5).map(
(line) => line.match(/^\| (Canonical `ToBeReleased`|Repository-verified implementation|Released) \|/)?.[1],
checkpointLines.slice(checkpointTableHeaderIndex + 2, checkpointTableHeaderIndex + 7).map(
(line) => line.match(/^\| ([^|]+?) \|/)?.[1],
),
['Canonical `ToBeReleased`', 'Repository-verified implementation', 'Released'],
'AeroSim checkpoint rows must follow canonical, implementation, released order',
expectedRows,
'AeroSim checkpoint rows must preserve canonical, reconciliation, active, ready, and 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 implementationRow = uniqueLine(checkpoint, (line) => line.startsWith('| Repository-verified implementation pending reconciliation |'), 'repository-verified pending-reconciliation row');
const inProgressRow = uniqueLine(checkpoint, (line) => line.startsWith('| Canonical `InProgress` |'), 'canonical InProgress row');
const readyRow = uniqueLine(checkpoint, (line) => line.startsWith('| Canonical `ReadyForDelivery` |'), 'canonical ReadyForDelivery 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');
const waveStatus = uniqueLine(checkpoint, (line) => line.startsWith('Wave 15 is active'), 'Wave 15 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(canonicalRow, /\|\s*49\s*\/\s*114\s*\(43\.0%\)/i, 'AeroSim must expose canonical ToBeReleased progress');
assert.match(implementationRow, /\|\s*6\s*\/\s*114\s*\(5\.3%\)/i, 'AeroSim must expose repository-verified pending reconciliation separately');
assert.match(inProgressRow, /\|\s*7\s*\/\s*114\s*\(6\.1%\)/i, 'AeroSim must expose canonical InProgress progress');
assert.match(readyRow, /\|\s*58\s*\/\s*114\s*\(50\.9%\)/i, 'AeroSim must expose canonical ReadyForDelivery progress');
assert.match(releasedRow, /\|\s*0\s*\/\s*114\s*\(0\.0%\)/i, 'AeroSim must distinguish released progress');
assert.match(waveStatus, new RegExp('documentation `test` SHA `' + DOC_SHA + '`[^\\n]*PR #155 exact-head build task'), 'Wave 15 status must bind PR #155 to the documentation SHA');
assert.match(waveStatus, /exact-head build task `2581`[^\n]*integrated build task `2582`/i, 'Wave 15 status must bind exact-head and integrated documentation tasks');
assert.match(waveStatus, new RegExp('application integration head is `' + APP_SHA + '`'), 'Wave 15 status must bind the current application SHA');
assert.match(waveStatus, /6 of its 7 Tasks are repository-verified[^\n]*PRs #85, #89, #90, #95, #96, and #97/i, 'Wave 15 status must enumerate repository-verified integration evidence');
assert.match(waveStatus, /`TASK-0078` remains canonical `InProgress`[^\n]*PR #92 is closed without merge/i, 'Wave 15 status must preserve the unmerged Task state');
assert.match(readyRow, /Waves 9–11 and 16–30 remain ready but unclaimed/i, 'ReadyForDelivery must identify both earlier and later unclaimed waves');
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');
assert.doesNotMatch(checkpoint, /Repository-verified implementation \|/i, 'ambiguous cumulative implementation row must not return');
assert.doesNotMatch(document, /8\s*\/\s*114\s*\(7\.0%\)/i, 'stale Wave 2 portfolio metrics must not remain');
assert.doesNotMatch(waveStatus, /Wave 3 is active/i, 'stale active-wave wording must not remain');
}
verifyAeroSimProject(aerosimProject);
+39
View File
@@ -0,0 +1,39 @@
import assert from 'node:assert/strict';
import {readFile} from 'node:fs/promises';
import test from 'node:test';
const project = await readFile(new URL('../docs/projects/aerosim.md', import.meta.url), 'utf8');
const packageJson = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
const lockfile = await readFile(new URL('../pnpm-lock.yaml', import.meta.url), 'utf8');
test('AeroSim portfolio roll-up reports the verified Wave 15 checkpoint', () => {
assert.match(project, /## Delivery progress checkpoint — 2026-09-07/);
assert.match(project, /Canonical `ToBeReleased` \| 49 \/ 114 \(43\.0%\)/);
assert.match(project, /Repository-verified implementation pending reconciliation \| 6 \/ 114 \(5\.3%\)/);
assert.match(project, /Canonical `InProgress` \| 7 \/ 114 \(6\.1%\)/);
assert.match(project, /Canonical `ReadyForDelivery` \| 58 \/ 114 \(50\.9%\)/);
assert.match(project, /Released \| 0 \/ 114 \(0\.0%\)/);
assert.match(project, /Wave 15 is active/);
assert.match(project, /6 of its 7 Tasks are repository-verified/);
assert.match(project, /`TASK-0048`, `TASK-0061`, `TASK-0065`, `TASK-0077`, `TASK-0083`, and `TASK-0111`/);
assert.match(project, /`TASK-0078` remains canonical `InProgress`[^\n]*PR #92 is closed without merge/);
assert.match(project, /`09628fbb828380fbe159be7530da26f4bbf02129`/);
assert.match(project, /`d8a45594c33efc3acbd1523955d4f235facc9a1f`/);
assert.match(project, /PRs #85, #89, #90, #95, #96, and #97/);
assert.match(project, /integrated tasks `2718`–`2720`/);
assert.match(project, /Waves 9–11 and 16–30 remain ready but unclaimed/);
assert.doesNotMatch(project, /Repository-verified implementation pending reconciliation \| 0 \/ 114/);
assert.doesNotMatch(project, /`7f26eca79eadef3171564fc60035e9866c2c848e`/);
assert.doesNotMatch(project, /Wave 3 is active/);
});
test('portal pins patched audit dependencies without downgrading consumers', () => {
assert.deepEqual(packageJson.pnpm?.overrides, {
'fast-uri': '3.1.6',
'serialize-javascript': '7.0.3',
});
assert.match(lockfile, /fast-uri@3\.1\.6:/);
assert.match(lockfile, /serialize-javascript@7\.0\.3:/);
assert.doesNotMatch(lockfile, /fast-uri@3\.1\.5:/);
assert.doesNotMatch(lockfile, /serialize-javascript@6\.0\.2:/);
});