U3b · September 2026 · Developers

Developer setup and contribution

Build and verify the application without treating fixtures as a production environment.

Prerequisites and repository layout

Use the repository’s lockfile and Node engine constraint: >=24.14.0 <25 or >=26 <27. The product-test runner has a stricter explicit version list; Node 24.14.0 was used for this documentation delivery. Do not assume the newest Node minor is accepted by every gate.

Source code lives under src and server; tests are under tests/lookout and alongside selected modules. public is copied to the frontend build. deploy and scripts/operators contain release tools, not blanket authority to run them against a host.

The application repository does not include production account files, signing secrets or the private M1 runtime. Use approved local fixtures or an explicitly authorized private runtime for the lane being tested.

From a clean application checkout with its lockfile

node --version
npm ci
node scripts/build-lookout-docs.mjs --check
npm run docs:check

Build and preview documentation

The documentation portal has no build-time web dependency. Manual content, release fixtures and application registries generate both Markdown and static HTML. The lightweight preview serves only documentation assets; it does not run the API or use production data.

npm run docs:build
npm run docs:check
npm run docs:preview
# Open http://127.0.0.1:4176/documentation.html

Build the frontend

The verification config keeps the production transforms while pinning the checkout root and Cesium asset copy. The base config may require a trusted data descriptor in runtime/preview modes. A build succeeding does not mean a production-compatible API is configured.

Use synthetic browser harnesses for UI development when you do not have an authorized private data runtime. Their recorded values and account context must never be described as production measurements.

node node_modules/vite/bin/vite.js build \
  --config scripts/lookout-vite-verify.config.mjs \
  --outDir /tmp/lookout-local-build
P9_BUILT_DIR=/tmp/lookout-local-build node --test \
  tests/lookout/product/ux/P9-guided-flow.browser-runtime.test.mjs

Configured API prerequisites

The real API starts through server/app/start.mjs and fails closed unless its explicit identity, origin, trusted data and workspace configuration are valid. A blank .env template is not sufficient. Create local operator-owned configuration through the approved runtime workflow; do not copy production secrets to a developer machine.

The table identifies configuration responsibilities, not sample credentials or a complete deployment command. Inspect the referenced loaders for exact schemas and size/mode checks.

Configured API prerequisites
Setting/componentResponsibility
LOOKOUT_API_HOST / LOOKOUT_API_PORTExplicit bind address/port; candidates must bind a non-default operator loopback port.
LOOKOUT_API_ALLOWED_ORIGINCanonical application origin used for protected write checks.
LOOKOUT_SOLDIER_DATA_AUTH and protected auth filesSupported pilot identity boundary; the configured API uses Secure cookies.
LOOKOUT_WORKSPACE_CONFIGURATIONAbsolute private workspace document loaded by cliWorkspaceConfiguration.mjs.
LOOKOUT_APPLICATION_DATABASE_URLDedicated application pool, supplied only through approved secret/configuration handling.
LOOKOUT_TRUSTED_DATA_RELEASE_DESCRIPTOR / LOOKOUT_DATA_DIRPinned accepted data release and mount; a guessed descriptor is refused.
LOOKOUT_TRACT_MEASURES_CONFIGURATIONM1 tract configuration; omission yields an unavailable provider rather than bypassing authorization.
LOOKOUT_FACILITY_SERVING_CONFIGURATIONReviewed U4 facility configuration referencing the read-only M1 runtime.
Activation and release identityThe deployed mode, source/image/data pins and readiness must agree; use the release tooling.

Choose the right test lane

Product test configuration requires explicit isolated local origins and non-delivering transports. Some real-runtime lanes require approved root-owned data trees. Do not turn a missing prerequisite into a skip and claim the release passed. Keep failed runs as evidence and distinguish fixture tests from real data acceptance.

Choose the right test lane
LaneCommand / purpose
Unitnpm run test:lookout:unit — pure/module behavior.
Contractnpm run test:lookout:contract — discovery, compliance and frozen contracts.
Componentnpm run test:lookout:product:component — component behavior under isolated fixtures.
Service integrationnpm run test:lookout:product:service-integration — isolated configured services.
Browser runtimenpm run test:lookout:product:browser-runtime — actual browser behavior; prerequisites vary by file.
Actual acceptancenpm run verify:lookout:actual-acceptance — bound acceptance; requires its accepted data/runtime setup.
Documentationnpm run docs:check; npm run docs:test — generated drift, links, reference provenance and browser behavior.

Contribution and review workflow

  1. Branch from the intended release baseline and inspect the worktree before editing. Keep unrelated user changes and accepted release artifacts intact.
  2. Change the source of truth: manual docs content, the actual route/provider, or the reviewed data definition. Generated docs are outputs, not hand-edit targets.
  3. Run focused tests for the behavior changed, regenerate documentation, and verify links and source references. For UI changes, check narrow screens, keyboard access and empty/error states.
  4. Record source/rights/method changes explicitly. An overlap method change needs a new method version; a source change needs data acceptance, not only a frontend edit.
  5. Prepare a reviewable change with scope, evidence and known limitations. Build a new image for deployment rather than altering the live immutable image.
Implementation references for this manual

Repository paths reviewed for this U3b documentation. Optional code is not a claim of live availability.

  • package.json
  • scripts/lookout-product-test-config.mjs
  • scripts/lookout-vite-verify.config.mjs
  • server/app/start.mjs
  • server/app/runtime.mjs
  • server/app/cliWorkspaceConfiguration.mjs