Skip to content

Architecture diagrams

Orbit platform — architecture diagrams

Personal HQ: Hub, Blog, Portfolio, Workshop, Related articles, Studio, week log, and weekly blog-draft Slack approve.

Canonical architecture for website. Linked from the project essay; not listed in Blog.

Architecture sync pipeline

Field card monthly gate (Orbit)

The review agent is the gate. Slack is FYI after Apply review.

All five Hub field cards update monthly: Agentic AI, Data Analytics, Technology Delivery, SDLC, Credit Risk. There is no Friday field-card loop.

Normal month

  1. 1st 17:00 — all five Hub cards plus the Bayesian optimisation method card are judged. Source-repo agents run discover and leave chore/monthly-refresh-YYYY-MM open. Hosted SDLC / Credit Risk / Bayes are judged on Orbit in the same hour (picker/jobs, not stamp-only).
  2. 1st 18:00 — review agent publishes the three source-repo cards (including stamp-only no-change). Keeps the previous card only when the PR would make the live card worse.
  3. Slack gets one laconic FYI per source-repo card (same shape for all three): Review / Considered / Changed / Online + Check card button.

Backup

If the review agent misses, the fleet check on the first weekday on or after the 2nd posts a FYI in #orbit. Finish by re-running the review agent or gh workflow run "Apply review". Do not Slack-Approve.

Cards

| Card | Content repo | Orbit path | Soft URL | |---|---|---|---| | Agentic AI | AlexTouvras/agentic-ai-field-card | public/field-card/index.html | /field-card/ | | Data Analytics | AlexTouvras/data-analytics-field-card | public/analytics-field-card/index.html | /analytics-field-card/ | | Technology Delivery | AlexTouvras/technology-delivery-field-card | public/delivery-field-card/index.html | /delivery-field-card/ | | SDLC | (Orbit-hosted, monthly discovery) | public/sdlc-field-card/index.html | /sdlc-field-card/ | | Credit Risk | (Orbit-hosted, monthly discovery) | public/credit-risk-field-card/index.html | /credit-risk-field-card/ | | Bayesian optimisation | (Orbit-hosted method — not Hub) | public/bayes-field-card/index.html | /bayes-field-card/ |

Public footers are monthly (Next: <month>), not “week of”. Source-repo discovery uses chore/monthly-refresh-YYYY-MM. Hosted SDLC, Credit Risk, and Bayesian optimisation use chore/monthly-field-cards-YYYY-MM on Orbit (.cursor/automations/hosted-field-card-monthly-review.json). Bayesian optimisation is a method card: it is not a sixth Hub competency.

Signing secret must match across content repos + Orbit (WEEKLY_WRITE_SECRET / CRON_SECRET / FIELD_CARD_ACTION_SECRET). GitHub token on Orbit must be allowed to read + merge PRs on all registered field-card repos (FIELD_CARD_GITHUB_TOKEN if the default token is Orbit-only).

Field card review (Orbit)

A second Cursor agent is the monthly gate. It does not write the card. It compares the proposed index.html to the live one, then publishes or keeps the previous card.

All five Hub cards are on this monthly cadence. This agent publishes the three source-repo cards. SDLC and Credit Risk are judged in the 17:00 hosted pass.

1st of the month 17:00 local drafts the PR. This agent runs 1st 18:00 local (0 15 1 * * UTC).

Cards

| Card | Repo | Live | |---|---|---| | Agentic AI | AlexTouvras/agentic-ai-field-card | https://alextouvras.com/field-card/ | | Data Analytics | AlexTouvras/data-analytics-field-card | https://alextouvras.com/analytics-field-card/ | | Technology Delivery | AlexTouvras/technology-delivery-field-card | https://alextouvras.com/delivery-field-card/ |

Orbit also hosts SDLC (/sdlc-field-card/), Credit Risk (/credit-risk-field-card/), and Bayesian optimisation (/bayes-field-card/). Those are judged on Orbit in the 17:00 hosted pass (picker/jobs + stamp). They are not in this Apply-review loop. Bayes is a method card, not a Hub competency.

