locu.systems locu.systems/AGENTS.md
Direction, ruled 2026-09-14: a host for ComputeDriven loci — a locus is what the customer deploys and is billed for, a carrier is the rented machine under it, and the meter coun…

locu.systems

Direction, ruled 2026-09-14: a host for ComputeDriven loci — a locus is what the customer deploys and is billed for, a carrier is the rented machine under it, and the meter counts admitted transitions. Record: docs/spec/90_LOCUS_HOSTING.md. Nothing in it is built. 80_SERVICE_MANAGEMENT_PILOT.md is the superseded direction from earlier the same day, banded rather than rewritten.

The domain is new; the repository, this directory and the nav property key are not renamed. The shared nav still renders the previous name; the page declares that disagreement and the gate refuses to publish while it is undeclared. Do not edit amp-nav.js to fix it — that file belongs to lane N.

What is in the tree from the abandoned agent-deployment direction: a Postgres schema and edge functions in the sibling ampersand-supabase/, and a Vite/React/TypeScript dashboard against a Supabase client. It does not execute an agent on a runtime.

What is here

index.html          the marketing page — GENERATED, see below
_redirects          sends old_scrap/, src/ and apps/ away from the live host (SHELL.md r14)
console/            the PHASE-TWO CONSOLE PROTOTYPE, served at /console/ — hand-authored, not generated
src/                the marketing page's template, stylesheet and two scripts
records/            the frozen records the page is generated from
build-site.mjs      emits index.html, boot.js, say.js
launch-gate.mjs     reads the artifact and refuses to publish a page that lies
apps/web/           the dashboard — Vite + React + TypeScript, Supabase client
docs/spec/          the v1 specification set, part of it superseded
amp-nav.js          portfolio nav, a DEPLOYED copy — do not edit it here
old_scrap/          previous versions, historical, not authoritative

package.json declares npm workspaces at apps/* and packages/*. There is one workspace, apps/web. `packages/` does not exist, so there is no SDK and no CLI, and the marketing page says so with a probe that re-checks it on every build.

The edge functions and migrations this product runs on are not in this repository. They live in the sibling ampersand-supabase/ repo, under functions/webhost-* and migrations/*webhost*.

The marketing page is GENERATED. Do not hand-edit index.html.

/index.html, /boot.js and /say.js are emitted by build-site.mjs from records/surface.json, records/evidence.json, src/landing.html, src/shell.css, src/boot.js and src/say.js. An edit to the served HTML is silently reverted by the next build. Change the record or the template.

npm run site:launch   # emit the page, then prove it

launch-gate.mjs reads the emitted artifact and refuses to publish when it and the records disagree — a retracted claim reinstated (anywhere, including inside a comment or an attribute), a rung invented, a call to action the rung has not earned, a hand-typed count, a cited source line that has stopped saying what it is quoted as saying, a mailto:, a text token below 4.5:1, a button whose colour is decided by a non-button rule, an artifact that is not what its source compiles to, or an animation constant leaking into the copy. The gate prints its own total; do not hand-type a check count anywhere, that is how the published and printed numbers drift apart.

Most of the page's claims are NEGATIVE — "there is no AWS dependency", "nothing reads an ampersand.json", "packages/ does not exist". Those are the ones the build re-derives off disk on every run, because nobody edits a sentence on a marketing page when they add a dependency.

**The three site:* scripts are deliberately not wired into build, dev or test.** Those belong to apps/web, which is a separate artifact with a separate toolchain. Do not entangle them.

ONE PAGE. The site and the console share a document and a URL space.

There is no second site. / serves the home view; #/ops/* and #/account/* are the operator console and the client portal, rendered by /app.js into #app. Three rules hold that together and all three are checked:

  1. The home view is in the served bytes. build-site.mjs generates it into

#home from the frozen records. /app.js may show or hide it and may never author it — §3c deletes every script and the empty #app from the artifact and requires each text node a reader sees to survive. A price, a status or a count migrating into the script is refused there.

  1. `src/app.css` is scoped to `#app`. It shares .btn, .tag, .status,

.card and bare table rules with the shell for different things; unscoped it would silently restyle the page a visitor lands on. Only the overlays appended to <body> (scrim, modal, toast) are unscoped, and none of those names exists in the shell. The gate enumerates every rule.

  1. The palette is not its own. Every colour name in app.css is an alias of

the shell token carrying that role, so one palette paints both halves. Only --util, --alarm and --indet are new, and --util must never be the accent: the argument of the site is that one of those two numbers is louder than the other for a reason.

The standing notice carries data-prototype and must sit outside #app, because a notice the panel paints disappears the moment the panel throws. The panel's fleet is invented and its figures may not be repeated anywhere until a kernel counts admitted transitions under load.

Source-of-truth spec

  • docs/spec/00_MASTER_SPEC.md — master engineering spec

  • docs/spec/10_API_CONTRACTS.md · 20_RUNTIME_PROVIDER_INTERFACE.md ·

30_DATA_MODEL_SUPABASE.md · 40_SECURITY_SECRETS_COMPLIANCE.md · 50_OBSERVABILITY_BILLING_LIMITS.md · 60_TESTING_ACCEPTANCE.md · 70_AMPERSAND_PROTOCOL_INTEGRATION.md

  • docs/spec/80_SERVICE_MANAGEMENT_PILOT.md — the current direction and first pilot; read it first

  • docs/spec/adr/ — architecture decision records

  • docs/spec/progress/ — implementation progress logs

  • docs/spec/REALIGNMENT_PLAN.md

Read the master spec before implementing features, and read its supersession banner first: the data-layer half of the spec set is superseded. See README.md.

[&] Protocol integration — specified, not implemented

docs/spec/70_AMPERSAND_PROTOCOL_INTEGRATION.md describes ampersand.json manifest support, MCP sidecar orchestration, agent-to-agent routing and Delegatic governance enforcement. None of it is built. No code in this repository or in the sibling edge functions reads an ampersand.json; the build counts the source files that so much as mention one, and the count is zero.

Build and test

npm install
npm run dev            # Vite dev server for apps/web
npm test               # vitest across workspaces
npm run typecheck
npm run lint
npm run format:check
npm run site:launch    # the marketing page: emit, then prove

Constraints

  • Node >= 20

  • TypeScript strict mode; ESLint + Prettier enforced

  • Never commit secrets. apps/web/env.example shows the shape.

  • Do not add a dependency to make a marketing claim true — fix the claim.

Open in the interactive atlas