Every quantitative budget, threshold, and quality attribute CyberOS commits to.
10 ISO/IEC 25010 categories — Performance Efficiency, Reliability, Security, Usability & Accessibility, Maintainability, Functional Suitability, Compliance, Observability, Privacy, Scalability —
each carrying a measurable target and a verification method (T = Test, I = Inspection, D = Demo, A = Analysis).
NFRs total
SEC (Security)
PERF (Performance)
10
Categories
of NFRs match current filters.
PERF
Performance Efficiency
Latency budgets, throughput ceilings, cost limits · 18 NFRsNFR-AI-002p99 < 10ms; p95 < 5ms for cost-ledger pre-call admission checkP0Verify: T
AI Gateway cost-ledger pre-call check overhead — p99 < 10ms
Before every upstream provider call, the AI Gateway MUST consult the per-tenant cost-ledger to verify the projected token-cost does not exceed the tenant's monthly budget remainder.
Measurement
Histogram metric `ai_gateway_cost_ledger_admit_seconds` emitted by `services/ai-gateway/src/cost/ledger.rs::admit()`.
Modules
AI
Priority
MUST
Owner
CTO
NFR-AI-007p95 time-to-first-byte (TTFB) < 2s for streaming /v1/chat/completions, cache-miss pathP0Verify: T
AI Gateway streaming first-byte latency — p95 < 2s for non-cached completions
For streaming chat-completion requests on the cache-miss path, the AI Gateway MUST emit the first SSE event to the caller at p95 < 2s and p99 < 4s measured from inbound HTTP request received to first SSE data line written to the response stream.
The AUTH service MUST complete the admission pipeline `verify_jwt → RBAC.check → admit` at p95 < 50ms and p99 < 100ms measured at the service ingress, over a 14-day rolling window, for every `/v1/admin/*` route.
Measurement
Histogram `auth_admit_latency_seconds{route, result}` emitted by `services/auth/src/middleware/admit.rs` over the verify→check→admit span.
AUTH JWT signature verification time — < 1ms p99 single key; < 5ms p99 with 7-day rotation window
AUTH JWT signature verification using the active EdDSA (Ed25519) signing key MUST complete at p99 < 1ms on the production hardware profile (2-vCPU, 4GB RAM container).
NFR-CHAT-001p95 < 100ms, p99 < 250ms from CHAT POST /api/v4/posts to DB commit ackP0Verify: T
CHAT message persist latency — p95 < 100ms from send to DB ack
From the moment a CHAT POST request lands on the Mattermost fork, the message MUST be committed to durable Postgres storage and the DB ack returned at p95 < 100ms and p99 < 250ms, measured at the application span.
Measurement
Histogram `chat_message_persist_seconds{channel_type, has_attachments}` per POST.
Modules
CHAT
Priority
MUST
Owner
CTO
NFR-CHAT-002p95 < 200ms from DB persist ack to message delivered to every connected WebSocket subscriber on the channelP0Verify: T
CHAT WebSocket fanout latency — p95 < 200ms from persist to all subscribed clients
After a message is committed to Postgres (NFR-CHAT-001), the WebSocket fanout MUST deliver it to every currently-connected subscriber on the channel at p95 < 200ms and p99 < 500ms.
Measurement
Histogram `chat_ws_fanout_latency_seconds{cross_pod}` per (message, subscriber) pair; rolled up to worst-case-per-message.
Modules
CHAT
Priority
MUST
Owner
CTO
NFR-CHAT-003p95 < 2s, p99 < 5s from chat message persist to memory bridge put committedP0Verify: T
CHAT memory bridge replication lag — p95 < 2s from chat message to memory put
After a chat message is committed to CHAT Postgres (NFR-CHAT-001), the memory bridge plugin MUST replicate the message to memory at p95 < 2s and p99 < 5s, measured from chat commit to memory bridge put ack.
Measurement
Histogram `chat_memory_bridge_lag_seconds` per bridged message.
Modules
CHAT
Priority
MUST
Owner
CTO
NFR-CUO-200p95 < 5s; p99 < 15s end-to-end `cyberos-cuo harness report --since 30d` on a chain of up to 10⁶ rows + 250 skillsP0Verify: T
harness report generation MUST complete in p95 < 5s over a 10⁶-row audit chain
The `cyberos-cuo harness report` command MUST produce a complete markdown report from a memory audit chain of up to 10⁶ rows in p95 < 5s and p99 < 15s wall-clock time on a single-core x86_64 machine with 8 GB RAM.
Measurement
wall-clock duration of `compute_report()` (excluding markdown formatting + disk write)
Modules
cuo
Priority
MUST
Owner
CTO
NFR-CUO-001p95 < 3s for full cuo/ + skill/ filesystem catalog scan + validationP0Verify: T
The CUO supervisor's filesystem catalog scan (`modules/cuo/cuo/catalog.py::scan_catalog()`) MUST complete a full pass over `cuo/<persona>/<workflow>.md` + `skill/public/<skill>/SKILL.md` at p95 < 3s for a catalog of up to 500 personas and 5000 workflows.
Measurement
Histogram `cuo_catalog_scan_latency_seconds{stage=walk|parse|validate}` — surfaces which sub-step dominates.
Modules
CUO
Priority
MUST
Owner
CTO
NFR-CUO-008p95 < 1.5s for cyberos-cuo route <natural-language>P1Verify: T
The CUO router (`cyberos-cuo route "<query>"`) MUST return a persona+workflow decision at p95 < 1.5s and p99 < 3s for the default Phase-1 two-stage routing algorithm (persona match → workflow match within persona).
NFR-MEMORY-001p95 < 1s; p99 < 3s end-to-end Layer-1 commit to Layer-2 visibilityP0Verify: T
memory Layer-2 ingest lag — p95 < 1s from Layer-1 commit to l2_memory row visible
From the moment a row is committed to a Layer-1 memory store (per-actor SQLite append-log), the row MUST be visible in the global `l2_memory` Postgres table at p95 < 1s and p99 < 3s.
Measurement
Histogram `memory_layer2_ingest_lag_seconds{tenant_id, actor_id}` measured per ingested row as `(l2_committed_at - l1_committed_at)`.
Modules
memory
Priority
MUST
Owner
CTO
NFR-MEMORY-004cyberos-memory doctor full invariant pass completes < 30s on a 100k-row test storeP0Verify: T
memory doctor invariant runtime — full invariant pass < 30s on 100k-row store
The `cyberos-memory doctor` command MUST complete a full invariant scan in < 30s on a Layer-2 store of 100,000 rows. The scan includes: chain-anchor verification (NFR-MEMORY-002), cursor consistency (NFR-MEMORY-003), per-tenant RLS sanity, and PII pre-ingest detection (NFR-MEMORY-007).
Measurement
Histogram `memory_doctor_scan_seconds{result, rows_n}` per run.
Modules
memory
Priority
MUST
Owner
CTO
NFR-OBS-003Tail sampler CPU overhead < 2% of collector CPU; sampling rates exact per TASK-OBS-006 policyP0Verify: T
The OTel collector tail-sampler MUST apply the TASK-OBS-006 policies (100% errors, 100% 5xx, 100% slow, 100% flagged-tenants, 10% normal) and the measured sampling rates MUST match the policy targets within ±1% over a 1-hour window.
Measurement
Collector self-metric `otelcol_processor_tail_sampling_count_traces_sampled{policy}` divided by `otelcol_processor_tail_sampling_count_traces_seen` per minute. Should match policy targets ±1%.
Modules
OBS
Priority
MUST
Owner
CTO
NFR-OKR-004p95 < 2s from check-in submit to visible in the OKR dashboardP1Verify: T
OKR KR check-in latency — manual check-in MUST persist within 2s
Manual KR check-ins (`TASK-OKR-005`) MUST persist + appear in the OKR dashboard within 2s p95.
Measurement
Histogram `okr_checkin_persist_latency_ms`.
Modules
OKR
Priority
SHOULD
Owner
CEO
NFR-SKILL-002p95 < 25ms for capability admit (token check + policy lookup + decision)P0Verify: T
The SKILL capability broker MUST answer admit requests (skill requests cap X for tenant Y) at p95 < 25ms, p99 < 75ms, measured at the broker's `/admit` ingress over a 14-day rolling window.
First invocation of a skill not already in local cache MUST complete the cold-start steps (`registry pull → manifest parse → schema validate → capability admit → runtime ready`) at p95 < 2s and p99 < 5s.
Measurement
Histogram `skill_cold_start_latency_seconds{step=pull|parse|admit|ready}` — surfaces which step is the bottleneck.
Modules
SKILL
Priority
SHOULD
Owner
CTO
REL
Reliability
Availability targets, DR, backup RPO/RTO · 45 NFRsNFR-AI-001p95 < 5s from primary upstream error to first byte from secondary providerP0Verify: T
AI Gateway provider failover latency budget — p95 < 5s from primary error to secondary first chunk
The AI Gateway MUST route to a secondary provider when the primary provider returns a connection error, HTTP 5xx, or fails to emit a first byte within the primary timeout budget (default 8s; configurable per route).
Measurement
Histogram metric `ai_gateway_failover_latency_seconds{primary_provider, secondary_provider, route}` emitted by `services/ai-gateway/src/router.rs` on every provider switch.
Modules
AI
Priority
MUST
Owner
CTO
NFR-AI-003Open within 30s of 3rd error; first recovery probe at exactly 60s post-openP0Verify: T
AI Gateway circuit-breaker trip policy — 3 errors in 30s opens; recovery probe at 60s
The AI Gateway circuit-breaker per (provider, route) tuple MUST transition from CLOSED → OPEN when 3 consecutive upstream errors occur within a 30-second sliding window. Errors counted: connection-failure, HTTP 5xx, HTTP 429 with no `Retry-After`, and provider-emitted timeouts.
NFR-AI-008Reconciled token count within 0.5% of provider-reported usage, averaged over 1000 callsP0Verify: T
AI Gateway token-count post-call reconcile accuracy — within 0.5%
After every upstream provider call, the AI Gateway MUST reconcile the locally-projected token count (used for cost-ledger admit per NFR-AI-002) against the provider-reported usage in the response `usage` field.
Measurement
Gauge `ai_gateway_token_count_drift_pct{provider, model_alias}` — rolling 1000-call average delta. Alarm at > 0.5%.
Modules
AI
Priority
MUST
Owner
CFO
NFR-AUTH-005RoleMatrix refresher runs every AUTH_RBAC_REFRESH_SECS (default 60s); 3 consecutive failures triggers alertP0Verify: T
The `services/auth/src/rbac/refresher.rs` background task MUST call `RoleMatrix::load_from_db()` every `AUTH_RBAC_REFRESH_SECS` seconds (default 60s, floor 5s).
Measurement
Counter `auth_rbac_refresh_total{result}` where result ∈ {`success`, `error`}.
Idempotency-Key handling on admin POST endpoints (per TASK-AUTH-001 §1 #6) MUST retain seen keys for exactly 24 hours from first-seen-at timestamp.
Measurement
Gauge `auth_idempotency_keys_total` — current row count. Sev-3 alarm at > 1M.
Modules
AUTH
Priority
MUST
Owner
CTO
NFR-CRM-002100% of activity-feed reads return events in strict committed-at order; no out-of-orderP0Verify: T
CRM activity-feed ordering — feed MUST be strictly chronologically consistent
Activity events (call, email, meeting, note, stage-change) for an account/contact/deal MUST be displayed in the feed in strict `committed_at` order (newest first).
Measurement
Counter `crm_feed_out_of_order_total` — must be 0.
Modules
CRM
Priority
MUST
Owner
CSO-Sales
NFR-CRM-003Quarterly: score AUC vs actual won/lost outcomes ≥ 0.70; score drift trigger ≤ 5ppP1Verify: T
CRM lead-scoring drift — score model MUST be re-evaluated quarterly against actual outcomes
The lead-scoring model (`TASK-CRM-006`) MUST be re-evaluated quarterly against actual won/lost outcomes; AUC ≥ 0.70 to remain in production.
Measurement
Quarterly AUC against held-out outcomes.
Modules
CRM
Priority
SHOULD
Owner
CSO-Sales
NFR-CRM-008100% of won deals create or link to a PROJ engagement within 24hP0Verify: T
CRM conversion-to-engagement integrity — closed deal MUST link to a PROJ engagement
When a deal transitions to `won`, a PROJ engagement MUST be created or linked within 24h.
Measurement
Counter `crm_won_deal_engagement_linked_total`.
Modules
CRM
Priority
MUST
Owner
COO
NFR-CUO-201stripe collision rate ≤ 2⁻³² (8-hex SHA-256 truncation birthday bound); open/ glob check p95 < 10ms over ≤ 1000 open proposalsP0Verify: T
stripe-dedup MUST be deterministic + collision-bounded + check < 10ms p95
`cuo.core.stripe.compute_stripe(skill_name, signal_id, evidence_rows)` MUST be deterministic — same inputs across processes, sessions, and OS versions produce the same stripe id (verified by repeating the call with identical args and asserting string equality).
Measurement
Determinism: `test_stripe_determinism` in `modules/cuo/tests/test_refinement_proposal.py` already verifies — same evidence → same stripe across two calls in the same process.
Modules
cuo
Priority
MUST
Owner
CTO
NFR-CUO-202classify_proposal: 100% deterministic across runs; 0% mutation of any file; test-gate failure → 100% queue (never auto-apply)P0Verify: T
proposal classifier MUST be deterministic + read-only + test-gate-blocking
`cuo.core.proposal_applier.classify_proposal(proposal_path, skill_root)` MUST be deterministic — same proposal body + same target SKILL.md → same `Classification` dataclass across runs / processes / sessions.
Measurement
Determinism (already covered by TASK-CUO-202 tests): not a separate benchmark — `test_classify_is_read_only` + `test_bump_levels` together prove classification stability.
Modules
cuo
Priority
MUST
Owner
CTO
NFR-CUO-003100% of workflows dispatch to exactly one handler; 0 fallback-to-default in productionP0Verify: T
CUO handler dispatch correctness — workflow pattern maps to single handler
Every workflow declaring a `pattern:` in its frontmatter MUST dispatch to exactly one Handler subclass (`LinearHandler | TimeCriticalHandler | PerInstanceHandler | MultiOutputHandler | SequentialApprovalHandler | PersonaPairHandler`) — there is no "default" fallback.
Measurement
CI metric `cuo_workflows_missing_pattern_count` — must be 0.
Modules
CUO
Priority
MUST
Owner
CTO
NFR-CUO-004100% of invoker selection follows the documented ladder; explicit selection always honouredP0Verify: T
The CUO supervisor's `select_invoker("auto")` function MUST prefer in priority order: (a) `SubprocessInvoker` if `cyberos-skill` binary is on `$PATH`, else (b) `MockInvoker`.
NFR-CUO-007100% of replayed chains match original step count + skill chain + outcomeP1Verify: T
CUO replay safety — replayed chain MUST produce same audit row count + order
Replaying a previously-executed chain (via `cyberos-cuo execute --replay <chain_id>`) MUST produce the same `step_count`, same `skill_chain`, same `outcome` as the original.
NFR-CUO-009100% of step failures with declared compensations execute the rollback in reverse orderP0Verify: T
CUO per-step rollback — failed step MUST trigger declared compensations in reverse order
When a chain step fails AND the chain declares `rollback: <skill_id>` per step, all completed steps' rollback skills MUST execute in strict reverse order before the chain exits.
NFR-CUO-0100 lost checkpoints after process crash; recovery resumes from last fsync'd checkpointP0Verify: T
CUO LangGraph Postgres checkpointer durability — checkpoint writes MUST be fsync'd
LangGraph state checkpoints MUST be written to Postgres with `synchronous_commit = on`; checkpoint writes that return success are durable.
Measurement
Histogram `cuo_checkpoint_write_latency_seconds`.
Modules
CUO
Priority
MUST
Owner
CTO
NFR-DOC-005100% of IDV methods (VNeID, eIDAS, AATL, email-link) reachable from each tenant regionP0Verify: T
DOC IDV method coverage — all 4 declared methods MUST be reachable per tenant
The four declared IDV methods (`vneid`, `eidas`, `aatl`, `email_link`) MUST all be reachable + functional for every tenant in supported regions; outages are tracked per method per region.
NFR-DOC-006100% of tracked-expiry documents fire alerts at the four scheduled cadences within ±1 dayP0Verify: T
DOC expiry alert latency — alerts MUST fire at 90/30/7/1 day(s) before document expiry
Documents with `expiry_at:` metadata MUST trigger alerts at 90, 30, 7, and 1 day(s) before expiry, each within ±1 day of the scheduled point.
Measurement
Counter `doc_expiry_alert_fired_total{cadence}`.
Modules
DOC
Priority
MUST
Owner
CLO-Legal
NFR-DOC-007100% of renewal drafts preserve original terms (parties, scope, term length) modulo explicit deltasP1Verify: T
DOC renewal-draft accuracy — generated renewal MUST preserve original terms unless flagged
The renewal-proposal CUO workflow (`TASK-DOC-009`) MUST generate a renewal draft that preserves the original document's core terms unless the workflow explicitly flags a delta.
Measurement
Sample audit: CLO-Legal reviews 10% of generated drafts for unexpected mutations; counter `doc_renewal_unexpected_mutation_total`.
Modules
DOC
Priority
MUST
Owner
CLO-Legal
NFR-DOC-008100% of sequential-signing workflows complete in declared signer order; 0 out-of-order signaturesP0Verify: T
DOC signing workflow integrity — multi-party sign MUST complete in declared order
Multi-party signing flows declared as `sequence: ordered` MUST require signers to sign in declared order; signer N cannot sign before signers 1..N-1 have completed.
Measurement
Counter `doc_sign_order_violation_total` — must be 0.
Modules
DOC
Priority
MUST
Owner
CTO
NFR-EMAIL-005≥ 99% of incoming messages with In-Reply-To are correctly merged into the parent threadP0Verify: T
EMAIL thread merge correctness — In-Reply-To + References MUST group messages correctly
Inbound messages carrying `In-Reply-To` or `References` headers MUST be merged into the parent thread when the parent exists in the tenant's inbox.
NFR-HR-004100% of member leave balances match accrual - usage within ±0.01 daysP0Verify: T
HR leave-balance accuracy — accrued - used = balance within ±0.01 days
Per-member per-leave-type balance MUST satisfy: `accrued - used - corrections = current_balance`, within ±0.01 days.
Measurement
Daily reconciliation: `hr_leave_balance_drift_days{member, leave_type}` — must be < 0.01.
Modules
HR
Priority
MUST
Owner
CHRO
NFR-HR-007100% of onboarding sagas reach terminal state; crashes recover from last stepP0Verify: T
HR onboarding saga durability — every step MUST be replayable; crashes recoverable
The HR onboarding saga (`TASK-HR-007`) MUST persist step state in a durable journal — process crashes resume at last completed step.
Measurement
Counter `hr_onboarding_saga_total{outcome}`.
Modules
HR
Priority
MUST
Owner
CHRO
NFR-MCP-004100% of task state transitions follow the spec FSM; 0 backward transitionsP1Verify: T
MCP task primitive lifecycle — task state transitions MUST be linear + auditable
Tasks (per the spec `tasks` primitive) MUST transition through states `pending → running → (succeeded | failed | cancelled)` — no backward transitions; no state outside the closed set.
Measurement
Histogram `mcp_task_lifetime_seconds{outcome}`.
Modules
MCP
Priority
MUST
Owner
CTO
NFR-MCP-008p95 < 2s for server heartbeat; 99.5% monthly availability per serverP0Verify: T
MCP server heartbeat availability — registered servers MUST respond within 2s
Every registered MCP server MUST respond to the gateway's heartbeat probe (`ping` or equivalent) within 2s p95.
NFR-MEMORY-005Two consecutive `cyberos-memory export` runs on an unchanged store produce identical SHA-256 hashes on the output bundleP1Verify: T
memory deterministic export bit-identity — two runs on same store produce byte-identical zip
The `cyberos-memory export <tenant_id>` command MUST produce a deterministic ZIP bundle: two runs against the same Layer-2 state MUST produce byte-identical output (verified by SHA-256 of the zip file).
Measurement
Test artifact archive — `tests/memory/export_determinism/expected_hashes.txt` lists expected SHA-256s for a battery of test stores.
Modules
memory
Priority
MUST
Owner
CTO
NFR-OBS-004p95 < 30s from Alertmanager rule fire to CUO runbook surfaced to on-callP0Verify: T
Alert-to-CUO-runbook routing latency — p95 < 30s from rule fire to runbook surface
From the moment a Prometheus alert rule transitions to `firing`, the CyberOS routing pipeline MUST surface the matched CUO runbook to the on-call surface (Slack channel + CUO supervisor) at p95 < 30s and p99 < 60s.
Measurement
Histogram `obs_alert_to_runbook_seconds` measured from Alertmanager's `startsAt` to the Slack-webhook delivery timestamp on the routed message.
Modules
OBS
Priority
MUST
Owner
CTO
NFR-OKR-003100% of auto-progress computations within ±2% of independent per-KR computationP0Verify: T
OKR auto-progress accuracy — batch-computed progress MUST match per-KR sample within ±2%
The nightly auto-progress batch (`TASK-OKR-004`) MUST produce per-KR progress values within ±2% of an independent re-computation.
Measurement
Daily reconciliation: batch values vs sample-recomputed; counter `okr_progress_delta_pct{kr}` histogrammed.
Modules
OKR
Priority
MUST
Owner
CEO
NFR-OKR-006100% of cycles advance phase per schedule; 0 stuck or auto-jumped phasesP0Verify: T
OKR cycle-phase advance correctness — cycle phases MUST advance per declared schedule
OKR cycles MUST advance through declared phases: `draft → active → mid-cycle-check → final-check → retro-draft → closed` on the declared schedule.
NFR-OKR-008100% of child objectives have a resolvable parent; 0 orphan treesP0Verify: T
OKR objective cascade integrity — child objectives MUST chain to parent at all times
Objectives declaring `parent: <objective_id>` MUST reference a real, active objective in the same tenant.
Measurement
Counter `okr_orphan_child_total` — must be 0.
Modules
OKR
Priority
MUST
Owner
CEO
NFR-PROJ-001100% of concurrent edit sets converge within 2s of last network exchangeP0Verify: T
PROJ Yjs CRDT convergence — concurrent edits MUST converge to identical state across all clients
Concurrent edits to the same project artifact (issue, brief, cycle plan) via Yjs CRDT MUST converge to byte-identical state across all connected clients within 2s after the last network exchange.
Measurement
Histogram `proj_yjs_convergence_latency_seconds` — measured by synthetic multi-client probes.
Modules
PROJ
Priority
MUST
Owner
CTO
NFR-PROJ-002100% of unbilled time entries reflect the current rate-card within 60s of rate changeP0Verify: T
PROJ billable cascade correctness — rate-card change MUST propagate to all unbilled time
When a rate-card row is created/updated/deactivated, all unbilled time entries falling under that rate-card's scope MUST recompute their `billable_amount` within 60s.
Measurement
Histogram `proj_billable_cascade_latency_seconds` — time from rate change to last entry recomputed.
Modules
PROJ
Priority
MUST
Owner
CFO
NFR-PROJ-003100% of memory_link references resolve; 0 dangling links in productionP0Verify: T
PROJ memory_link integrity — every memory_link MUST resolve to a real memory row
Every `memory_link` field on a PROJ entity (issue, decision-anchor, cycle review) MUST reference a real, accessible memory row by its `(tenant_id, actor_id, seq)` triple.
NFR-PROJ-006100% of Gantt critical-path computations match a reference CPM implementationP1Verify: T
PROJ Gantt critical path correctness — CPM algorithm MUST match reference output
The Gantt view's critical-path-method (CPM) computation MUST match a reference implementation for any dependency graph the UI accepts (acyclic, single-source, single-sink, or general DAG).
Measurement
Counter `proj_gantt_cpm_mismatch_total` — must be 0.
Modules
PROJ
Priority
SHOULD
Owner
CTO
NFR-PROJ-009100% of issue state transitions match the FSM; 0 illegal transitions in productionP0Verify: T
PROJ issue state machine — transitions MUST conform to the declared FSM
Issue state transitions MUST conform to the FSM declared in `modules/proj/state-machine.yaml`: states + allowed transitions + required roles.
Measurement
Counter `proj_issue_illegal_transition_total{from, to}` — must be 0.
Modules
PROJ
Priority
MUST
Owner
CTO
NFR-RES-006Flag agreement with COO confirmation ≥ 95% over a 4-week sampleP1Verify: T
RES capacity-flag accuracy — flag MUST match human-confirmed over/under state ≥ 95% of time
The capacity flags (over-alloc, under-alloc) MUST match COO's human assessment of the same member ≥ 95% of the time over a 4-week rolling sample.
NFR-REW-001100% of payroll runs are bit-identical on rerun with same inputs + parameter versionP0Verify: T
REW comp-formula determinism — same inputs MUST produce same payroll output across reruns
The monthly payroll compute (`TASK-REW-005`) MUST produce byte-identical outputs when rerun with the same `{member_set, parameter_version, period, 3p_income_set}` tuple.
Measurement
Hash comparison on every recompute; counter `rew_payroll_recompute_hash_mismatch_total` — must be 0 if inputs unchanged.
Modules
REW
Priority
MUST
Owner
CFO
NFR-REW-003100% conservation: |pool_in - (pool_distributed + carry_over)| < 1 VND per quarterP0Verify: T
REW bonus-pool conservation — pool inflow MUST equal sum of distributions + carry-over
The bonus-pool ledger (`TASK-REW-007`) MUST satisfy: every inflow row sums to the same total as the corresponding outflow rows (distribution) plus the carry-over balance, per quarter.
Measurement
Per-quarter `rew_bp_conservation_delta_vnd` — must be ≤ 1.
Modules
REW
Priority
MUST
Owner
CFO
NFR-REW-006100% of payslips satisfy gross - (PIT + SI + other deductions) = net within ±1 VNDP0Verify: T
REW gross/net reconciliation — gross - deductions MUST equal net for every payslip
Every payslip row MUST satisfy the identity: `gross_vnd - (pit_vnd + si_employee_vnd + advance_recovery_vnd + other_deductions_vnd) = net_vnd`, within ±1 VND tolerance for rounding.
Measurement
Per-cycle counter `rew_payslip_reconciliation_fail_total{period}` — must be 0.
Modules
REW
Priority
MUST
Owner
CFO
NFR-REW-007100% of VietQR batches verifiable: |sum(batch.amounts) - sum(payslip.nets)| = 0P0Verify: T
REW VietQR payroll batch integrity — batch hash MUST match sum of payslip nets
Each VietQR payroll batch MUST be cryptographically tied to the payslip set it disburses: the batch row carries a SHA-256 hash of the canonical-sorted payslip-net list.
Measurement
Counter `rew_vietqr_hash_mismatch_total` — must be 0.
Modules
REW
Priority
MUST
Owner
CFO
NFR-SKILL-00399.95% monthly availability for GET /v2/<bundle>/manifests/<ref> + blobs/<digest>P0Verify: A
The SKILL OCI registry MUST serve manifest reads (`GET /v2/<name>/manifests/<ref>`) and blob reads (`GET /v2/<name>/blobs/<digest>`) at ≥ 99.95% monthly availability measured at the public ingress.
Measurement
Synthetic prober every 60s from 3 regions hitting `GET /v2/cyberos-skill-task-author/manifests/latest`.
Modules
SKILL
Priority
MUST
Owner
CTO
NFR-SKILL-007deterministic-flag skills produce byte-identical outputs over 100 reruns with fixed seedP1Verify: T
Skills declaring `deterministic: true` in their manifest frontmatter MUST produce byte-identical outputs when invoked twice with the same `{inputs, seed, capabilities}` tuple.
Measurement
CI gate per `deterministic: true` skill: rerun 5 times with same seed; assert all outputs hash-match.
Modules
SKILL
Priority
SHOULD
Owner
CTO
NFR-TEN-001100% of tenant-create sagas reach terminal state (committed | rolled-back); 0 stuck-in-progressP0Verify: T
TEN provisioning saga reliability — every tenant create MUST be transactional
Tenant provisioning MUST run as a saga with all-or-nothing semantics: every step succeeds and the tenant is committed, OR any step fails and all prior steps roll back.
NFR-TEN-005Re-running export with same parameters produces byte-identical bundle hashP0Verify: T
TEN signed bundle determinism — same tenant export MUST produce same hash
The signed-bundle export (`TASK-TEN-105`) MUST be deterministic — re-running with the same `{tenant_id, export_at}` produces byte-identical output (same SHA-256).
Measurement
Counter `ten_bundle_export_hash_mismatch_total` — must be 0 on re-runs.
Modules
TEN
Priority
MUST
Owner
CTO
NFR-TEN-007Metered amounts accurate within ±0.1% vs ground-truth reconciliationP0Verify: T
TEN four-axis metering precision — users/storage/AI/seats measured within ±0.1%
The four metering axes (active users, storage GB-month, AI tokens, seats) MUST report values accurate to within ±0.1% of ground-truth (independent recount from DB).
Measurement
Daily reconciliation: `ten_metering_drift_pct{axis}` — must be < 0.1%.
Modules
TEN
Priority
MUST
Owner
CFO
NFR-TEN-00999.5% monthly availability for VND-billing initiation + settlementP0Verify: A
TEN VND domestic rail uptime — VND-billing path MUST maintain 99.5% monthly availability
The VND domestic billing rail (NAPAS + bank integration) MUST maintain 99.5% monthly availability for initiation + settlement.
Measurement
Synthetic prober (60s cadence) against payment initiation endpoint.
Modules
TEN
Priority
MUST
Owner
CFO
SEC
Security
Zero-trust, crypto, compliance gates · 25 NFRsNFR-AI-006Property test: 0 cross-tenant cache hits over 10,000 random JWT pairingsP0Verify: T
AI Gateway per-tenant cache cross-leak — zero cross-tenant reads under 10k random JWTs
The AI Gateway prompt/completion cache MUST key every entry by `(tenant_id, persona_version, prompt_hash, model_alias)` — never just `prompt_hash`. The `tenant_id` is taken from the verified JWT, not from any caller-supplied parameter.
Measurement
Property test `services/ai-gateway/tests/cache_cross_tenant_leak_test.rs` (T) runs the 10k-pair generator on every PR; assertion: zero cross-tenant hits.
Modules
AI
Priority
MUST
Owner
CTO
NFR-AUTH-002Property test: 0 cross-tenant rows returned across 1000 random tenant_id pairings on every RLS-protected tableP0Verify: T
AUTH RLS cross-tenant leak — zero rows leaked under property test sweep of 1k random tenants
Every tenant-scoped Postgres table MUST carry a Row-Level Security (RLS) policy `tenant_id = current_setting('app.tenant_id')::uuid` applied to SELECT, UPDATE, DELETE.
Measurement
Counter `auth_rls_unscoped_query_total` — should always be zero. Sev-0 alarm on any non-zero.
Modules
AUTH
Priority
MUST
Owner
CSO
NFR-AUTH-004HIBP API call wrapped in 2s hard timeout; timeout never blocks signup; audit row emitted on every timeoutP0Verify: T
AUTH HIBP API timeout policy — 2s hard timeout; fail-open with audit row on timeout
The HaveIBeenPwned (HIBP) k-anonymity API call MUST be wrapped in a 2s hard timeout. If HIBP doesn't respond in 2s, the call is aborted.
Measurement
Counter `auth_hibp_timeout_total` — incremented on every 2s abort. Sev-3 alarm at > 10/hour.
Modules
AUTH
Priority
MUST
Owner
CSO
NFR-AUTH-006Accept TOTP codes within ±1 30s step (90s window); reject ±2; rate-limit 5 attempts per minuteP0Verify: T
The TOTP verify endpoint MUST accept codes within ±1 30-second step (effectively a 90-second window: current ± 30s).
Measurement
Counter `auth_totp_verify_total{result}` where result ∈ {`success`, `fail_outside_window`, `fail_invalid_code`, `rate_limited`}.
Modules
AUTH
Priority
MUST
Owner
CSO
NFR-AUTH-007Rotation operation completes with at least one active key on JWKS at all times; old key marked retired but honored for verify for 7 daysP0Verify: T
AUTH signing-key rotation — active key always present; old key honored 7 days post-rotation
The AUTH signing-key rotation procedure MUST ensure at least one key with `status=active` is present in JWKS at every moment during rotation — there is never a window where JWKS is empty or has no active key.
Measurement
Gauge `auth_signing_keys_active_count` — should always be ≥ 1. Sev-0 alarm on 0.
Modules
AUTH
Priority
MUST
Owner
CSO
NFR-AUTH-009Password hashing uses bcrypt cost ≥ 12; production override via AUTH_BCRYPT_COST envP0Verify: I
Password hashing in AUTH MUST use bcrypt with cost factor ≥ 12 (default 12; configurable via `AUTH_BCRYPT_COST` env var).
Measurement
Histogram `auth_password_hash_seconds` — at cost 12 expect ~250ms; at cost 13 expect ~500ms. Alerts at < 100ms (cost too low) and > 1000ms (cost too high or CPU contention).
Modules
AUTH
Priority
MUST
Owner
CSO
NFR-AUTH-010OIDC state tokens expire 10 minutes after issuance; single-use; CSRF-bound to sessionP0Verify: T
AUTH OIDC state-token TTL — 10-minute hard expiry; CSRF-resistant; one-shot
OIDC `state` parameters issued during the Authorization Code flow MUST expire exactly 10 minutes after issuance. The callback handler rejects expired states with HTTP 400 `state_expired`.
Measurement
Counter `auth_oidc_state_consumed_total{result}` where result ∈ {`success`, `expired`, `replayed`, `csrf_mismatch`, `invalid_mac`}.
Modules
AUTH
Priority
MUST
Owner
CSO
NFR-CRM-006100% of account-bank changes emit a signed audit row + trigger CFO notificationP0Verify: T
CRM bank-config audit — account banking changes MUST emit signed audit row
Changes to an account's banking info (bank, branch, account number, beneficiary name) MUST emit a signed audit row with `{actor_id, account_id, old_banking_hash, new_banking_hash, changed_at}`.
Measurement
Counter `crm_bank_change_total{actor_role}`.
Modules
CRM
Priority
MUST
Owner
CFO
NFR-DOC-009100% of imported signed docs verified at import; invalid signatures flagged + quarantinedP0Verify: T
DOC third-party import validation — imported signed docs MUST be signature-verified
Documents imported from third-party providers (DocuSign, Adobe Sign, etc.) MUST have their signatures verified at import time against the issuing CA chains.
NFR-EMAIL-002Recall ≥ 95% on the platform's adversarial prompt-injection email corpusP0Verify: T
EMAIL CaMeL prompt-injection blocking — recall ≥ 95% on the held-out adversarial set
The CaMeL dual-LLM defence (`TASK-EMAIL-005`) MUST detect prompt-injection content in inbound mail at recall ≥ 95% on the platform's held-out adversarial corpus (200+ samples curated by CISO).
NFR-EMAIL-004100% of outbound emails pass DKIM + SPF + DMARC alignment for the tenant's sending domainP0Verify: T
EMAIL DKIM/SPF/DMARC pass-through — outbound mail MUST be DMARC-aligned
Every outbound email MUST carry a valid DKIM signature aligned to the tenant's sending domain; the platform refuses to send unsigned mail.
Measurement
Hourly synthetic mail-to-self DMARC pass rate per tenant.
Modules
EMAIL
Priority
MUST
Owner
CTO
NFR-EMAIL-006100% of CaMeL pipeline runs maintain LLM separation; 0 untrusted-content-with-tools eventsP0Verify: T
EMAIL dual-LLM separation — quarantined LLM MUST NOT see untrusted content + tool surface
The CaMeL dual-LLM architecture MUST maintain strict separation: the "privileged" LLM has tool access but never sees raw email body; the "quarantined" LLM sees raw body but has zero tool access.
Measurement
Counter `email_camel_quarantined_tool_attempt_total` — must be 0.
Modules
EMAIL
Priority
MUST
Owner
CISO
NFR-EMAIL-008100% of bulk sends (>100 recipients) carry a recorded approval; 0 auto-sent bulksP0Verify: T
NFR-MCP-005100% of elicitation prompts pass injection-safety lint; clients can always declineP1Verify: T
MCP elicitation prompt safety — server-issued prompts MUST be scoped + escapable
MCP elicitation prompts (server → client requests for additional info) MUST NOT contain instructions that override the host shell's own system prompt or behaviour rules.
NFR-MCP-007100% of authorization-code requests carry valid PKCE challenge; implicit grant disabledP0Verify: T
MCP OAuth PKCE — authorization code flow MUST require PKCE; no implicit grant
The MCP-AUTH endpoint MUST require PKCE (RFC 7636) for every authorization code request — `code_challenge` + `code_challenge_method=S256` are mandatory.
Measurement
Counter `mcp_oauth_pkce_missing_total` — must be 0.
Modules
MCP
Priority
MUST
Owner
CTO
NFR-MEMORY-002100% of l2_memory reads re-verify the chain anchor; any mismatch quarantines the row and sev-1 alertsP0Verify: T
Every read from `l2_memory` MUST re-verify the row's chain anchor (hash of `(prev_chain_hash, payload_canonical_json)`) against the on-row `chain_hash` column.
Measurement
Counter `memory_l2_anchor_verify_total{result}` where result ∈ {`ok`, `mismatch`}.
Modules
memory
Priority
MUST
Owner
CSO
NFR-MEMORY-003Property test: 0 cross-tenant cursor influence under 1000 random advance sequencesP0Verify: T
memory per-tenant cursor isolation — cursor advance for tenant A never affects tenant B
The Layer-2 ingest cursor (`services/memory/src/layer2/cursor.rs`) MUST be scoped per (tenant_id, actor_id) — there is no global cursor that crosses tenants.
NFR-OBS-006Tenant A user views ONLY tenant A data in Grafana; zero cross-tenant leakage under property testP0Verify: T
OBS compliance view scoping — per-tenant RLS-equivalent on Grafana proxy
The tenant-aware Grafana proxy MUST rewrite every PromQL, LogQL, and TraceQL query to inject a `tenant_id=<tenant_from_jwt>` filter before forwarding to Prometheus, Loki, or Tempo respectively (NFR-OBS-008 covers the AST coverage).
Measurement
Counter `obs_proxy_unscoped_query_total{role}` — should be zero for any role lacking `tenant_scope=global`.
Modules
OBS
Priority
MUST
Owner
CSO
NFR-OBS-008100% of PromQL, LogQL, TraceQL queries through the proxy carry an injected tenant_id filter (verified per-query-language test suite)P0Verify: T
Grafana proxy AST-injection coverage — PromQL + LogQL + TraceQL all rewritten with tenant_id
The tenant-aware Grafana proxy MUST parse incoming queries into the language-specific AST (PromQL, LogQL, TraceQL) — MUST NOT use regex-based rewriting which is bypassable via comment-injection.
Measurement
Counter `obs_proxy_ast_parse_failed_total{language}` — should be near-zero; high values indicate AST parser drift.
Modules
OBS
Priority
MUST
Owner
CSO
NFR-OKR-002100% of custom-SQL KRs carry both signatures + readonly DB roleP0Verify: T
NFR-SKILL-0080 cap-bypass incidents in 90 days; 100% of attempted escapes blocked + auditedP0Verify: T
SKILL sandbox isolation — skill execution MUST NOT escape declared capabilities
A skill MUST NOT access any platform resource (DB, network, filesystem, secrets) outside the capabilities declared in its manifest and granted by the broker.
NFR-TEN-006100% of hostile-override terminations carry CEO + CLO signatures within 24h windowP0Verify: T
TEN hostile-override approval window — emergency termination requires CEO + CLO co-sign
Hostile termination (TASK-TEN-202) — used when a tenant is committing abuse and the normal 90-day FSM is too slow — MUST require both CEO and CLO-Legal signatures within a 24-hour window.
NFR-KB-004Recall ≥ 99% for known-keyword queries; p95 latency < 200msP0Verify: T
KB lexical search recall — FTS5 + pgroonga MUST cover known-keyword queries at ≥ 99%
Lexical search (FTS5 for SQLite tier; pgroonga for Postgres tier) MUST find documents containing exact keyword matches at recall ≥ 99% — known-keyword queries should not silently miss documents.
Measurement
Per-quarter benchmark: recall on known-keyword test set.
Modules
KB
Priority
MUST
Owner
CTO
NFR-KB-005100% of tagged runbooks surface in top-3 for canonical incident-keyword queriesP1Verify: T
KB runbook-tag accuracy — runbook docs MUST be findable by incident-keyword + tag combo
Documents tagged `kind:runbook` MUST be retrievable via the API `?tag=runbook&query=<incident-keyword>` and rank in the top-3 results for the keyword.
Measurement
Per-quarter benchmark: top-3 accuracy on canonical incident queries.
Modules
KB
Priority
SHOULD
Owner
CTO
NFR-PROJ-0070 critical/serious axe-core violations per page; 100% page coverage in CIP0Verify: T
PROJ a11y-ci gate — every page MUST pass axe-core with 0 critical/serious issues
Every PROJ page MUST pass `axe-core` with 0 critical and 0 serious violations in the CI a11y-ci gate.
Measurement
Per-page counter `proj_axe_violation_count{page, severity}` — critical/serious must be 0.
Modules
PROJ
Priority
MUST
Owner
CTO
MAINT
Maintainability
CI speed, coverage, schema deprecation · 16 NFRsNFR-CHAT-004Fork rebased onto upstream minor monthly; major version quarterly; security CVEs within 14 daysP0Verify: I
CHAT Mattermost fork upstream-merge cadence — monthly minor rebase; quarterly major
The CyberOS Mattermost fork MUST be rebased onto upstream minor releases at least monthly (the first business day after the upstream minor ships).
Measurement
File inspection — `MATTERMOST_UPSTREAM_VERSION.md` must be current; quarterly audit.
Modules
CHAT
Priority
SHOULD
Owner
CTO
NFR-CRM-001100% of account/contact/deal rows satisfy schema + relational invariantsP0Verify: T
The HR `member` table MUST enforce: required fields (`member_id, full_name, email, employment_status, hire_date, contract_type`); closed enum for `employment_status` and `contract_type`.
Measurement
CI metric `hr_member_schema_violation_count` — must be 0.
Modules
HR
Priority
MUST
Owner
CHRO
NFR-KB-001100% of document saves produce a version row; history immutable; retention ≥ 1 yearP0Verify: T
KB document versioning history — every save MUST create an immutable version row
Every document save MUST create an immutable version row in `kb_document_version` carrying `{doc_id, version_no, author_id, saved_at, body_hash, body_blob_ref}`.
Measurement
Counter `kb_document_save_total{result}`.
Modules
KB
Priority
MUST
Owner
CTO
NFR-KB-006100% of `translation_of:` docs reference an existing source; sync lag ≤ 24h after source changeP1Verify: T
KB translation parity — translated doc MUST reference + lag source by ≤ 24h
Documents with `translation_of: <doc_id>` frontmatter MUST point to a real source document in the same tenant.
Measurement
Counter `kb_translation_dangling_total` — must be 0.
Modules
KB
Priority
SHOULD
Owner
CTO
NFR-OKR-001100% of KRs use the closed enum types; 100% of numeric KRs are computable from declared sourceP0Verify: T
KR types MUST be a closed enum: `numeric`, `binary`, `milestone-progress`, `custom-sql`. Ad-hoc types are rejected at create time.
Measurement
CI metric `okr_kr_invalid_type_count` — must be 0.
Modules
OKR
Priority
MUST
Owner
CEO
NFR-OKR-005100% of digest recipient lists reflect terminations + role changes within 24hP1Verify: T
OKR digest-recipient freshness — Monday digest list MUST match current tenant roster
The Monday OKR digest (`TASK-OKR-006`) MUST be delivered only to currently-active members; terminated members MUST be removed within 24h of HR transition.
Measurement
Counter `okr_digest_sent_to_terminated_total` — must be 0.
Modules
OKR
Priority
SHOULD
Owner
CHRO
NFR-PROJ-004100% of mid-cycle additions/removals tracked + visible in the cycle review draftP1Verify: T
PROJ cycle-window enforcement — work added mid-cycle MUST be flagged + tracked
Cycle windows (default 2-week sprint, configurable) MUST be persisted with `{start_at, end_at, frozen_at}` where `frozen_at` is the moment scope is closed.
NFR-PROJ-0080 raw hex or raw px values in PROJ component CSS/JSX; tokens consumed exclusivelyP0Verify: T
PROJ design-tokens drift — UI MUST consume tokens; raw hex/px values are CI-banned
PROJ UI component source (`apps/proj/src/`) MUST NOT contain raw hex color values (`#...`), raw RGB/HSL strings, or raw pixel values for spacing/typography.
Measurement
CI metric `proj_raw_color_value_count` — must be 0.
Modules
PROJ
Priority
MUST
Owner
CTO
NFR-RES-007100% of terminated members removed from active allocations within 24h of termination effective dateP0Verify: T
RES member-departure handling — terminated members MUST be removed from active allocations within 24h
When a member's HR record transitions to `terminated` with effective date D, all active allocations MUST be ended by D + 24h.
Measurement
Counter `res_terminated_member_active_alloc_total` — must trend to 0 within 24h.
Modules
RES
Priority
MUST
Owner
COO
NFR-SKILL-001100% of published manifests pass schema validation; 0 unknown-field toleranceP0Verify: T
Every SKILL bundle published to the OCI registry MUST carry a top-level `SKILL.md` whose YAML frontmatter parses cleanly and contains the closed set of required keys: `name`, `version`, `description`, `inputs`, `outputs`, `capabilities`, `audit`.
Measurement
Counter `skill_publish_validation_failure_total{stage=client|server, error_code}` per failed publish.
Modules
SKILL
Priority
MUST
Owner
CTO
NFR-SKILL-0060 author skills exist without a sibling audit skill; CI gates publishP0Verify: T
SKILL fine-tune loop integrity — author+audit pair MUST stay in lockstep
Every author skill at `skill/public/<name>/` MUST have a sibling audit skill at `skill/public/<name>-audit/` carrying matching version + same set of declared outputs.
Measurement
CI metric `skill_pair_drift_count` — counts authors without audits; must be 0 to merge.
Modules
SKILL
Priority
MUST
Owner
CTO
NFR-SKILL-010100% of skill outputs validate against their declared output contractP0Verify: T
SKILL output contract conformance — produced output MUST match declared schema
Every skill output MUST match the JSON Schema declared in `outputs:` of its `SKILL.md` frontmatter, validated by the runtime before the output is handed back to the caller.
The CHAT search endpoint MUST support Vietnamese diacritic-folding: a query "Nguyen" MUST match messages containing "Nguyễn". Conversely, a query with full diacritics MUST match diacritic-less messages.
Measurement
Recall@10 reported quarterly to `docs/audits/chat-vn-search-recall/YYYY-Q*.json`.
Modules
CHAT
Priority
MUST
Owner
CTO
NFR-MEMORY-008Hybrid lexical + vector search recall@10 ≥ 0.85 on the memory search test corpusP0Verify: T
memory search API recall floor — lexical hybrid recall@10 ≥ 0.85 on test corpus
The `services/memory/src/search.rs` search API MUST achieve recall@10 ≥ 0.85 on the curated memory search test corpus (`services/memory/tests/fixtures/search_corpus_v*.jsonl`).
Measurement
Recall@10 reported quarterly to `docs/audits/memory-search-recall/YYYY-Q*.json`.
Modules
memory
Priority
MUST
Owner
CTO
COMP
Compliance
Regulatory, legal, audit obligations · 32 NFRsNFR-AI-009100% of upstream calls route to a provider region matching the tenant residency policyP0Verify: T
AI Gateway residency pinning enforcement — provider region matches tenant policy 100%
Every tenant MUST carry a residency policy field `residency_region` ∈ {`apac`, `eu`, `us`, `global`} on the tenants table. The AI Gateway reads this from the JWT or from a cached lookup.
Measurement
Counter `ai_gateway_region_match_total{tenant_region, provider_region, match}` per call.
Modules
AI
Priority
MUST
Owner
CSO
NFR-CHAT-006100% of messages where subject is author OR recipient are included; memory chain proof attachedP0Verify: T
CHAT DSAR message export completeness — every message subject authored OR received + chain proof
A CHAT DSAR (Data Subject Access Request) export for subject `S` MUST include every message in the platform where `S` is either the author OR a member of the channel (recipient) at the time the message was posted.
Measurement
Counter `chat_dsar_exports_total{result}` per request.
Modules
CHAT
Priority
MUST
Owner
CSO
NFR-CRM-004100% of large deals (> threshold) carry CFO signature before closeP0Verify: T
CRM win-loss approval — deals > threshold MUST be approved by CFO before close
Deals with `amount_vnd > tenant.large_deal_threshold` MUST require CFO signature before transitioning to `won` or `lost`.
Measurement
Counter `crm_large_deal_no_approval_attempt_total` — must be 0.
Modules
CRM
Priority
MUST
Owner
CFO
NFR-CRM-005100% of VN business accounts carry a GDT MST validation within last 90 daysP0Verify: T
CRM MST validation freshness — VN business accounts MUST have MST validated within 90 days
Accounts marked `account_type: vn_business` MUST have their MST (tax ID) validated against the GDT lookup within the last 90 days.
Measurement
Gauge `crm_account_mst_age_days{tenant}` — max should be < 90.
Modules
CRM
Priority
MUST
Owner
CFO
NFR-CUO-002100% of executed chains produce 1 row per step + 1 summary row; reconciliation drift < 0.001%P0Verify: T
CUO memory audit-chain emission — every chain execution MUST emit ≥ 2 rows
Every CUO chain execution with `--memory-emit` flag set MUST emit one `kind=cuo.step` row per executed step plus one `kind=cuo.chain.end` summary row carrying `{persona, workflow, step_count, started_at, ended_at, outcome}`.
NFR-CUO-005100% of audit rows carry persona_slug, persona_version, workflow_slug, workflow_versionP0Verify: T
CUO persona-version stamping — every chain MUST record persona+workflow version
Every CUO chain audit row MUST carry `{persona_slug, persona_version, workflow_slug, workflow_version}` — both slug and version, both for persona and workflow.
Measurement
Counter `cuo_audit_missing_version_total` — must always be 0.
Modules
CUO
Priority
MUST
Owner
CTO
NFR-DOC-001100% of EU-jurisdiction signatures carry a valid QES attestation from a recognised QTSPP0Verify: T
DOC eIDAS QTSP attestation — signatures MUST be QES-grade for EU jurisdiction docs
Signatures applied to documents tagged `jurisdiction: EU` MUST be Qualified Electronic Signatures (QES) per eIDAS Regulation EU 910/2014, backed by a QTSP from the EU trusted list.
Measurement
Counter `doc_signature_total{jurisdiction, signature_class}` — assert EU + non-QES = 0.
Modules
DOC
Priority
MUST
Owner
CLO-Legal
NFR-DOC-002100% of PAdES-LT documents restamped at least 30 days before any contained timestamp expiresP0Verify: T
DOC PAdES-LT timestamp freshness — restamp before any timestamp expiry
Documents signed with PAdES-LT (Long-Term) MUST be restamped (PAdES-LTA extension) at least 30 days before any contained timestamp or CRL nears its validity end.
Measurement
Gauge `doc_pades_lt_days_until_restamp_needed{doc_id}` — min across all timestamps.
Modules
DOC
Priority
MUST
Owner
CLO-Legal
NFR-DOC-003100% of VN-jurisdiction signatures chain to a NEAC-recognised CAP0Verify: T
DOC VN-CA signature compliance — Vietnamese signatures MUST chain to NEAC root
Documents tagged `jurisdiction: VN` MUST be signed with certificates that chain to a National Electronic Authentication Centre (NEAC) recognised root CA.
NFR-DOC-004100% of VNeID-verified signers carry the VNeID identifier in the signature attestationP1Verify: T
DOC VNeID linkage — identity-verified signers MUST be bound to VNeID identifier
When a signer's identity is verified via VNeID (Vietnamese national digital ID), the resulting signature MUST carry the VNeID identifier in the attestation block.
Measurement
Counter `doc_vneid_signature_total`.
Modules
DOC
Priority
SHOULD
Owner
CLO-Legal
NFR-HR-002100% of contract changes create new versioned row; 0 in-place editsP0Verify: T
HR contract-history immutability — contract changes MUST create new versions, never edit old
Contract changes (promotion, comp change, role change) MUST create a new contract row with `effective_from` timestamp; the prior row is closed with `effective_to`.
Measurement
Counter `hr_contract_in_place_edit_attempt_total` — must be 0.
Modules
HR
Priority
MUST
Owner
CHRO
NFR-HR-005100% of in-flight HR cases preserve their original policy versionP1Verify: T
HR policy-version compatibility — policy changes MUST be backward-compatible for in-flight cases
HR policies (leave, working hours, OT rates) MUST be versioned; in-flight cases (a leave request submitted under v1) MUST be evaluated against v1 even after v2 ships.
Measurement
Counter `hr_policy_version_mismatch_total` — case evaluated under wrong version; must be 0.
Modules
HR
Priority
MUST
Owner
CHRO
NFR-HR-006100% of accrual corrections carry approver signature + structured reasonP0Verify: T
HR accrual-correction audit — every manual leave adjustment MUST require reason + approver
Manual leave-accrual corrections (overrides of the automatic accrual) MUST be approved by a member with `hr:leave:adjust` permission.
NFR-HR-009100% of perf-signal rows retained ≥ 7 years; 0 unauthorized deletionsP0Verify: T
HR performance history retention — performance signals MUST be retained ≥ 7 years
Performance signals (reviews, ratings, 360s, PIPs) MUST be retained ≥ 7 years post-member-termination.
Measurement
Gauge `hr_perf_record_oldest_age_years` — must be ≥ 7 for terminated members.
Modules
HR
Priority
MUST
Owner
CHRO
NFR-MCP-001100% pass on official MCP conformance suite for spec version 2025-11-25P0Verify: T
MCP protocol compliance — runtime MUST conform to spec 2025-11-25
The CyberOS MCP runtime MUST implement the JSON-RPC 2.0 message envelope, capability negotiation, and tool/resource/prompt primitives per the MCP spec version 2025-11-25.
Measurement
CI: full conformance suite pass/fail per spec version.
Modules
MCP
Priority
MUST
Owner
CTO
NFR-MCP-006100% of names pass SEP-986 validator; non-conforming names blocked at registrationP0Verify: T
MCP SEP-986 naming compliance — all server/tool identifiers MUST match SEP-986 regex
Every MCP server, tool, resource, and prompt name MUST conform to the SEP-986 naming pattern: `^[a-z][a-z0-9_-]{0,63}$` (lowercase ASCII, digits, underscore, hyphen, leading letter, max 64 chars).
NFR-MEMORY-006Signed Tree Head (STH) published every 24h OR 100MB of new rows, whichever occurs firstP1Verify: T
memory STH publication frequency — consolidate every 24h or 100MB whichever first
The memory consolidation process MUST publish a Signed Tree Head (STH) — a Merkle root over the consolidated window's rows, signed by the platform key — every 24 hours of wall-clock time OR every 100MB of new rows ingested since the last STH, whichever threshold is hit first.
Measurement
Counter `memory_sth_published_total{result}` per STH attempt.
Modules
memory
Priority
MUST
Owner
CSO
NFR-OBS-007100% of fired alerts carry the four-field custody manifest; CI verifies on every releaseP0Verify: T
Every Alertmanager-routed alert MUST carry the four-field chain-of-custody manifest:
Measurement
Counter `obs_alert_custody_manifest_complete_total{result}` where result ∈ {`complete`, `incomplete`}. Incomplete should be zero.
Modules
OBS
Priority
MUST
Owner
CSO
NFR-OKR-007100% of closed cycles carry a CEO-signed retro before closeP0Verify: T
OKR retro-approval gate — quarterly retro MUST be CEO-signed before closing
A cycle MUST NOT advance to `closed` without a CEO-signed retro.
Measurement
Counter `okr_cycle_close_no_retro_attempt_total` — must be 0.
Modules
OKR
Priority
MUST
Owner
CEO
NFR-RES-002100% of allocation mutations produce an audit row with before/after deltaP0Verify: T
RES allocation-change history — every allocation mutation MUST emit an audit row
Every change to a member's allocation (create, update, deactivate) MUST emit a memory audit row carrying `{member_id, project_id, before_pct, after_pct, actor_id, reason?, changed_at}`.
NFR-RES-003100% of VN overtime hours carry recorded worker consent + supervisor signoffP0Verify: T
RES OT consent capture — VN overtime MUST require + persist worker consent
VN-resident workers' overtime MUST NOT be allocated without explicit, recorded consent of the worker, per the VN labour code OT cap (`TASK-RES-005`).
Measurement
Counter `res_ot_consent_missing_total` — must be 0.
Modules
RES
Priority
MUST
Owner
CHRO
NFR-RES-004100% of hiring memos carry both signatures before role goes to recruitingP1Verify: T
RES hiring-memo signoff — CUO-generated memo MUST have hiring-manager + CHRO co-sign
The hiring-memo CUO workflow (`TASK-RES-004`) MUST produce a memo signed by both the hiring manager + CHRO before the role is published to recruiting channels.
NFR-REW-002100% of monthly runs within ±1 VND of a manual sample of 5 members per periodP0Verify: T
REW payroll-cycle accuracy — monthly run MUST close within +/- 1 VND vs hand-verified sample
Each monthly payroll run MUST be sample-verified: 5 random members' gross/SI/PIT/net amounts hand-computed by the CFO + an external accountant and compared against the system output.
Measurement
Per-cycle attestation memo (mandatory artifact).
Modules
REW
Priority
MUST
Owner
CFO
NFR-REW-004100% of P3 distributions carry CFO + CHRO signatures; no auto-execute without bothP0Verify: T
REW P3 distribution audit — quarterly distribution MUST have CFO+CHRO co-sign before execution
Every P3 quarterly distribution MUST be approved by both CFO and CHRO via signed approval rows before execution; single signature is insufficient.
Measurement
Counter `rew_p3_single_signer_attempt_total` — must be 0.
Modules
REW
Priority
MUST
Owner
CFO
NFR-REW-008100% of payslips use the correct VN tax tables; non-VN residents flagged as out-of-scopeP1Verify: T
REW locale handling — payslip currency + tax tables MUST match member residency
The REW compute path MUST apply VN PIT + SI tables only to members with `residency = VN`; non-VN residents are flagged out-of-scope and excluded from the standard compute.
Measurement
Counter `rew_locale_mismatch_total{member_residency, expected}` — must be 0.
Modules
REW
Priority
MUST
Owner
CFO
NFR-SKILL-004100% of skill invocations produce a Layer-1 row within 1s; reconciliation drift < 0.001%P0Verify: T
SKILL audit-chain coverage — every skill invocation MUST emit ≥ 1 memory row
Every skill invocation (success, denial, error) MUST result in at least one Layer-1 memory row carrying `{tenant_id, actor_id, skill_name, skill_version, capability_used, started_at, ended_at, outcome, output_digest?}`.
Measurement
Counter `skill_audit_emit_attempt_total{outcome}` and `skill_audit_emit_success_total`.
Modules
SKILL
Priority
MUST
Owner
CTO
NFR-SKILL-005100% pass rate against GDT MST + NAPAS VietQR + GDT hoadondientu sandboxes weeklyP0Verify: T
SKILL VN-bundle compliance — MST/VietQR/HoaDon skills MUST pass external validator
The three Vietnamese-locale skills (`vn-mst-validate`, `vn-bank-transfer`, `vn-vat-invoice`) MUST pass a weekly end-to-end validation run against their respective external authorities: GDT MST lookup endpoint, NAPAS VietQR specification validator, and GDT hoadondientu sandbox.
Measurement
CI metric per skill: `skill_vn_validator_pass_count` and `skill_vn_validator_fail_count` per weekly run.
Modules
SKILL
Priority
MUST
Owner
CFO
NFR-TEN-002100% of tenant writes land in pinned region; cross-region writes audited + blockedP0Verify: T
TEN four-residency pinning — tenant data MUST stay in pinned region; 0 cross-region writes
Each tenant MUST be pinned to exactly one of the four declared residencies (VN, SG, EU, US) at provision time; the pin is immutable post-provision.
Measurement
Counter `ten_cross_region_write_total{tenant, source_region, target_region}` — must be 0.
Modules
TEN
Priority
MUST
Owner
CTO
NFR-TEN-003100% of plan-quota violations either blocked OR queued with operator-visible stateP0Verify: T
TEN plan-tier enforcement — over-quota operations MUST be blocked or queued
Plan tiers (Free, Pro, Business, Enterprise) declare numeric quotas (users, projects, storage GB, API calls/month).
Every active CUO persona MUST carry a versioned eval set (≥ 50 representative prompts per persona) committed under `modules/cuo/personas/<role>/evals/v<N>.jsonl`.
Measurement
LangSmith dataset `cyberos-persona-drift-<role>` updated continuously from the 1% sample.
Modules
AI
Priority
SHOULD
Owner
CTO
NFR-OBS-001100% of services emit RED metrics; CI fails if a service lacks the cyberos-obs-sdk middlewareP0Verify: I
RED metric coverage — every service emits rate/error/duration via cyberos-obs-sdk
Every CyberOS backend service MUST emit the three RED metric families on every public route: `request_rate_total{route, method, status}`, `request_errors_total{route, method, error_class}`, `request_duration_seconds{route, method, status}` (histogram).
Measurement
Prometheus query `count by (service) (request_rate_total)` lists services emitting RED. Expected: equal to count of deployed services from the manifest.
Modules
OBS
Priority
MUST
Owner
CTO
NFR-OBS-002100% of cross-service requests carry an unbroken traceparent chain ≥ 2 hopsP0Verify: T
Trace continuity — W3C traceparent propagates across ≥ 2 service hops; CI test enforces
Every CyberOS backend service MUST propagate the W3C `traceparent` and `tracestate` HTTP headers on outbound calls (server → service → service) and on NATS subjects (via the `traceparent` message header).
Measurement
Counter `obs_trace_propagation_gap_total{from_service, to_service}` emitted when an inbound request lacks `traceparent` but came from a known-internal source.
Modules
OBS
Priority
MUST
Owner
CTO
NFR-OBS-005AI traces queryable for 90 days; filter by persona_version returns results in < 5sP1Verify: I
LangSmith AI-trace retention — 90-day window, queryable by persona_version
Every AI Gateway call (1% sample per NFR-AI-010 + 100% of error/slow calls per NFR-OBS-003) MUST be exported to LangSmith with tags `{tenant_id, persona_version, route, model_alias, status}`.
Measurement
LangSmith project-config audit (`docs/compliance/langsmith-config.md`) lists current retention; reviewed quarterly.
Modules
OBS
Priority
SHOULD
Owner
CTO
NFR-PROJ-005Calibration freshness ≤ 7 days; 100% of teams refreshed within their cadenceP1Verify: T
PROJ estimate-calibration freshness — calibration data MUST refresh weekly
Per-team estimate calibration (`TASK-PROJ-013`) MUST refresh weekly using closed issues from the prior cycle window.
Measurement
Gauge `proj_team_calibration_age_days{team}` — must be ≤ 7.
Modules
PROJ
Priority
SHOULD
Owner
CTO
NFR-PROJ-010p95 < 4h from blocker condition to dashboard surfacingP1Verify: T
PROJ blocker detector latency — blocker MUST surface within 4h of cause
The blocker detector (`TASK-PROJ-011`) MUST surface blockers (issues stalled > 3d, missing assignee, missing estimate, etc.) within 4h of the triggering condition becoming true.
NFR-RES-001p95 < 1h from allocation change to over/under flag visibilityP1Verify: T
RES matrix-trigger latency — over/under flags MUST surface within 1h of capacity change
The capacity-demand matrix (`TASK-RES-001`) MUST refresh on allocation, hiring, or scope mutations within 1h.
Measurement
Histogram `res_matrix_refresh_latency_seconds`.
Modules
RES
Priority
SHOULD
Owner
COO
NFR-RES-005100% of Monday digests include data current through prior Sunday 23:59 local tenant timeP1Verify: T
RES weekly digest freshness — Monday digest MUST include data through Sunday EOD
The Monday capacity digest MUST include allocation data current through the prior Sunday 23:59 (tenant local time).
Measurement
Counter `res_digest_send_total{tenant, on_time}`.
Modules
RES
Priority
SHOULD
Owner
COO
PRIV
Privacy
PII handling, data residency, GDPR · 6 NFRsNFR-AI-004Recall ≥ 99% on the VN-PII test corpus; refreshed quarterlyP0Verify: T
VN-PII detector recall floor — recall ≥ 99% on quarterly refresh corpus
The Vietnamese PII detector plugin MUST achieve recall ≥ 99% on the curated VN-PII test corpus (`services/ai-gateway/tests/fixtures/vn_pii_corpus_v*.jsonl`) covering: CMND/CCCD national IDs, MST tax IDs, Vietnamese bank account numbers, Vietnamese phone numbers (mobile + landline), full names with diacritics, and Hanoi/HCMC street addresses.
Measurement
Test harness `services/ai-gateway/tests/vn_pii_recall_test.rs` loads the JSONL corpus, runs each example through the detector, and computes recall per category and overall.
Modules
AI
Priority
MUST
Owner
CSO
NFR-AI-005ZDR attestation last-verified-at age ≤ 7 days per active providerP0Verify: I
ZDR attestation freshness — re-verified weekly per provider
For every upstream AI provider used by the gateway, an active Zero Data Retention (ZDR) attestation MUST be on file under `docs/compliance/zdr-attestations/<provider>/YYYY-MM-DD.{pdf,sha256}`.
Measurement
Cron job `deploy/compliance/zdr-attestation-check.sh` runs nightly; for each provider it fetches the current ZDR URL, computes SHA-256, compares to the on-file attestation hash, and updates `zdr_attestation_last_verified_at` if the hash matches.
Modules
AI
Priority
MUST
Owner
CSO
NFR-EMAIL-007100% of DSAR exports include all related messages; reconciliation = 0 missing rowsP0Verify: T
EMAIL DSAR export completeness — export MUST contain all subject's messages + metadata
A DSAR export for a data subject MUST include all email messages where the subject appears in `From`, `To`, `Cc`, `Bcc`, or as referenced in body text via PII matching.
Every row entering `l2_memory` MUST first pass through the PII detection pipeline: Presidio (English) followed by the VN-PII plugin (Vietnamese, NFR-AI-004 recall floor).
Measurement
Counter `memory_pii_pre_ingest_total{pii_class, redacted}` per detection.
Modules
memory
Priority
MUST
Owner
CSO
NFR-REW-0050 memory rows referencing REW comp tables; CI gate enforces per DEC-036P0Verify: T
REW memory exclusion — comp data MUST NOT land in memory Layer-1 or Layer-2
Per DEC-036, comp/payroll data (salary, bonus, 3P income, distributions) MUST NOT be written to memory Layer-1 or Layer-2 — REW maintains its own segregated audit log.
Measurement
CI metric `rew_memory_exclusion_gate_violations` — must be 0.
Modules
REW
Priority
MUST
Owner
CFO
SCAL
Scalability
Growth ceilings, shard strategy · 1 NFRsNFR-CUO-203compute_workflow_metrics + evaluate_workflow_signals: O(N) in row count; p95 < 2s wall-clock at N=10⁶ rows × W=50 workflowsP0Verify: T
workflow signal eval MUST be O(N) — p95 < 2s at 10⁶ audit rows
`cuo.core.workflow_evolution.compute_workflow_metrics(rows)` MUST be O(N) in the total audit-row count — single pass, dict insertion, no nested re-iteration of `rows`.
Measurement
Linearity: NEW benchmark `modules/cuo/tests/bench_workflow_evolution.py` runs `compute_workflow_metrics` against synthetic chains of N ∈ {10³, 10⁴, 10⁵, 10⁶} rows.
Modules
cuo
Priority
MUST
Owner
CTO
No NFRs match the current filters. to see the full catalog.
Generated by tools/docs-site/render-nfr-catalog.mjs from tools/docs-site/data/nfrs.json.
Build is deterministic — same input → byte-identical output.