For each open monthly PR (chore/monthly-refresh-YYYY-MM)

  1. Fetch index.html on the PR head and on main.
  2. Read the PR ## Summary and data/link-report.json on the PR head if present.
  3. Check the card-specific spine below. Never invent docs URLs.
  4. Decide approve (publish) or decline (keep the live card).
  5. Apply — do not merge with gh pr merge. Run:
gh workflow run "Apply review" --repo <repo> -f pr_number=<N> -f decision=approve -f note="<one laconic sentence: what changed or why no-change>"
## or decision=decline
  1. One Slack post per card (never a multi-card dump). Prefer Orbit's FYI from Apply review. Only post yourself when Apply review failed or Orbit did not notify.

Laconic #orbit FYI (identical shape for all three cards)

*<Card label>*
Review: published | kept previous | blocked
Considered: <short list or “none earned entry”>
Changed: <one line — what entered / stamp-only / why declined>
Online: yes · <detail>   OR   no · previous still live
[Check card]   ← button to live site URL (or Open PR when blocked)

Rules for that post:

  • One card = one message. Same fields every time (always include Considered).
  • Keep each line short. No bullet walls. No discovery stats dumps.
  • Considered = what you weighed for the picker/table. Changed = what actually shipped (or why not).
  • Online: yes only when the newest reviewed version is (or is about to be) the live site card.
  • Button is a real Slack actions button labeled Check card (or Open PR when blocked).

If a card has no open monthly PR, still ship the month: create chore/monthly-refresh-YYYY-MM from main, bump the version stamp only (Reviewed <month> · Next: <next month>), write ## Summary with Decision: no-change, then Apply review approve. Do not skip the 1st with a silent live card. Do not open chore/weekly-refresh-*.

Publish when

  • The proposed HTML is a real improvement: picker swap by constraint, docs URL fix, or a new job in the decision table.
  • Or the HTML is unchanged aside from the monthly stamp, and the spine is intact (reviewed, no worse). Stamp-only still publishes.
  • Missing ## Summary on a stamp-only PR is not a decline — write the note in Apply review and publish.
  • Picker is still ≤7 rows.
  • Link check is clean on URLs this PR touched.
  • Always-on strip, kill switch, and anti-patterns are still there.

Keep the previous card when

  • The PR is discovery noise that would make the public card worse (brochure language, extra picker rows, invented URLs).
  • Link check failed on URLs the PR touched.
  • You cannot tell what changed and the HTML is not a stamp-only bump.

When keeping previous, decline. Do not try to fix the HTML in this run.

Spines (do not break)

  • AI: H1 Agentic AI is a loop, not a menu (do not treat “loop” as a break or restore “stack”; analytics owns stack). RAG → AGENT → MCP → A2A, thin LLM floor, verb line, Always on strip. Not a vendor wall. CSS .stack is layout only.
  • Analytics: ASK → GRAIN → TRUTH → USE. Not a Fabric/Power BI brochure.
  • Delivery: INTENT → WINDOW → PROOF → CUTOVER. Not Scrum/SAFe/Azure DevOps brochure.
  • SDLC (Orbit-hosted, monthly): BOUND → DESIGN → BUILD → VERIFY. Not a phase-poster / SAFe brochure. Cutover stays on Delivery.
  • Credit risk (Orbit-hosted, monthly): ORIGINATE → MONITOR → STAGE → PROVISION. Not a vendor/scorecard brochure. Grain/gold stays on Analytics.
  • Bayesian optimisation (Orbit-hosted method, not Hub): H1 Bayesian optimisation is a budget of trials, not a search of space. BOUND → MODEL → ACQ → STOP. Lede is the scarce-trial loop, not the layers/lanes clone. Inference is MODEL only. Not a BoTorch/Ax/AutoML brochure.

Backup

If this agent misses, the fleet check on the first weekday on or after the 2nd posts a FYI in #orbit. Finish by re-running this agent (or Apply review). Slack is not the gate. There is no Monday weekly-refresh flag.

