🎯

OKR

P3 · Strategy / OKR Planned · P3 design phase Owner: CEO + CSO seat

The quarterly strategy loop — Company → Team → Member cascade, 3–5 Key Results per Objective, confidence-band weekly check-ins, and auto-pulled progress from PROJ, TIME, INV, HR, and LEARN. Retrospectives are framed in face-saving Vietnamese language; nothing is "missed", only "learned".

OKR encodes the canonical Doerr / Grove model with two CyberOS-specific bindings: auto-progress and face-saving retros. The cascade is the standard Company → Team → Individual; the cycle is quarterly (configurable for shorter pilot cycles); each Objective carries 3 to 5 Key Results that are one of three types — hit-target (achieve X by date), baseline+improvement (move from X to Y), or milestone (deliver Z). What is unconventional is that every KR can declare a progress source — a query that reads from another module and writes the current value on a schedule. A "ship feature X" KR auto-progresses from PROJ issue completion; a "land $400k Q3 revenue" KR auto-progresses from INV invoice.paid; a "hire 2 senior engineers" KR auto-progresses from HR new-hire events; a "everyone reaches Rust mastery level 3" KR auto-progresses from LEARN. Weekly confidence check-ins are 1–10 scores per KR with a one-paragraph rationale. The CUO digests these into a Founder-readable summary every Monday morning. Retrospectives at quarter close use face-saving Vietnamese framing: failed KRs become "what did we learn?" rather than "what did you miss?" — a deliberate cultural adaptation documented in PRD §3 (Vietnamese-cultural fit). The module is EU AI Act Annex III §4 high-risk-adjacent because OKR-driven employment decisions (promotion, performance review) require human-in-the-loop (Art. 14). PRD §9.19 locks the FRs; this page documents the planned implementation at cyberos/services/okr/.

OKR is the quarterly strategy operating loop. Cycles, Objectives, Key Results, and Confidence Check-ins are first-class data primitives; alignments tie Member OKRs up through Team OKRs to a Company OKR; progress sources are queries that auto-update KRs from elsewhere in CyberOS, so the dashboard is read-canonical rather than self-reported. The CUO digest on Monday morning summarises confidence drops and surfaces blockers in CHAT. End-of-quarter retros are framed as "what would change our minds next quarter?" prompts; every retro entry is itself a BRAIN memory under module/okr/ for future cycle reference. Vietnamese cultural adaptation: failed KRs are described as "learning achieved" / "đã học được"; the term "miss" does not appear in any UI string. EU AI Act Art. 14 — OKR-driven employment decisions (promotion, performance review) always have an explicit human approval gate.

Status
Planned
P3 · design phase
Cycle length
Quarterly
configurable (4-12 weeks)
KRs / Objective
3–5
Doerr canonical band
KR types
3
hit-target · improvement · milestone
Confidence scale
1–10
weekly check-in
Progress sources
5 modules
PROJ · TIME · INV · HR · LEARN
i18n
vi + en
face-saving language
Depends on
AUTH · BRAIN · 5 sources
+ CUO · AI · OBS
1

Why OKR exists

Strategy operating-systems fail at three points: (1) the cascade is built once and goes stale; (2) progress is self-reported and therefore self-inflated; (3) the retrospective is performative because the team is graded on whether they hit, not on what they learned. OKR addresses all three. The cascade is a graph stored in the database; it is read every check-in and rebuilt every cycle. Progress is computed, not typed — every KR declares a progress source (a query against another module) and the value moves on its own. Retrospectives are framed in face-saving Vietnamese language and stored as BRAIN memories, so the lesson outlives the quarter that produced it. The Founder gets a Monday-morning CUO digest of confidence-band drops; if four KRs in a row drop two points this week, that is a signal that surfaces automatically.

🔗
Cascade is a graph

Company → Team → Member alignments are first-class edges. A Member OKR with no upward alignment is flagged in the dashboard — orphan OKRs are tracked, not hidden.

📥
Progress is computed

Auto-pull from PROJ (issue completion), TIME (hours), INV (revenue), HR (hires), LEARN (mastery). The dashboard reflects reality, not self-report.

📚
Retros are memories

Every retro entry lands in BRAIN under module/okr/retros/. Next quarter's planning prompts read these aloud. The lesson persists.

The bet is that an OKR system that cannot be gamed (because progress is computed) and that actively learns from each quarter (because retros are persisted, citable memories) compounds over years. A 12-quarter-old company has 12 BRAIN-archived retros; planning quarter 13 starts by reading them. That is a fundamentally different artefact than 12 forgotten Notion pages.

2

What it does — 5W1H2C5M

Structured decomposition of OKR's scope. Cells trace to PRD §9.19 + SRS §7.15.

