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.
| Setting/component | Responsibility |
|---|---|
| LOOKOUT_API_HOST / LOOKOUT_API_PORT | Explicit bind address/port; candidates must bind a non-default operator loopback port. |
| LOOKOUT_API_ALLOWED_ORIGIN | Canonical application origin used for protected write checks. |
| LOOKOUT_SOLDIER_DATA_AUTH and protected auth files | Supported pilot identity boundary; the configured API uses Secure cookies. |
| LOOKOUT_WORKSPACE_CONFIGURATION | Absolute private workspace document loaded by cliWorkspaceConfiguration.mjs. |
| LOOKOUT_APPLICATION_DATABASE_URL | Dedicated application pool, supplied only through approved secret/configuration handling. |
| LOOKOUT_TRUSTED_DATA_RELEASE_DESCRIPTOR / LOOKOUT_DATA_DIR | Pinned accepted data release and mount; a guessed descriptor is refused. |
| LOOKOUT_TRACT_MEASURES_CONFIGURATION | M1 tract configuration; omission yields an unavailable provider rather than bypassing authorization. |
| LOOKOUT_FACILITY_SERVING_CONFIGURATION | Reviewed U4 facility configuration referencing the read-only M1 runtime. |
| Activation and release identity | The 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.
| Lane | Command / purpose |
|---|---|
| Unit | npm run test:lookout:unit — pure/module behavior. |
| Contract | npm run test:lookout:contract — discovery, compliance and frozen contracts. |
| Component | npm run test:lookout:product:component — component behavior under isolated fixtures. |
| Service integration | npm run test:lookout:product:service-integration — isolated configured services. |
| Browser runtime | npm run test:lookout:product:browser-runtime — actual browser behavior; prerequisites vary by file. |
| Actual acceptance | npm run verify:lookout:actual-acceptance — bound acceptance; requires its accepted data/runtime setup. |
| Documentation | npm run docs:check; npm run docs:test — generated drift, links, reference provenance and browser behavior. |
Contribution and review workflow
- Branch from the intended release baseline and inspect the worktree before editing. Keep unrelated user changes and accepted release artifacts intact.
- 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.
- 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.
- 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.
- 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.jsonscripts/lookout-product-test-config.mjsscripts/lookout-vite-verify.config.mjsserver/app/start.mjsserver/app/runtime.mjsserver/app/cliWorkspaceConfiguration.mjs