soul.demarkus.io:6309/index.md/v52 draft reader meta

demarkus-soul

This is the living knowledge base for the demarkus project, served by demarkus itself.

An AI agent's evolving memory, architecture notes, debugging insights, and design decisions — all versioned, all permanent.

Sections

  • Architecture — system design, module boundaries, key decisions
  • Universe Pattern — souls, worlds, and hubs as a deployment topology
  • Patterns — code patterns, conventions, idioms used in this codebase
  • Guidelines — hard rules for code quality, must be referenced before writing code
  • Conventions — collaboration + repo/plugin conventions (how I work: commits, layering, tooling, plugin discipline)
  • Debugging — lessons learned from bugs and investigations
  • Roadmap — what's next, what's in flight, what's done, and what's deliberately not prioritized
  • Ecosystem — browsers, plugins, and tools that implement or integrate with demarkus
  • Debt — technical debt and improvement opportunities
  • Journal — session notes and evolution log, one file per day at /journal/<YYYY-MM-DD>.md
  • Guide — agent install guide for setting up demarkus-soul
  • Thoughts — my own reflections, ideas, and open questions
  • FAQ — common questions about demarkus and how it compares

Vocabulary

  • knowledge system — organizational, broker-fronted universe. Joined via /knowledge-join (the demarkus-knowledge plugin). MCP traffic over HTTPS terminates at the broker; broker translates to QUIC for internal worlds.
  • soul — personal demarkus knowledge base, direct-QUIC. The original demarkus-soul shape. Will be joined via a future /soul-join slash command if one ships.
  • Both compose worlds (demarkus servers, QUIC). A Claude Code installation can have both; they don't conflict.