AxisQuestionAnswer
5W · WhatWhat is OKR?A strategy operating-loop service. Primitives: Cycle, Objective, KeyResult, CheckIn, Alignment, ProgressSource, Retrospective. Rust service with TS SPA dashboard. PostgreSQL store + materialised rollups.
5W · WhoWho uses it?Founder / CEO: owns Company-level Objectives; reads Monday-morning CUO digest. Team leads: author Team OKRs aligning up. Members: author their own OKRs aligned to a Team. Agents: CUO digest; CSO-skill for retro drafting; CEO-skill for cascade-coherence checks.
5W · WhenWhen does it run?Quarterly cycle (default Q1 / Q2 / Q3 / Q4 anchored to Jan-1). Weekly confidence-band check-ins (every Friday 17:00 ICT). Mid-quarter pulse (week 6). Quarter-close retrospective. Continuous auto-progress refresh (hourly per progress source).
5W · WhereWhere does it run?P3: SG-1 region with VN-residency partition. Read-heavy workload behind PgBouncer; OKR graph queried via federated GraphQL into PROJ/HR/INV.
5W · WhyWhy a separate module?Because the cascade graph is referenced by REW (P3 performance pool depends on team-objective achievement), by HR (promotion review reads Member-OKR history), by CRM (revenue KRs feed pipeline forecast), and by the Founder daily flow. Owning it once means every consumer reads the same source-of-truth.
1H · HowHow does it work?OKR primitives stored in okr.* tables. Alignments are FK edges in okr.alignment with type ∈ {contributes_to, supports, depends_on}. Confidence check-ins append to okr.check_in. Auto-progress: each KR declares progress_source (a small DSL) and a refresh job materialises the current value. Retros land in BRAIN under module/okr/cycle-YYYY-Qn/.
2C · CostCost budget?P3: ~$25 / month (PG read replica + small Fargate + nightly refresh job). Low data volume — Cycle × Objective × KR cardinality is bounded.
2C · ConstraintsConstraints?(a) EU AI Act Art. 14 — OKR-driven employment decisions require human approval. (b) GDPR Art. 22 — same. (c) Vietnamese cultural fit: face-saving language; no "missed" / "failed" without "learned". (d) Append-only history — modifications post-cycle-end create supersession entries, never overwrites ((FR pending)).
5M · MaterialsStack?Rust 1.81 · axum · sqlx · PostgreSQL 16 · React + visx for cascade tree · DSL parser (nom) for progress-source expressions · OpenTelemetry.
5M · MethodsMethod choices?Cycle is a calendar with explicit phases (planning · execution · check-ins · retro · close). KR is typed (hit-target / improvement / milestone) with type-specific computation. Confidence band is a 1-10 scalar plus rationale text; trend is computed over 4 weeks. Retros are CSV-prompt-driven (5 questions) and CUO-summarised.
5M · MachinesDeployment?Fargate task in SG-1 (P3). Standard PG read replica. Scheduled jobs for weekly check-in reminders and nightly auto-progress refresh.
5M · ManpowerWho maintains?0.2 FTE at P3; CSO seat owns product direction; CEO-skill drives Founder digests.
5M · MeasurementHow measured?N(FR pending) (drag-drop cascade p95 ≤ 200 ms), N(FR pending) (auto-progress refresh success ≥ 99.5%). KPIs: cascade-coverage %, weekly check-in participation %, end-of-quarter retro completion %, average final score.
3

Architecture

OKR is a Rust service with a TS cascade-tree SPA. It owns the OKR graph + check-in history; reads auto-progress from five upstream modules through GraphQL federation; writes summaries to BRAIN; emits Notify cards to CUO. The progress-source DSL is parsed at KR creation time and stored as an AST; refresh is a scheduled job that walks each KR's AST and executes the query against the appropriate module's federated subgraph.

