CorpOS is a company-day simulation (firm model, work contracts, and a tool gateway). It is not an agent framework and not production SaaS.
- ToolGateway is the sole chokepoint for consequential tools.
- Unknown tools fail closed.
- Exception HITL with scheduled TTL fail-closed; kill switch; department capital caps.
- Shared-mode console sends Bearer (
VITE_DASHBOARD_API_TOKEN/DASHBOARD_API_TOKEN). - Dashboard mutations require
DASHBOARD_API_TOKENby default;CORPOS_MODE !== "shared"does not ungated them. - Approve/appeal bind
decidedByand tenant matching toDASHBOARD_OPERATOR_ID/DASHBOARD_TENANT_ID(defaultsoperator@dashboard/default). Client-suppliedby/tenantIdon those routes are ignored. This is still a shared static token, not per-user OIDC. - G3 quorum, G6 appeal, and enforcement
strict/auditmodes. - Hash-chained audit receipts (
npm run audit:verify). POST /api/company-dayignoresautoApproveException. The refund stays on the ledger and the restart stays queued until Approve, Reject, or Kill.- The in-process helper
runCompanyDaystill honorsautoApproveException: truefor tests. The HTTP route does not pass that flag through.
- Full multi-tenant isolation as a security boundary.
- Production OIDC / TLS by default.
- Real payment or messaging providers.
- Live LLM agent execution (health may report
mode: "live"; company-day still usesSimulationProvider).
When CORPOS_ALLOW_UNAUTHENTICATED is unset, DASHBOARD_API_TOKEN is required as a Bearer
token on API approve and kill mutations. CORPOS_MODE=local (or any value other than
an explicit opt-in) does not skip the gate. The ops console sends
VITE_DASHBOARD_API_TOKEN when configured. The server derives the decider and tenant
from DASHBOARD_OPERATOR_ID / DASHBOARD_TENANT_ID, not from the request body, and
rejects decide/appeal when the exception tenant does not match. This is a
static token compare for demos, not an OAuth flow.
- Install from the committed
package-lock.jsonvianpm ci --include=dev. packageManageris npm@11.17.0 (Corepack). npm 10 cannot enforceallowScripts.- Registry must remain
https://registry.npmjs.org/— no project.npmrcregistry override. - Install scripts are opt-in and enforced:
package.jsonallowScriptspins onlyesbuild/fseventsversions in the lockfile;.npmrcsetsstrict-allow-scripts=true../scripts/harness/verify.shfails ifnpm approve-scripts --allow-scripts-pendingreports gaps. - Verify does not wipe
node_modulesby default (avoids concurrentENOTEMPTYraces). CI setsCORPOS_VERIFY_CLEAN=1for a full reinstall. Never fetch npm vianpxinside verify. @hono/node-serveris pinned to2.0.12via root dependency +overrides(covers APIserveStaticand@modelcontextprotocol/sdk).- Review Dependabot PRs before merge; re-run
npm approve-scripts --allow-scripts-pendingafter lockfile changes that introduce new install scripts. - Do not set
dangerously-allow-all-scripts=truein CI.
Use GitHub Security Advisories for vulnerabilities. Conduct issues are handled under CODE_OF_CONDUCT.md, not security advisories.