Date: 2026-08-25
Specification: latest 8monkey-ai/monkeyOS main README, updated together with this implementation and treated as authoritative.
scaffolds/monkeyos-app-template— generic application scaffold, version 2.9.0scaffolds/monkeyos-platform— generic organization-level platform repository, version 2.9.0
| Area | Result |
|---|---|
| Platform formatting, focused suspicious linting, Oxlint type-aware compiler diagnostics and unit tests | PASS — 15 tests |
| Runtime architecture contract | PASS — ARM64 default and AMD64 selection tested; invalid aliases rejected |
| App Oxfmt/Tailwind formatting, React Router type generation, focused suspicious/React/accessibility linting, Oxlint type-aware compiler diagnostics, unit tests, production build and deterministic audit | PASS — 5 tests; 0 audit findings |
| Convention-based identity audit rules | PASS — each of the seven new rules was negative-tested in a scratch copy and produced its blocking finding: table without row level security, create schema, edited platform baseline, returning identity file, client schema selection, --schema type generation, and a config.toml schema override |
| Platform skill synchronization and baseline checksum | PASS — eleven skills synchronized into both scaffolds with matching manifests; the app audit verifies the committed baseline SHA-256 against .monkeyos/baseline.manifest.json |
| React Router Framework Mode on Bun | PASS — ordinary CLI package scripts, project-level Bun runtime configuration, standard route config and root document, generated client/server builds, and a small production adapter |
| Oxc Rust React Compiler | PASS — official Vite React compiler transform with compiler: true; React Router retains JSX/Fast Refresh; compiled client output contains React memo-cache runtime code; direct Babel compiler dependencies removed |
| Official shadcn/ui integration | PASS — official shadcn@latest CLI; Base UI base-nova preset; CLI-generated sidebar and standard registry primitives |
| Local Supabase migration, deterministic seed, schema lint and pgTAP RLS tests | NOT RE-RUN after the move to the default public schema — requires Docker and the Supabase CLI; the revoke of public from the PUBLIC pseudo-role and the alter default privileges block are unverified empirically |
| Playwright responsive coverage | NOT RE-RUN after the move to the default public schema — depends on the local Supabase stack above |
| GitHub workflow YAML parsing | PASS |
AWS CloudFormation validation (current cfn-lint) |
PASS |
| Azure Bicep compilation (official Bicep 0.46.1) | PASS |
| GCP Infrastructure Manager Terraform formatting/init/validation | PASS |
| Moving runtime-image portability | PASS — current oven/bun:alpine supports Linux ARM64 and x64/AMD64; no Node base is present |
| Local selected-architecture image build | PASS — fresh Bun-only Linux ARM64 image built, launched as non-root bun, and passed the central workflow's four-test Playwright production smoke path |
| Git-tracked source exclusions and credential-pattern scan | PASS |
- shadcn/ui is the primary application UI system.
components.jsonis initialized through the official CLI with the Base UI preset; standard primitives and the sidebar are installed throughshadcn@latest add, not recreated by hand. Generated registry files remain insrc/components/ui/; application composition stays outside it. - Deterministic repository audits verify the official preset, the CLI entry point, required generated component files, and official Sidebar composition.
AGENTS.md, central review, and repository-audit skills enforce the same rule on future work. - Application identity is a convention rather than stored state.
monkeyos.identity.json, the derived schema and role names, and the whole-repository text rewrite were removed. Each application owns one Supabase project and therefore the defaultpublicschema with the fixedapp_devandapp_runtimeroles, so no application name appears in source, migrations, policies, or configuration. A repository name now reaches exactly two values, neither read by application code:package.jsonname, which namespaces the local credential store, andsupabase/config.tomlproject_id. Provisioning sets both, and the audit fails when they disagree, which catches the only remaining way identity can go wrong: a half-finished rename. This also fixed a latent defect: with a non-publicschema key the generatedDefaultSchemaresolved tonever, silently breaking everyTables/Enumshelper. - The membership foundation is a single platform-owned baseline migration, byte-identical in every application, committed verbatim in the template with a recorded checksum and applied by provisioning from the same canonical file it then registers in
supabase_migrations.schema_migrations. The former 130-line duplicate of the same DDL in the app scaffold is gone. Because the default schema ships permissive defaults, the baseline revokes the schema from the PUBLIC pseudo-role as well asanon, revokes default privileges on future tables, sequences, and functions, and the audit requires row level security on every created table — a name-independent boundary that is stronger than schema isolation. - The generic scaffold contains no invented business table, seed record, route, or CRUD screen. Its application-definition skill routes the first real module through named owner decisions before implementation; platform provisioning creates only role and membership foundations, and the baseline ships no audit log.
- Routine Supabase data access lives behind typed TanStack Query hooks with stable keys, validated mutations, error propagation, and precise cache updates. Pages and visual components consume hooks while RLS remains authoritative; deterministic audits enforce this boundary.
- Both scaffolds use
oxlint-tsgolintwithtypeAwareandtypeCheckenabled. Oxlint reported an intentional TS2322 probe, so the redundanttsc --noEmitpass was removed. React Router type generation remains an explicit prerequisite, and the TypeScript projects now cover the Bun production server and platform runtime tests. - Both scaffolds explicitly enable Oxlint's high-signal
correctnessandsuspiciouscategories and reject unused disable directives. The app additionally enables native React and accessibility rules plus the targeted stable-Context-value check; obsolete JSX-scope linting is disabled for the modern transform, and broadreact-perfheuristics remain off under React Compiler. - React Compiler now uses
oxc-transform-reactthrough thevite:react-compilertransform supplied by@vitejs/plugin-react. Loading the full React plugin beside React Router duplicated the development refresh runtime, so the scaffold selects only its compiler transform; a fail-fast config guard and both repository audits preserve that boundary. - Playwright now starts the ordinary React Router development command directly with an explicit non-secret local Supabase fixture. The application-owned
dev-test.tsandtest-container.tswrappers and their package scripts were removed. Central CI owns immutable-image startup, readiness, failure logs and cleanup, then reruns the desktop browser suite against the production image; deterministic audits reject restoring those wrappers. - Both scaffolds commit an Oxfmt configuration with the standard 100-column policy. The app also sorts Tailwind v4 classes in attributes and
cn/cvacalls. Deterministic app audits enforce both tool configurations. - Lint cleanup replaced unchecked JSON and external-response assertions with Zod parsing, associated every login/access label with its control, and moved responsive media-query state to
useSyncExternalStorewithout changing Supabase, RLS, membership, or audit behavior. - Both
tsconfig.jsonfiles use the TypeScript 7/Bun ESM baseline withESNext, preserved modules, bundler resolution, forced module detection, verbatim module syntax, isolated transforms, checked side-effect imports, and explicit strictness. Unused legacy compatibility options were removed, and deterministic app audits enforce the baseline. - The application uses React Router's standard Framework Mode conventions and ordinary
react-router dev,react-router build, andreact-router typegencommands.bunfig.tomlselects Bun for package CLIs. The only development exception supplies Bun'sdevelopmentexport condition to avoid React Router's current non-Node restart loop; it adds no wrapper or custom server. - Bun is not pinned to a minor line. It is the JavaScript runtime, package manager, application server, and test runner; GitHub workflows install latest stable Bun, the Dockerfile uses the moving
oven/bun:alpinebase, and committedbun.lockpreserves exact tested resolutions. - One Platform Admin-owned organization variable,
RUNTIME_ARCH, selectsarm64oramd64and defaults toarm64.amd64is the OCI architecture name for x86-64 on both AMD and Intel. - The same architecture value drives central CI, GHCR manifest verification, Kamal configuration and provider architecture inputs. App environments must not shadow it.
- CloudFormation, Bicep and Infrastructure Manager Terraform contain architecture-aware default compute/image pairs plus explicit compatible overrides.
- The architecture-change runbook uses a coordinated replacement pool and newly tested immutable SHA artifacts; applications cannot select or override architecture.
- The scaffolds contain no monkeyOS-owned central application-state database, registry, audit store, data catalog, deployment-state database or business schema.
- The database and browser rows were not re-run for the 2.8.0 identity change; the cloud, container, and workflow rows are unaffected by it and are carried forward from 2.7.1. The first local
supabase db resetshould confirm that revokingpublicfrom the PUBLIC pseudo-role leaves GoTrue login and PostgREST introspection intact and that the default-privilege revokes apply to tables created by later migrations. - No live Supabase production project, Cloudflare account or cloud account was mutated. Database and browser validation used only the deterministic local Supabase stack.
- Generated dependency directories, build output, browser-test artifacts, local Supabase runtime state, Terraform working directories, credentials, and release ZIPs are excluded from Git.