graph TB subgraph UI ["UI surfaces"] SPA["Cascade SPA
(React + visx tree)"] CHECKIN["Weekly check-in modal"] RETRO["Retro composer"] end subgraph OKR ["OKR service (Rust · axum)"] AUTHOR["author.rs
Objective + KR CRUD"] CASCADE["cascade.rs
Alignment graph"] PROGRESS["progress.rs
auto-pull engine"] DSL["dsl.rs
progress-source parser (nom)"] CHECKIN_S["checkin.rs
confidence rollup"] RETRO_S["retro.rs
retrospective composer"] DIGEST["digest.rs
Monday CUO digest"] GQL["gql_subgraph.rs
federated read API"] end subgraph SOURCES ["Auto-progress sources"] PROJ["📋 PROJ
issue.completed"] TIME["⏱ TIME
hours.logged"] INV["💰 INV
invoice.paid"] HR["👥 HR
hire.created"] LEARN["📚 LEARN
mastery.attained"] end subgraph STORES ["Stores"] PG[("PostgreSQL 16
okr.cycle · objective
key_result · check_in
alignment · progress_source")] end subgraph SINKS ["Audit + AI"] BRAIN["🧠 BRAIN
okr.* rows
retros under module/okr/"] CUO["🧠 CUO
Monday digest"] OBS["👁 OBS
traces + metrics"] end SPA --> AUTHOR CHECKIN --> CHECKIN_S RETRO --> RETRO_S AUTHOR --> CASCADE AUTHOR --> PG CASCADE --> PG AUTHOR --> DSL DSL --> PG PROGRESS --> PG PROGRESS --> PROJ PROGRESS --> TIME PROGRESS --> INV PROGRESS --> HR PROGRESS --> LEARN CHECKIN_S --> PG CHECKIN_S --> BRAIN RETRO_S --> BRAIN DIGEST --> CHECKIN_S DIGEST --> CUO GQL --> PG AUTHOR --> BRAIN CASCADE --> BRAIN OKR --> OBS classDef planned fill:#cba88a,stroke:#4338ca classDef store fill:#f5f3ff,stroke:#7c3aed classDef sink fill:#f5ede6,stroke:#45210e class SPA,CHECKIN,RETRO,AUTHOR,CASCADE,PROGRESS,DSL,CHECKIN_S,RETRO_S,DIGEST,GQL,PROJ,TIME,INV,HR,LEARN planned class PG store class BRAIN,CUO,OBS sink

Internal components

ComponentPath (planned)Responsibility
author.rsservices/okr/src/author.rsCreate / update Objective and KeyResult. KR-phrasing assistant via AI gateway (suggests measurable phrasing).
cascade.rsservices/okr/src/cascade.rsManage Alignment edges: contributes_to · supports · depends_on. Detect orphan OKRs (no upward alignment). Cycle detection (no circular alignments).
dsl.rsservices/okr/src/dsl.rsNom-based parser for progress-source expressions. Grammar: source(query) [filter expr] [aggregate fn].
progress.rsservices/okr/src/progress.rsScheduled auto-progress refresh. Walks each KR's AST, federates to source module, updates current_value with audit trail.
checkin.rsservices/okr/src/checkin.rsWeekly check-in collector. Confidence 1-10 + rationale per KR. Computes 4-week trend; flags 2+ point drops as risk.
retro.rsservices/okr/src/retro.rsEnd-of-cycle retrospective. CSV-prompt-driven. CUO drafts summary; human edits; final lands as BRAIN memory under module/okr/cycle-YYYY-Qn/retro.md.
digest.rsservices/okr/src/digest.rsMonday-morning CUO digest. Confidence drops, KRs off-track, suggested founder questions.
blocker.rsservices/okr/src/blocker.rsBlocker detection: monitors CHAT for KR-related "blocked by" mentions and surfaces to digest.
cascade_check.rsservices/okr/src/cascade_check.rsCascade-coherence check: every Member OKR must align to a Team OKR; every Team OKR must align to a Company OKR (configurable strict / soft mode).
supersession.rsservices/okr/src/supersession.rsAppend-only history. Mid-cycle KR target changes create supersession rows; originals remain visible ((FR pending)).
i18n.rsservices/okr/src/i18n.rsVietnamese face-saving language pack. Maps internal status codes to UI strings: "miss"→"đã học được"/"learning achieved"; never "fail".
audit_bridge.rsservices/okr/src/audit_bridge.rsWrites every OKR + check-in event to BRAIN canonical writer.
migrations/services/okr/migrations/sqlx migrations. RLS by tenant_id. Indices on (cycle_id, objective_id) and (subject_id, cycle_id).
OKR-INV-001 · Post-cycle history is append-only

After a Cycle reaches execution phase, KR target modifications are supersession entries, not overwrites. The original target value remains visible in the timeline; the new target carries superseded_by linkage. Verification: SRS §4 (FR pending) — attempt to modify in-place is rejected with code: "OKR-IMMUTABLE-POST-CYCLE"; the supersession path produces a chained BRAIN audit row.

4

Data model

The OKR graph is six tables: Cycle (calendar), Objective (qualitative goal), KeyResult (quantitative outcome), Alignment (cascade edges), CheckIn (weekly confidence), ProgressSource (DSL-typed auto-pull config). Retrospective is a BRAIN memory, not a Postgres row.

erDiagram TENANT ||--o{ CYCLE : "owns" CYCLE ||--o{ OBJECTIVE : "contains" OBJECTIVE ||--o{ KEY_RESULT : "measured by" OBJECTIVE ||--o{ ALIGNMENT : "child of" OBJECTIVE ||--o{ ALIGNMENT : "parent of" KEY_RESULT ||--o| PROGRESS_SOURCE : "auto-pulled from" KEY_RESULT ||--o{ CHECK_IN : "graded by" KEY_RESULT ||--o{ KR_HISTORY : "supersession" SUBJECT ||--o{ OBJECTIVE : "owns" SUBJECT ||--o{ CHECK_IN : "submitted by" CYCLE ||--o| RETROSPECTIVE : "closed by" TENANT { uuid id PK string slug } CYCLE { uuid id PK uuid tenant_id FK string code "2026-Q2" date starts_on date ends_on string phase "planning | execution | check_ins | retro | closed" string scope "company | team | member" } OBJECTIVE { uuid id PK uuid tenant_id FK uuid cycle_id FK uuid owner_subject_id FK string scope_level "company | team | member" string title_en string title_vi string narrative int display_order timestamp created_at } KEY_RESULT { uuid id PK uuid objective_id FK string title_en string title_vi string kr_type "hit_target | improvement | milestone" decimal baseline_value decimal target_value decimal current_value string unit "USD | %% | issues | hires | level" date due_date string state "active | superseded | achieved | learning" timestamp created_at } PROGRESS_SOURCE { uuid id PK uuid key_result_id FK string source_module "PROJ | TIME | INV | HR | LEARN" string dsl_expr "source(...).filter(...).aggregate(...)" bytea ast_blob "parsed AST" string refresh_cadence "hourly | daily | manual" timestamp last_refreshed_at } ALIGNMENT { uuid id PK uuid parent_objective_id FK uuid child_objective_id FK string kind "contributes_to | supports | depends_on" timestamp created_at } CHECK_IN { uuid id PK uuid key_result_id FK uuid subject_id FK date iso_week int confidence "1..10" string rationale decimal value_at_checkin timestamp ts string brain_chain } KR_HISTORY { uuid id PK uuid key_result_id FK string field "target_value | baseline_value | due_date | title" string old_value string new_value uuid changed_by FK timestamp ts string brain_chain } RETROSPECTIVE { uuid id PK uuid cycle_id FK string brain_path "memories/module/okr/cycle-2026-Q2/retro.md" string brain_chain timestamp completed_at }

Progress-source DSL grammar (planned)

progress_expr  = source_call , { '.' , method_call } ;
source_call    = source_name , '(' , [ args ] , ')' ;
source_name    = 'proj' | 'time' | 'inv' | 'hr' | 'learn' ;
method_call    = method_name , '(' , [ args ] , ')' ;
method_name    = 'filter' | 'group_by' | 'count' | 'sum' | 'avg' | 'max' | 'min' ;
args           = arg , { ',' , arg } ;
arg            = literal | identifier | range ;

// Examples:
//   inv.invoices.filter(state="paid", paid_at >= cycle_start).sum(amount_usd)
//   proj.issues.filter(project_id="proj-atlas", state="done").count()
//   hr.members.filter(hired_at >= cycle_start, role_tier="T3").count()
//   learn.mastery.filter(skill="rust", level >= 3).count_distinct(member_id)
//   time.entries.filter(billable=true, period=cycle).sum(hours)
5

API surface

Federated GraphQL subgraph for cascade reads and check-in writes, plus an MCP tool catalogue for natural-language OKR authorship through Genie.

GraphQL subgraph (federated)

extend schema
  @link(url: "https://specs.apollo.dev/federation/v2.5", import: ["@key", "@external", "@shareable", "@requiresScopes"])

type Cycle @key(fields: "id") {
  id: ID!
  code: String!
  startsOn: Date!
  endsOn: Date!
  phase: CyclePhase!
  scope: ScopeLevel!
  objectives: [Objective!]!
}

type Objective @key(fields: "id") {
  id: ID!
  cycle: Cycle!
  owner: Subject!
  scopeLevel: ScopeLevel!
  titleEn: String!
  titleVi: String!
  narrative: String
  keyResults: [KeyResult!]!
  alignmentsUp: [Alignment!]!
  alignmentsDown: [Alignment!]!
}

type KeyResult @key(fields: "id") {
  id: ID!
  objective: Objective!
  titleEn: String!
  titleVi: String!
  krType: KrType!
  baselineValue: Float!
  targetValue: Float!
  currentValue: Float!
  unit: String!
  dueDate: Date!
  state: KrState!
  progressSource: ProgressSource
  checkIns(last: Int): [CheckIn!]!
  confidenceTrend: [ConfidencePoint!]!
}

type ProgressSource {
  sourceModule: String!
  dslExpr: String!
  refreshCadence: RefreshCadence!
  lastRefreshedAt: DateTime
}

type Alignment @key(fields: "id") {
  id: ID!
  parent: Objective!
  child: Objective!
  kind: AlignmentKind!
}

type CheckIn @key(fields: "id") {
  id: ID!
  keyResult: KeyResult!
  subject: Subject!
  isoWeek: Date!
  confidence: Int!
  rationale: String!
  valueAtCheckin: Float!
  ts: DateTime!
}

type ConfidencePoint {
  isoWeek: Date!
  confidence: Int!
}

enum CyclePhase { PLANNING EXECUTION CHECK_INS RETRO CLOSED }
enum ScopeLevel { COMPANY TEAM MEMBER }
enum KrType { HIT_TARGET IMPROVEMENT MILESTONE }
enum KrState { ACTIVE SUPERSEDED ACHIEVED LEARNING }
enum AlignmentKind { CONTRIBUTES_TO SUPPORTS DEPENDS_ON }
enum RefreshCadence { HOURLY DAILY MANUAL }

type Query {
  cycle(code: String!): Cycle
  myObjectives(cycleCode: String!): [Objective!]!
    @requiresScopes(scopes: [["okr.read"]])
  cascade(cycleCode: String!, rootObjectiveId: ID): [Objective!]!
    @requiresScopes(scopes: [["okr.read"]])
  orphans(cycleCode: String!): [Objective!]!
    @requiresScopes(scopes: [["okr.read"]])
}

type Mutation {
  createObjective(input: ObjectiveInput!): Objective!
    @requiresScopes(scopes: [["okr.write"]])
  upsertKeyResult(input: KeyResultInput!): KeyResult!
    @requiresScopes(scopes: [["okr.write"]])
  alignObjectives(parentId: ID!, childId: ID!, kind: AlignmentKind!): Alignment!
    @requiresScopes(scopes: [["okr.write"]])
  submitCheckIn(input: CheckInInput!): CheckIn!
    @requiresScopes(scopes: [["okr.checkin"]])
  closeRetrospective(cycleCode: String!, brainPath: String!): Cycle!
    @requiresScopes(scopes: [["okr.close_cycle"]])
}

REST + scheduled endpoints

MethodPathPurpose
GET/okr/cascade.svg?cycle=2026-Q2SVG export of cascade tree for board pack.
POST/okr/refresh-progress?kr_id=…Force auto-progress refresh for a specific KR.
POST/okr/cycles/{code}/advanceAdvance cycle phase. Admin scope.
GET/okr/digest/weekly.mdMonday digest in markdown.
GET/okr/orphans?cycle=2026-Q2List orphan Member OKRs (no upward alignment).
GET/okr/check-in-status?cycle=2026-Q2&iso_week=2026-W19Who has and has not submitted this week's check-in.
POST/okr/retros/{cycle_code}/draftCUO drafts a retrospective summary from the cycle's data.

MCP tool catalogue

Tool nameInputsOutputsAnnotations
cyberos.okr.list_cyclecycle_codeCycle + Objectives + KRsreadonly · scope=okr.read
cyberos.okr.create_objectivetitle, narrative, scopeObjectivescope=okr.write
cyberos.okr.suggest_kr_phrasingobjective_text, candidate_kr3 suggestions + measurability scorereadonly · AI-call
cyberos.okr.submit_check_inkr_id, confidence, rationaleCheckInscope=okr.checkin
cyberos.okr.cascade_viewcycle_code, root_id?treereadonly
cyberos.okr.find_orphanscycle_codeObjective[]readonly
cyberos.okr.weekly_digestcycle_codeMarkdown digestreadonly
cyberos.okr.draft_retrocycle_codeRetro draftreadonly · CSO-confirm before persist
cyberos.okr.close_cyclecycle_code, retro_brain_path{cycle}destructive · scope=okr.close_cycle · founder-confirm
6

Key flows

Flow 1 — Quarterly cycle (define → execute → review)

sequenceDiagram autonumber participant CEO as CEO participant TL as Team Leads participant M as Members participant O as OKR service participant AI as 🧠 AI gateway participant B as 🧠 BRAIN participant CUO as 🧠 CUO Note over CEO: Phase 1 · Planning (week -2 to 0) CEO->>O: createObjective(scope=COMPANY, "Land $1.2M ARR Q3") O->>AI: suggest_kr_phrasing("Land $1.2M ARR") AI-->>O: 3 candidates with measurability scores CEO->>O: upsertKeyResult(target=1_200_000, unit=USD, source=inv.invoice.paid) O->>B: append okr.objective.created + key_result.created Note over TL: TL author Team OKRs aligning up TL->>O: createObjective(scope=TEAM) + align(parent=company-obj) Note over M: Members author Member OKRs aligning up M->>O: createObjective(scope=MEMBER) + align(parent=team-obj) O->>O: cascade_check — every member-obj has team alignment O->>B: append cascade.coherent row Note over O: Phase 2 · Execution (weeks 1-12) loop weekly O->>M: ping check-in modal Friday 17:00 ICT M->>O: submitCheckIn(confidence=7, rationale="...") O->>B: append check_in.submitted row end Note over O: Phase 3 · Retrospective (week 13) O->>CUO: draft_retro(cycle_code) CUO->>AI: summarise cycle data + face-saving framing AI-->>CUO: draft CUO->>CEO: present draft for review CEO->>O: closeRetrospective with edited content O->>B: write retro to memories/module/okr/cycle-2026-Q2/retro.md O->>B: append cycle.closed row

Flow 2 — Weekly confidence check-in

sequenceDiagram autonumber participant CR as cron (Fri 17:00 ICT) participant O as OKR digest participant M as Member participant SPA as Check-in modal participant C as checkin.rs participant PG as PostgreSQL participant B as 🧠 BRAIN participant CUO as 🧠 CUO CR->>O: notify all Members with active KRs O->>M: push notification (CHAT + email) M->>SPA: open modal SPA-->>M: render KR cards with last 4-week confidence trend loop per KR M->>SPA: confidence 1-10 + rationale end SPA->>C: submit batch C->>PG: INSERT check_in rows C->>C: compute 4-week trend per KR alt 2+ point drop C->>CUO: flag risk(kr_id) CUO->>CUO: queue for Monday digest end C->>B: append check_in.submitted (per KR)

Flow 3 — Cascade alignment (Company → Team → Member)

sequenceDiagram autonumber participant TL as Team Lead participant SPA as Cascade SPA (tree) participant AR as Apollo Router participant C as cascade.rs participant CK as cascade_check.rs participant PG as PostgreSQL participant B as 🧠 BRAIN TL->>SPA: drag Team OKR onto Company OKR SPA->>AR: mutation alignObjectives(parent=co-obj, child=team-obj, kind=CONTRIBUTES_TO) AR->>C: forward with JWT C->>PG: INSERT alignment row C->>CK: validate (no cycles, scope-level rule honoured) alt valid alignment CK-->>C: ok C->>B: append alignment.created row C-->>SPA: success; tree re-render else cycle detected CK-->>C: deny ALIGNMENT-CYCLE C->>PG: ROLLBACK C-->>SPA: 422 error end

Cascade rules: COMPANY can only be parent of TEAM; TEAM can only be parent of MEMBER. Cross-scope-level alignments (e.g., Member→Company directly) are rejected with code: "OKR-SCOPE-MISMATCH".

Flow 4 — Auto-progress sync (PROJ / TIME / INV / HR / LEARN)

sequenceDiagram autonumber participant CR as cron (hourly) participant P as progress.rs participant D as dsl.rs (parsed AST) participant INV as 💰 INV federated subgraph participant PROJ as 📋 PROJ federated subgraph participant LRN as 📚 LEARN federated subgraph participant PG as PostgreSQL participant B as 🧠 BRAIN CR->>P: enumerate KRs with refresh_cadence in (hourly, daily-due) loop per KR P->>D: load AST from progress_source alt source = inv P->>INV: federated query (e.g., paid invoices Σ amount) INV-->>P: scalar value else source = proj P->>PROJ: federated query (e.g., done-issues count) PROJ-->>P: scalar value else source = learn P->>LRN: federated query (e.g., mastery_level>=3 count) LRN-->>P: scalar value end P->>PG: UPDATE key_result SET current_value=…, last_refreshed_at=now() alt value changed P->>B: append progress.refreshed row {kr_id, from, to} end end

Flow 5 — Monday CUO digest to Founder

sequenceDiagram autonumber participant CR as cron (Mon 07:00 ICT) participant D as digest.rs participant CH as checkin.rs (trend reader) participant BL as blocker.rs participant AI as 🧠 AI gateway participant CUO as 🧠 CUO participant CEO as CEO (CHAT) participant B as 🧠 BRAIN CR->>D: assemble weekly digest D->>CH: pull confidence drops (≥ 2 pts over 2 wks) D->>BL: pull "blocked by" mentions in CHAT D->>D: rank by impact × risk D->>AI: summarise to ~250 words; face-saving framing AI-->>D: draft D->>CUO: route to founder CUO->>CEO: post in Founder DM with citations CEO-->>CUO: optional reply ("dig into KR-042") CUO->>B: append digest.delivered + digest.engaged rows

The digest never says "X failed"; it says "X is below confidence band — what would help?" The Vietnamese version uses "đang gặp khó khăn" (encountering difficulty) rather than "hỏng" (broken).

7

Cycle lifecycle

A Cycle traverses five phases. Each transition is gated; modifying KRs in execution phase requires supersession.

stateDiagram-v2 [*] --> Planning: cycle opened (week -2) Planning --> Execution: phase advance @ start_date Execution --> CheckIns: ongoing — every Friday CheckIns --> Execution: weekly loop Execution --> MidQuarter: week 6 pulse review MidQuarter --> Execution: continue Execution --> Retro: end_date - 1 week Retro --> Closed: founder approves retro Closed --> [*] Execution --> Cancelled: rare — Founder decision (Annual reset) Cancelled --> [*]

Per-phase rules

PhaseDurationRules
Planning2 weeksObjectives + KRs editable freely. Alignments built. Cascade coherence must pass before transition.
Execution10 weeks (quarter)KR target modifications require supersession ((FR pending)). Auto-progress refresh hourly. Weekly check-ins enforced.
CheckIns (sub-state)weekly Fri 17:00All Members with active KRs receive prompts; missing check-ins flagged in next-week digest.
MidQuarter (sub-state)week 6Mandatory CEO + Team Lead review. Confidence-band review; off-track KRs get rationale entry.
Retro1 weekCUO drafts retro summary; team reviews; final lands in BRAIN under module/okr/cycle-YYYY-Qn/retro.md.
ClosedterminalAll KRs reach final state (achieved | learning). Read-only. Audit chain preserved.
CancelledterminalCycle invalidated. Audit chain preserved with reason.
8

Functional Requirements

The CyberOS FR catalogue is being rebuilt one feature at a time via the open fr-author Agent Skill.

Previous FR enumerations were archived 2026-05-14 and are no longer reflected on this page. PRD/SRS narrative remains authoritative for the spec; specific FRs land here as they are re-authored.

9

Non-Functional Requirements

OKR NFRs cover cascade-tree UX latency, auto-progress reliability, and append-only data-integrity.

NFR IDConcernTargetMeasurement
N(FR pending)Cascade-tree drag-drop p95≤ 200 msRUM + Lighthouse
N(FR pending)Check-in modal open-to-submit p95≤ 60 s end-to-endRUM
N(FR pending)cascade(cycleCode) query p95≤ 350 ms (100-objective cascade)k6
N(FR pending)submitCheckIn server-canonical p95≤ 250 msk6 + Apollo Router metrics
N(FR pending)Auto-progress refresh success rate≥ 99.5% / dayOBS daily report
N(FR pending)Federated query timeout fallback≤ 2 s; on timeout, retain last value + flagchaos test
N(FR pending)Append-only history under modification attempt= 0 in-place updates after Execution phaseproperty test + DB audit
N(FR pending)Cascade cycle-detection accuracy= 100% (zero false negatives)property-based test
N(FR pending)OKR availability (28-day)≥ 99.9%SLO monitor
N(FR pending)Cross-tenant cascade leak= 0RLS verification harness
N(FR pending)Cascade tree keyboard-navigable (WCAG 2.1 AA)full coverageaxe-core audit
10

Dependencies

OKR depends on AUTH for RBAC, BRAIN for retros + audit, AI for phrasing + summarisation, and federated subgraphs from five progress-source modules. It is consumed by REW (performance pool reads team-objective achievement), HR (promotion review reads Member OKR history), and the CUO daily flow.

graph LR subgraph upstream ["OKR depends on"] AUTH["🔐 AUTH
RBAC + scope"] BRAIN["🧠 BRAIN
audit + retros"] AI["🧠 AI Gateway
phrasing + summarisation"] OBS["👁 OBS"] PROJ["📋 PROJ
auto-progress"] TIME["⏱ TIME
auto-progress"] INV["💰 INV
auto-progress"] HR["👥 HR
auto-progress"] LEARN["📚 LEARN
auto-progress"] CRM["🏢 CRM
pipeline KRs"] end OKR["🎯 OKR"] subgraph downstream ["Used by"] REW["💎 REW
P3 perf pool"] HR_D["👥 HR
promotion review"] CUO["🧠 CUO
daily digest"] RES["📅 RES
hiring objective"] DASH["📊 OBS dashboards"] end AUTH --> OKR BRAIN --> OKR AI --> OKR OBS --> OKR PROJ --> OKR TIME --> OKR INV --> OKR HR --> OKR LEARN --> OKR CRM --> OKR OKR --> REW OKR --> HR_D OKR --> CUO OKR --> RES OKR --> DASH classDef planned fill:#cba88a,stroke:#4338ca classDef shipped fill:#f5ede6,stroke:#45210e class AUTH,BRAIN,AI,OBS,PROJ,TIME,INV,HR,LEARN,CRM,OKR,REW,HR_D,CUO,RES,DASH planned
11

Compliance scope

OKR touches employment-context data (performance, promotion inputs). EU AI Act Art. 14 and GDPR Art. 22 apply because OKRs feed REW (compensation) and HR (promotion).

Regulation / standardArticle / clauseOKR feature that satisfies it
EU AI Act (Reg. 2024/1689)Annex III §4 — EmploymentOKR outputs that feed REW or HR are gated by human approval ((FR pending)).
EU AI ActArt. 14 — Human oversightCUO digest is advisory; no automated promotion / compensation action.
GDPR (EU 2016/679)Art. 22 — Automated decision-makingSame as Art. 14; explicit human approval predicate.
GDPRArt. 15 — Right of accesscyberos-okr dsar-export returns full Objective + KR + CheckIn history for a Subject.
GDPRArt. 17 — Right to erasureTombstone supported on CheckIn; aggregate retro memory retains tenant-level summary.
Vietnam PDPL (Law 91/2025)Art. 14 — DSARSame as GDPR Art. 15 surface.
Vietnam cultural fitPRD §3 — Face-savingi18n.rs maps internal "miss" → "đã học được" UI string; retro framing is "what would change our minds?"
ISO/IEC 27001:2022A.5.34 — Privacy in developmentPer-Member OKR visible only to Member + Team Lead + CEO by default; broader visibility opt-in.
SOC 2 Type IICC7.2 — System monitoringAuto-progress refresh metrics; confidence-trend monitoring; KPI dashboard.
12

Risk entries

OKR-specific risks in the risk register.

IDRiskLikelihoodImpactOwnerMitigation
R-OKR-001Tampering — KR target lowered post-cycle to inflate achievementLowHighCSOAppend-only history ((FR pending)); supersession-only modification; CI test verifies in-place blocked.
R-OKR-002Auto-progress source returns stale value silentlyMediumMediumCTOlast_refreshed_at exposed in UI; freshness alert at > 24 h; manual force-refresh endpoint.
R-OKR-003OKR-driven employment decision automated without human gateLowHighCLO(FR pending) enforced; REW boundary requires human approval; audit alarm on any direct write.
R-OKR-004Cascade cycle causes infinite-loop in tree renderLowMediumCTOCycle-detection at alignment-write boundary; rejects with OKR-CYCLE error; integration test.
R-OKR-005Cross-tenant cascade leak via federated queryLowCatastrophicCSORLS at Postgres + @requiresScopes on every GraphQL field; cross-tenant test gate.
R-OKR-006Face-saving language pack drift (English "miss" leaks through)MediumLowCPOi18n.rs central mapping; lint rule on all UI strings; manual QA per release.
R-OKR-007Check-in burnout (Members ignore Friday prompts)HighMediumCHROFriction-minimal modal (≤ 60s typical); skip-this-week available; participation tracked as KPI.
R-OKR-008DSL injection via progress_source fieldLowHighCSODSL parser is nom-based with whitelisted source names; no eval / no SQL passthrough.
R-OKR-009Retro memory tampering post-closeLowHighCSOBRAIN canonical write; tombstone-only modification; chain integrity verified on read.
13

KPIs

OKR health rolls up into 9 KPIs covering cascade coverage, check-in participation, end-cycle scoring, and digest engagement.

KPIFormulaSourceTarget
Cascade coverage %aligned_member_okrs / total_member_okrsokr.alignment≥ 95%
Weekly check-in participationcheckins_submitted / expectedokr.check_in≥ 80%
Cycle close-ratecycles_closed_with_retro / cycles_endedokr.cycle= 100%
Average final scoreAVG(achieved + 0.5×learning) / total_krsokr.key_result0.70 (Doerr-band)
Confidence-drop alerts / cyclecountOBStracked
Auto-progress refresh success ratesuccessful / attemptedOBS≥ 99.5%
Orphan-OKR countcount(no upward alignment)okr.objective≤ 5% of total
Founder digest engagement ratedigests_with_reply / totalOBS≥ 50%
Retro-memory citation rate next cyclecitations / total_retrosBRAIN≥ 1 / retro / next-cycle planning
14

RACI matrix

OKR is owned by CEO (strategy) with CSO seat for cycle operations and CLO for AI-Act compliance.

ActivityCEOCSOCTOCHROCLOCPO
Service design + specARCICC
ImplementationICA/RIII
Company-OKR authorshipA/RCIIIC
Cycle phase advance (Planning→Execution etc.)ARIIII
Retrospective draft + closeARICIC
Face-saving language QAICIRIA
EU AI Act / GDPR Art. 22 conformityCCIIA/RI
Founder digest review (Mon)A/RCIIII

R Responsible · A Accountable · C Consulted · I Informed.

15

Planned CLI surface

Admin CLI cyberos-okr. Every destructive action writes a chained BRAIN audit row before exit.

1. Open a new quarterly cycle

$ cyberos-okr cycle open --code 2026-Q3 --starts 2026-07-01 --ends 2026-09-30

[cycle opened]
  code:    2026-Q3
  phase:   planning
  ends:    2026-09-30
  audit:   brain seq=11204 chain=…

2. Create an Objective with progress source

$ cyberos-okr objective create \
    --cycle 2026-Q3 \
    --scope company \
    --title-en "Land $1.2M ARR Q3" \
    --title-vi "Đạt 1.2M USD ARR Q3"

[objective created]   id=O-009211

$ cyberos-okr kr add \
    --objective O-009211 \
    --title-en "Closed-won invoices >= $1.2M" \
    --type hit_target \
    --target 1200000 --unit USD --due 2026-09-30 \
    --source 'inv.invoices.filter(state="paid", paid_at >= cycle_start).sum(amount_usd)'

[kr created]   id=KR-018432  baseline=0 target=$1,200,000
[progress]     auto-pull configured · cadence=hourly

3. Submit weekly check-in

$ cyberos-okr checkin submit \
    --kr KR-018432 --confidence 7 \
    --rationale "MRR run-rate $89k; need 3 deals to close in Aug"

[check-in submitted]  iso_week=2026-W30 confidence=7 (trend ↓1 from W29)
[audit]               brain seq=11283 chain=…

4. View cascade

$ cyberos-okr cascade --cycle 2026-Q3

[COMPANY]
  O-009211  Land $1.2M ARR Q3                            score 0.74
  ├─ KR-018432  Closed-won invoices >= $1.2M  cur=$890k  conf=7
  ├─ KR-018433  Logo count: 22 → 32           cur=24      conf=8
  └─ KR-018434  Pipeline >= $4.8M             cur=$5.1M   conf=9

  [TEAM · Sales]
    O-009220  Source 60 SQLs                            score 0.62
    ├─ KR-018440  SQLs: 60                  cur=37       conf=5
    └─ KR-018441  Outbound emails / wk: 600 cur=420      conf=6
      [MEMBER · Linh]
        O-009245  Convert 10 SQLs to closed-won         score —
        ├─ KR-018470  Closed-won: 10        cur=4         conf=7

[orphans]  0
[avg confidence]  7.1

5. Run Monday digest

$ cyberos-okr digest --cycle 2026-Q3

[Founder digest · 2026-W30]
  3 KRs dropped 2+ confidence points this week:
    · KR-018432 Closed-won ARR — conf 9→7 — "August deals stalled"
    · KR-018440 SQLs — conf 7→5  — "Outbound capacity short"
    · KR-018470 Linh closed-won — conf 8→7 — "lost 2 deals in proposal"

  Suggested founder questions:
    1. "What would help unblock the 3 stalled August deals?"
    2. "Should we move someone temporarily to outbound?"

  [audit]  brain seq=11401 chain=…

6. Close cycle with retrospective

$ cyberos-okr cycle close --code 2026-Q3 --retro-from retro-draft.md

[retro accepted]
  cycle:         2026-Q3
  brain path:    memories/module/okr/cycle-2026-Q3/retro.md
  final scores:  achieved=14  learning=8  superseded=2
  duration:      90d
  audit:         brain seq=11502 chain=…

7. DSAR export for a Member

$ cyberos-okr dsar-export --subject linh@cyberskill.com --output dsar.zip

[dsar] objectives:  12 rows (4 cycles)
[dsar] key_results: 38 rows
[dsar] check_ins:   148 rows
[dsar] retros:      4 brain memories
[dsar] written:     dsar.zip (88 KB)
16

Phase status & estimates

Status
Planned
P3 design phase
Est. LoC (Rust)
~4,200
services/okr + sqlx migrations
Est. LoC (TS)
~2,200
cascade SPA + check-in modal
Planned tests
75+
incl. DSL + cycle-detect + i18n
External libs
~10
nom · visx · rrule · OpenTelemetry
P3 budget
~$25/mo
PG replica + Fargate + scheduler
CapabilityStatus
Cycle / Objective / KeyResult primitivesplanned · P3
Company → Team → Member cascadeplanned · P3
Confidence-band weekly check-insplanned · P3
Auto-progress DSL + scheduled refreshplanned · P3
KR phrasing assistant (AI gateway)planned · P3
Monday CUO digestplanned · P3
Retrospective composer + BRAIN persistenceplanned · P3
Append-only supersession ((FR pending))planned · P3
Vietnamese face-saving language packplanned · P3
Cascade cycle-detectionplanned · P3
OKR-driven REW pool integrationplanned · P4
Public OKR view per workspaceplanned · P3
17

References

  • PRD §9.19 — OKR — OKR / Strategy. FRs 001..004.
  • PRD §3 — Vietnamese cultural fit (face-saving framing).
  • PRD §11.2.x — Performance / usability NFRs.
  • SRS §7.15 — OKR — Objectives and Key Results subjects + cascade.
  • SRS §4 (FR pending)..006 — Formal requirements with verification methods.
  • John Doerr, "Measure What Matters" (2018) — Canonical OKR methodology reference.
  • EU AI Act (Reg. 2024/1689) — Annex III §4 (employment), Art. 14 (human oversight).
  • GDPR (EU 2016/679) — Art. 15 (DSAR), Art. 22 (automated decision-making).
  • Vietnam PDPL (Law 91/2025) — Art. 14 (DSAR).
  • Architecture context: infrastructure.html#okr.
  • PROJ moduleproj.html · auto-progress source for milestone KRs.
  • INV moduleinv.html · auto-progress source for revenue KRs.
  • HR modulehr.html · auto-progress source for hiring KRs.
  • LEARN modulelearn.html · auto-progress source for skill-mastery KRs.
  • REW modulerew.html · downstream consumer for P3 performance pool computation.