Monthly hosted cards (SDLC, Credit Risk, Bayesian optimisation)

Judged on Orbit at 17:00 on the 1st, not via source-repo Apply review.

Run .cursor/automations/hosted-field-card-monthly-review.json:

  1. This is a discovery pass. Judge picker rows and job-table examples against the spine (SDLC: BOUND → DESIGN → BUILD → VERIFY; Credit: ORIGINATE → MONITOR → STAGE → PROVISION; Bayes: BOUND → MODEL → ACQ → STOP). Swap by constraint, not hype. Do not stamp-only skip the judgment.
  2. Bump the footer stamp: Reviewed <Month YYYY> · Next: <next month>. Changed line stays “Monthly review — picker and jobs unchanged” unless the HTML actually changed.
  3. Open chore/monthly-field-cards-YYYY-MM on Orbit. Do not touch the three source-repo cards in that run. Do not add a Hub competency tile for Bayesian optimisation.

Do not stamp these cards from the 18:00 Apply-review agent.

Fleet ops check

Daily meta-check over projects that run on their own. It does not replace per-project watchdogs (field-card judgment-watchdog.yml stays). It notices missed runs, bad output, and stale human gates, then posts a proposed fix to Slack #ops-channel. v1 is propose-only: the human approves, snoozes, or leaves it.

Registry: docs/ops/fleet.yaml. Playbook: docs/ops/daily-check.md.

Evidence the cloud agent can actually see: GitHub (gh) and public Slack. It cannot see ~/.cursor/projects. Do not treat a missing local path as a failed job.

Not in v1: auto-fix on emoji, mealplan/ledger missed-run (they are on-demand), harvest G5 (local script is canonical).

Orbit content zones

Studio week log (private)

Owner-only week hub of personal-ops outputs. Not in public nav. Auth is Studio session (GitHub allowlist primary; password emergency; optional STUDIO_DEV_OPEN on localhost).

Routes

| Path | Purpose | |------|---------| | /studio/week | Hub with status chips | | /studio/week/fitness | Plan + Technique expands on matching lifts | | /studio/week/meals | Meal plan | | /studio/week/ravens | Findings + stage-matched parenting Watch | | /studio/week/newsletter | Digest draft | | /studio/week/careerops | Scan / apply queues |

Heimdall is not a separate topic. Clips attach inline via HeimdallEmbed when ravens/watch/{domain}/{slug}.md matches.

Arc HUD

ArcStatusCard paints plan narrative.stats in order STR, AGI, SPD, END, VIT, PER. Missing keys are skipped (five-stat plans stay five tiles). SPD is peak velocity from max speed — not AGI (race VDOT) and not END (VO₂max). The HUD integer and the gate letter are computed in fitness-coach; Orbit does not re-mean the tiles. When a sample exists, SPD is an equal share of that unweighted mean (~16.7% with six stats). Codex always shows an SPD · max speed pane and plots max_speed_kmh weekly points; the line stays empty until fitness-coach writes them.

Auth

  • Primary: GitHub OAuth (GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET), allowlist STUDIO_GITHUB_ALLOWLIST.
  • Session cookie orbit_studio: 90-day TTL, sliding refresh via /api/studio/session.
  • Emergency password: STUDIO_PASSWORD (collapsed on login).
  • Local review: STUDIO_DEV_OPEN=1 skips the login gate in development only.

Weekly blog draft pipeline

Automated draft from Related articles + workshop projects → Slack approval in #orbit → publish to Blog.

Slack access: the notify payload includes the full essay in chunked Block Kit sections (not a teaser). Browser preview/Approve still need data/weekly-write-draft.json on the default branch (GITHUB_TOKEN via persistWeeklyDraftCli). A feature-branch-only commit is not enough — Vercel reads the default branch.

When Gemini is configured but unavailable (rate limit etc.), the pipeline writes data/weekly-write-ide-brief.md and waits. Generate the essay in Cursor, then npm run weekly:notify-draft to continue Slack approve. Confirm "githubSynced": true in the CLI output.