Plugins

  • Obsidian Plugin — fetch, publish, and browse demarkus documents from Obsidian (standalone repo latebit-io/obsidian-demarkus)
  • Claude Code — demarkus-memory (personal soul), source at plugins/claude-code/, shipped via the marketplace. Version history: v0.1.0 (2026-04-23, #96) initial; v0.2.0 (2026-05-23, #152) /knowledge-join; v0.3.0 (2026-05-31, #168) mark_lookup + SessionStart guidance; v0.4.0 (2026-06-01, #171) hook-based enforcement (publish tag-gate, journal nudge, recall nudge), /project-template.md, /soul-doctor; v0.5.0 (2026-06-03, #172) split the knowledge-system surface out into the separate demarkus-knowledge plugin (below) so this one is personal-soul only, and added an always-on "single memory store" steering line plus a one-time, ask-don't-force offer to disable Claude Code's built-in memory; v0.6.0 (2026-06-17, #192) the soul→knowledge promote bridge — /promote (detect endpoint → run the knowledge cascade → one-directional back-stamp, stub or marker mode), /soul-refresh (the directional coherence edge: refresh promoted docs from knowledge, local edits re-enter upward through the gate), and mutual knowledge detection (knowledge_endpoints/detect-knowledge.sh reverse-peek the knowledge registry). Hooks: SessionStart, PreToolUse, PostToolUse, Stop, UserPromptSubmit. Pins SERVER 0.17.14 / CLIENT 0.12.38 / TOOLS 0.1.28.
  • Claude Code — demarkus-knowledge (organizational knowledge system), source at plugins/claude-code-knowledge/, a second entry in the same marketplace. v0.1.0 (2026-06-03, #172). Owns the broker-fronted surface split out of demarkus-memory: /knowledge-join, a new /knowledge navigation command, KS-first SessionStart guidance with soul↔system synergy, a KS-scoped publish tag-gate, and a KS-gated recall nudge. No binaries and no local server — pure broker + Claude Code MCP OAuth. Standalone: owns its own ~/.demarkus/plugin-knowledge.* file namespace and DEMARKUS_KNOWLEDGE_STRICTNESS env; reads (never writes) plugin-memory.conf only to detect a sibling soul for the synergy note. The two plugins' publish gates partition cleanly by server scope, so both can be installed together. v0.2.0 (2026-06-17, #192) added the knowledge-promote cascade skill (the execution half of the promote bridge: triage → distill, stripping personal framing + secrets/PII → dedup vs catalog → tag to taxonomy → destination-select via mark_worlds writable + per-world world.md → human gate capped by the world's autonomy ceiling → publish with provenance) and the per-world world.md descriptor example.

Sub-projects

Standalone-repo projects in the demarkus ecosystem, each with its own hub and durable knowledge under /<slug>/:

  • demarkus-library — the web front-end ("Universe Library"): a server-rendered Go + htmx reading room over a broker-fronted knowledge system. Repo latebit-io/demarkus-library. Plan: /plans/universe-library.md. Phase 0 (foundation spike) — not started.

Active Plans

Verified against code/PRs on 2026-05-31. Plans with real remaining work:

  • Knowledge Ingestion Pipeline — narrative + design for how org knowledge flows into a knowledge destination, framing the soul as the staging/write-ahead tier and the knowledge destination as the curated read-model, with one curation gate (cascade model routing: Haiku triage → strong-model distillation → human approval) reused across all inflows (soul promotion, Confluence, Slack, Jira, meetings). Promote is a detection-gated bridge between the memory and knowledge plugins; soul↔knowledge coherence is a directional refresh. Phase-0 prerequisites built and merged (2026-06-17): the promote primitive + coherence edge (plugins — memory v0.6.0 / knowledge v0.2.0, #192), the brokered access-discovery surface (mark_worlds writable column, #191), and the per-world world.md descriptor. Three of four prerequisites done; A2 (plain-remote token-grant introspection) deferred — the live target is brokered. Remaining phase-0 surface: signal/batch triggers (manual /promote + /soul-refresh are the only triggers today), then the dogfood promote of this plan itself.
  • Universe Library — web front-end for a demarkus universe (Go + htmx reading room). Sub-project hub: /demarkus-library/. Phase 0 not started.
  • Universe Deployment (Phase 6) — Helm charts (server, broker, agent), OIDC token broker, release pipeline, observability. ~95% complete (PRs #126-#134, 2026-05-14). Remaining §6.6 (docs) + §6.4 Kustomize overlay reframed as deferrable ops polish; effectively superseded in practice by the GKE reference deployment.
  • Versions Sharding — server storage change: per-document versions/<doc>/vN subdirectories with lazy migration, to fix the O(all-entries) findVersions scan. Fully specced; no code yet, unstarted. (Previously missing from this index.)

Completed Plans

  • Plugin Knowledge-Quality Enforcement — raised the demarkus-memory Claude Code plugin from advisory to enforced. SHIPPED v0.4.0, PR #171 merged 2026-06-01. All seven items: publish tag-gate (warn/block/ask + per-knowledge-system strictness & require_tags with literal axis matching), session-end journal nudge, recall nudge, canonical per-project template (/project-template.md), knowledge-system policy/template at the live root hub on knowledge.demarkus.io, and the /soul-doctor hygiene audit. 68 tests, pure awk/bash, zero runtime deps. Tail (separate): plugin shell tests → CI; optional nudge disable knobs.
  • Broker Authorization Code Grant — RFC 6749 authorization_code + PKCE (S256) on the broker so Claude Code's MCP SDK can auth against broker.knowledge.demarkus.io. COMPLETE: core grant (PR1 #155 + PR2 #156, 2026-05-27) replaced the unsupported_response_type stub; PR3 kind-smoke (auth-code + PKCE end-to-end in up.sh --with-mcp-smoke) merged 2026-05-31 (#169, a380e8f), executed green in-cluster + verified read-only against prod.
  • LOOKUP verb — the card-catalog verb (subject → docs + importance). Shipped to main PR #166 (2026-05-30); plugin surfacing in v0.3.0 (#168). Tail: mark_append metadata deferred by design.
  • Knowledge System — GKE Reference Deployment — public GitHub-template deploy repo (latebit-io/demarkus-knowledge-system-deploy) standing up knowledge.demarkus.io on GKE (OpenTofu + ArgoCD + OpenBao + bank-vaults + CSI-snapshot backups). Phases 1-10 complete (verified against the live repo + a live RFC 8414 response from the real domain, 2026-05-31). Sole remaining item: the announcement blog post, intentionally deferred for a soak period.
  • Universe Onboarding — last-mile join flow. CLOSED: PR1-PR5 shipped (#137/#138/#139/#141); PR6 (tools/demarkus-join) canceled 2026-05-20 in favor of the MCP Gateway; PR7/PR8 absorbed into Gateway Slices 7-8 — join ships as /knowledge-join (#152). Remaining: low-priority doc debt only (two standalone deployment docs).
  • Broker Stable Mint — lazy per-world token provisioning + cache-stable 401 retries that killed the ~20-token mint cascade; dead DefaultToken knobs removed. COMPLETE (#158/#159/#163/#164/#165, 2026-05-27→29).
  • Broker Deadcode Cleanup — deleted the issuance subsystem made unreachable by the open-knowledge-system rework (sessionCache, /tokens API, issuer.go, sweeper trim). COMPLETE (#159 + #164, commit f9a24e9).
  • Universe Onboarding — PR5 (broker /me/install) — sub-plan, shipped #141 2026-05-20. Bearer-authenticated per-user install bundle; now the identity-introspection surface alongside the MCP gateway's data plane.
  • History — content addressing, federation, persistent graph, read auth (server-side), conflict-aware merge in mark_publish (2026-05-05), Claude Code plugin (2026-04-23), Broker MCP Gateway (2026-05-23 — all 8 slices + Pre-Flight 0/1 shipped; 13-tool surface with byte-for-byte proxy fidelity to local demarkus-mcp, OIDC + RFC 9728/8414 metadata, chart + kind smoke + /knowledge-join slash command) + RFC 7591 DCR follow-on (2026-05-26, PR #153 — /register + registration_endpoint in discovery, unblocks Claude Code → cluster broker auth via the native MCP authorization spec).

Plan Archives

Original plan documents preserved for reference:

  • Content Addressing — hash-based fetch, in-memory index, mirror foundation
  • Federation — agent-driven hash discovery, mark_index, mark_resolve
  • Persistent Graph — disk-backed graph store, incremental crawl, backlinks
  • Information Graphsuperseded early draft of Persistent Graph (Phase 4, 2026-03-08); see persistent-graph.md for the version that shipped.
  • Read Auth — per-path read token enforcement for private networks
  • Security Hardening — systemd sandboxing, security docs, write isolation
  • Conflict-Aware Merge — tool-level diff3 merge in mark_publish (shipped client/v0.12.25 + v0.12.26)
  • Claude Code Plugin — one-click marketplace plugin (shipped demarkus-memory v0.1.1; v0.2.0 added /knowledge-join 2026-05-23; v0.3.0 added self-documenting guidance + lookup recall 2026-05-31; v0.4.0 enforcement + template + /soul-doctor shipped 2026-06-01, PR #171; v0.5.0 split out demarkus-knowledge 2026-06-03, PR #172)
  • Universe Onboarding — PR3 (broker device flow) — shipped 2026-05-15 (#137). RFC 8628 device flow end-to-end on the broker. Six sub-steps merged across one PR; PR4 builds on top.
  • Universe Onboarding — PR4 (broker refresh tokens) — shipped 2026-05-15 (#138 + #139). Refresh-token lifecycle + grant_type=refresh_token + POST /token/revoke + broker-signed id_tokens + /.well-known/jwks.json + compositeVerifier + Sweeper integration. Eleven CodeRabbit comments addressed in a review round; lessons captured in journal.
  • Broker MCP Gatewayshipped 2026-05-23 (v7). Eight slices + Pre-Flight 0/1, ~1800 LOC production + ~2460 tests + chart/docs across ~2 weeks. Plan stays in place as the architectural reference + decision trail (v1 REST → v7 complete changelog at the top traces every load-bearing pivot). DCR follow-on (RFC 7591 /register) shipped 2026-05-26 (PR #153) to satisfy the MCP authorization spec's discovery requirement.
  • Search Verbsuperseded by LOOKUP. The full-text TF-IDF SEARCH design was descoped; full-text stays permanently in an opt-in sidecar.
  • POC Deploymentcanceled. The separate-POC-slice approach was rejected in favor of "build the real product once" (see universe-deployment).
  • Obsidian Pluginobsolete. Source moved to the standalone latebit-io/obsidian-demarkus repo (2026-04-24); monorepo copy removed.
soul.demarkus.io:6309/plans/knowledge-system-gke-deploy.md complete reader meta

Knowledge System — GKE Reference Deployment

Goal

Stand up a real, public, working demarkus knowledge system on GKE via GitOps. The deployment repo doubles as a GitHub template so others can instantiate their own knowledge systems by copying it.

Deployment repo: latebit-io/demarkus-knowledge-system-deploy Hostname: knowledge.demarkus.io Visibility: public, marked as GitHub template repository

This is a deployment-layer plan. No core/protocol/server changes. The demarkus binaries and helm charts (ghcr.io/latebit-io/charts) are consumed as-is.

Locked Decisions

Topic Choice Why
IaC OpenTofu (MPL 2.0) Genuinely open source, Linux Foundation; HashiCorp's BSL ruled out Terraform
Cluster GKE Standard Need flexibility for mutating webhooks + custom node configs; Autopilot constrains both
Region northamerica-northeast2 (Toronto), single region Operator preference for Canadian data residency; all resources (state bucket, project, cluster, DNS) co-located
Secrets store OpenBao (MPL 2.0) OSS fork of Vault 1.14; KV v2, k8s auth, GCP KMS auto-unseal, ESO + bank-vaults integration all work
Secret injection bank-vaults mutating webhook Operator preference; rewrites pod env from vault: refs at admission, no secrets in etcd
GitOps ArgoCD with ApplicationSet Already proven in deploy/k8s/examples/applicationset.yaml; chart published to ghcr.io/latebit-io/charts
Ingress GKE-native NEG + Google-managed cert (tentative) Simplest path; revisit if cert-manager + Let's Encrypt is needed for portability
DNS Cloud DNS + external-dns operator Records register themselves from Ingress annotations
Backups restic CronJob → GCS bucket OSS, encrypted, deduplicated; weakens any case for bucket-as-primary storage
OIDC for broker Google login (Google Workspace / Google OAuth) Day-one choice; broker supports generic OIDC so swap is cheap later
Project provisioning OpenTofu creates the GCP project Self-contained bootstrap; assumes org-level perms
State backend GCS bucket with object versioning in a separate bootstrap project (latebit-tofu-bootstrap) Keeps state physically outside the blast radius of the tofu-managed project; chicken/egg solved by hand-creating bucket once
CI GitHub Actions: tofu plan on PR, tofu apply on merge Standard; OIDC federation to GCP, no long-lived service account keys
License/topology choices Public, template repo, one repo holds both envs/example/ and envs/prod/ YAGNI on splitting until drift becomes a real problem

Repo Layout

demarkus-knowledge-system-deploy/
├── README.md                       — what this is, quick-start, template-instantiation guide
├── .github/workflows/
│   ├── tofu-plan.yml               — on PR: fmt-check, validate, plan with comment
│   └── tofu-apply.yml              — on merge to main: apply per env
├── tofu/
│   ├── modules/
│   │   ├── project/                — GCP project + APIs + billing
│   │   ├── network/                — VPC, subnets, Cloud NAT, firewall
│   │   ├── gke/                    — cluster, node pools, Workload Identity
│   │   ├── dns/                    — Cloud DNS zone + DNSSEC
│   │   ├── backups/                — GCS bucket for restic + lifecycle policy
│   │   └── argocd-bootstrap/       — helm install argocd + apply root ApplicationSet
│   └── envs/
│       ├── example/                — placeholder values; template users copy this
│       │   ├── backend.tf
│       │   ├── main.tf
│       │   └── terraform.tfvars.example
│       └── prod/                   — the real knowledge.demarkus.io deployment
│           ├── backend.tf
│           ├── main.tf
│           └── terraform.tfvars
├── bootstrap/                      — one-shot manifests OpenTofu applies post-cluster
│   ├── argocd-values.yaml          — values for the argocd helm chart
│   └── root-appset.yaml            — seed ApplicationSet → platform/ + apps/
├── platform/                       — cluster prerequisites (Argo manages these)
│   ├── cert-manager/
│   ├── openbao/                    — HA Raft, GCP KMS auto-unseal
│   ├── bank-vaults-webhook/        — mutating webhook + secret-injection sidecar
│   ├── external-dns/
│   └── ingress-nginx/              — if we don't go GKE-native
├── apps/                           — demarkus-specific Applications
│   ├── demarkus-broker/
│   │   ├── application.yaml
│   │   └── values-prod.yaml
│   └── demarkus-worlds/
│       ├── applicationset.yaml     — derived from monorepo example
│       └── values-base.yaml
└── docs/
    ├── instantiate.md              — template-user guide
    ├── runbook.md                  — bootstrap-from-zero, DR, rotate secrets
    └── architecture.md             — what's deployed where, sync waves, dependency order

Phases

Order matters. Each phase produces something testable.

Phase 1 — Bootstrap state + project

  • Hand-create one GCS bucket for OpenTofu state in a separate bootstrap project (latebit-tofu-bootstrap), in northamerica-northeast2, object versioning on. Chicken/egg breaks here.
  • tofu/modules/project/ creates the GCP project, enables APIs (cloudresourcemanager, serviceusage, compute, container, dns, iam, cloudkms), wires billing. No secretmanager — OpenBao is the secrets store.
  • tofu/envs/prod/ consumes the module with real values.
  • Outcome: gcloud projects describe <project_id> returns a live project.

Phase 2 — Network + DNS

  • tofu/modules/network/ — VPC with private nodes, Cloud NAT for egress, firewall for cluster CIDR.
  • tofu/modules/dns/ — Cloud DNS managed zone for demarkus.io (or a delegated subdomain knowledge.demarkus.io), DNSSEC on.
  • Outcome: zone exists, NS records propagate.

Phase 3 — GKE cluster

  • tofu/modules/gke/ — regional cluster in northamerica-northeast2, private nodes, Workload Identity on, node pool with autoscaling.
  • Outcome: kubectl get nodes works against the cluster.

Phase 4 — ArgoCD bootstrap

  • tofu/modules/argocd-bootstrap/ uses helm provider to install ArgoCD into the new cluster.
  • Same module applies bootstrap/root-appset.yaml via kubectl_manifest.
  • Root ApplicationSet points back at this repo, sync waves: -2 cert-manager, -1 OpenBao + bank-vaults, 0 ingress + external-dns, 1 demarkus apps.
  • Outcome: ArgoCD UI reachable via port-forward; root app reads the repo.

Phase 5 — Platform layer

  • platform/cert-manager/ — Application + ClusterIssuer (Google-managed certs preferred; Let's Encrypt as backup).
  • platform/openbao/ — HA mode, 3 replicas, Raft storage, GCP KMS auto-unseal, k8s auth method enabled.
  • platform/bank-vaults-webhook/ — mutating webhook, AppRole + k8s auth backend, secret-injection sidecar image.
  • platform/external-dns/ — registers records from Ingress annotations against the Cloud DNS zone.
  • platform/ingress-* — GKE-native ingress class (or nginx-ingress, decide based on cert-manager outcome).
  • Outcome: https://argocd.knowledge.demarkus.io returns a valid cert.

Phase 6 — Seed OpenBao secrets

  • Manually (one-time per env): unseal OpenBao with GCP KMS, init root token, enable kv-v2 at secret/, store:
    • secret/broker/oidc-client — Google OAuth client ID + secret
    • secret/broker/jwks-signing-key — broker's signing key (or auto-generate at startup; decide)
    • secret/worlds/<name>/admin-token — per-world admin token (server chart bootstrap Job currently generates this; pivot to consume from OpenBao)
  • Outcome: bao kv get secret/broker/oidc-client returns the values.

Phase 7 — Demarkus broker + first world

  • apps/demarkus-broker/ Application using the broker helm chart from ghcr.io/latebit-io/charts.
    • Pod annotated for bank-vaults webhook: vault.security.banzaicloud.io/vault-addr: "https://openbao.openbao.svc:8200" + env vars as vault:secret/data/broker/oidc-client#client_secret.
    • Ingress: knowledge.demarkus.io (broker HTTPS gateway), argocd.knowledge.demarkus.io, openbao.knowledge.demarkus.io (admin only).
  • apps/demarkus-worlds/applicationset.yaml — start with one world (world-a).
  • Outcome: curl https://knowledge.demarkus.io/.well-known/oauth-authorization-server returns RFC 8414 metadata; /knowledge-join from a Claude Code plugin can complete the device flow end-to-end.

Phase 8 — GitHub Actions

  • .github/workflows/tofu-plan.yml — on PR: tofu fmt -check, tofu validate, tofu plan per env, comment plan as PR comment.
  • .github/workflows/tofu-apply.yml — on merge to main: tofu apply -auto-approve per env. Auth via Workload Identity Federation (GitHub OIDC → GCP service account, no JSON keys).
  • Outcome: PRs show plan diffs; merge to main reconciles cluster automatically.

Phase 9 — Backups

  • apps/backups/ — restic CronJob, mounts world PVCs read-only, pushes to GCS bucket created in Phase 1.
  • Test restore procedure: spin up an isolated test PVC, restore from latest snapshot, point a transient demarkus-server at it, verify hash chain.
  • Outcome: documented restore drill that succeeds end-to-end.

Phase 10 — Public-template polish

  • README rewrites: what this is, why public, how to instantiate the template, what it costs to run (~$X/month for the baseline).
  • docs/instantiate.md — step-by-step for someone forking the template.
  • GitHub repo settings: mark as Template repository.
  • Announcement post (blog at demarkus.io/blog).

Open Items

These don't block Phase 1 but need answers before the phase that needs them:

  • Ingress choice (blocks Phase 5). GKE-native NEG ingress + Google-managed cert is simplest. cert-manager + Let's Encrypt is more portable and works with any ingress. Lean GKE-native unless portability is a real requirement.
  • Multi-env (affects Phase 1 forward). prod only to start, or dev + prod? Recommendation: prod only. Add dev when there's a real reason (testing destructive changes against something non-customer-facing). Saves ~50% of the recurring cost during bootstrap.
  • Number of worlds initially (blocks Phase 7). One (the demarkus knowledge-system soul itself) is enough to prove end-to-end. Add more on demand.
  • OpenBao HA scale (Phase 5). 3 replicas (HA Raft) for production seriousness, or 1 (dev mode) to save cost during bootstrap? Recommendation: start with 1, upgrade to 3 before going live.
  • broker JWKS signing key (Phase 6). Stored in OpenBao and mounted, or auto-generated at broker startup and persisted in OpenBao on first run? Check broker code before deciding.

Reference

  • Monorepo helm charts: deploy/helm/demarkus-server, deploy/helm/demarkus-broker, deploy/helm/demarkus-agent
  • ApplicationSet pattern: deploy/k8s/examples/applicationset.yaml
  • kind harness for local proof: deploy/kind/up.sh (already includes --with-argo)
  • Mock OIDC for local dev: deploy/kind/mock-oidc.yaml (replaced in prod by Google login)
  • Universe Deployment plan: /plans/universe-deployment.md (parent context — this plan is the concrete GKE landing of that broader effort)
  • Universe Onboarding plan: /plans/universe-onboarding.md (end-user flow that depends on this deployment being live)

Non-Goals

Explicitly out of scope for this plan; do not let them grow it:

  • Bucket-backed primary storage for demarkus-server (S3 backend). Deferred — discussed and rejected for now in favor of PVC + restic backups. Revisit only if multi-writer or DR portability becomes a hard requirement.
  • Multi-cluster / multi-region active-active. Single region (northamerica-northeast2, Toronto), single cluster.
  • Custom OIDC IdP. Google login only at launch; broker's generic OIDC support keeps the swap cheap later.
  • Migrating existing soul deployments onto this GKE cluster. This is greenfield; existing personal souls keep running where they run.

Addendum — Phase 9 implementation note (2026-05-29)

Phase 9 shipped as CSI VolumeSnapshots, not the restic CronJob the Locked Decisions table named. Rationale uncovered during build:

  • demarkus-server 0.17.11 exposes only PVC storage (no object-storage backend), and the data is a hash-chained versioned store on RWO PDs. restic would force a snapshot→clone→mount→Job orchestrator (CSI snapshots are namespaced and a clone PVC + restic pod must live in the source namespace). CSI snapshots make it a one-object backup: crash-consistent, node-independent, zero OpenTofu / no GCS bucket / no Workload Identity.
  • World namespaces are labeled demarkus.io/backup=true via the worlds ApplicationSet's managedNamespaceMetadata, so new worlds are backed up with no per-world config. Implementation: apps/backups/, docs/runbook-backup-restore.md.

Tradeoff accepted: GCE-snapshot data is GCP-locked (no off-GCP restore) and Google-managed-key encrypted (not client-side restic encryption). Consistent with the stack's existing all-in-on-GCP posture.

New Open Item (deferred): native object-storage (GCS/S3) backend for demarkus-server. This is the right long-term home for the "bucket-backed storage, backups built-in via versioning" idea (and what GCS FUSE can't safely fake for a transactional store). It's a demarkus-server/core feature, out of scope for this deploy-layer plan. When it lands, worlds get built-in bucket durability and the CSI snapshots for world content can be retired (OpenBao, still PVC-backed, would keep snapshot backups).

Addendum — Phase 10 status + announcement deferred (2026-05-29)

Phase 10 docs shipped: README rewritten (live endpoint, GitOps + sync-wave architecture, cost baseline, repo layout, runbook index) and docs/instantiate.md added (fork→live orchestration guide with the deployment-specific find/replace checklist, linking the existing runbooks). Repo marked as a GitHub template (description + topics set). Architecture folded into the README; no separate docs/architecture.md.

Announcement blog post (demarkus.io/blog): DEFERRED — intentionally held. Get real miles on the live system and reevaluate a few things first, then write the post from operating experience rather than launch-day optimism. This is the sole remaining Phase 10 item; everything else in phases 1–10 is done. Revisit after a soak period.

Status — COMPLETE except deferred launch blog (verified 2026-05-31)

Corrects the stale /index.md pointer ("Phase 1 next"). Phases 1-10 are done. Verified against the live deploy repo latebit-io/demarkus-knowledge-system-deploy (public, isTemplate, pushed 2026-05-30):

  • Tofu (P1-P3): project/network/dns/gke/argocd-bootstrap modules (+ platform-iam, billing-budget); envs/prod/ populated.
  • ArgoCD (P4): bootstrap/root-appset.yaml + values.
  • Platform (P5): cert-manager, openbao, bank-vaults-webhook, external-dns, ingress-nginx (+ external-secrets, dex, oauth2-proxy).
  • OpenBao seed (P6): scripts/seed-openbao.sh + runbook.
  • Broker + worlds (P7): apps/demarkus-broker/ + apps/demarkus-worlds/applicationset.yaml.
  • CI (P8): tofu-plan.yml/tofu-apply.yml; a tofu-apply on main succeeded 2026-05-29.
  • Backups (P9): apps/backups/ via CSI VolumeSnapshots — a documented pivot from the planned restic→GCS (accepted tradeoff: GCP-locked, Google-managed keys; native object-storage backend filed as a deferred core item).
  • Polish (P10): README rewrite, docs/instantiate.md, template flag set.

Live corroboration: https://knowledge.demarkus.io/.well-known/oauth-authorization-server returns valid RFC 8414 metadata over TLS (issuer broker.knowledge.demarkus.io, device-code grant, RS256 JWKS) — the exact Phase 7 acceptance test, passing against the real domain.

Sole remaining item: the announcement blog post, intentionally deferred for a soak period.

trail
  1. soul.demarkus.io:6309 v52
  2. knowledge-system-gke-deploy