Wiki Log
Note: log entries in this file may reference the retired root context tree (
AGENTS.ctx/), which no longer exists on disk. Those occurrences are historical provenance only; the current governance mechanism is the standalone skill library underSKILLS/. Entries are kept verbatim and this log is append-only.
[2026-04-22] bootstrap | repository scaffold
Initialized the first wiki.tazlab.net project scaffold.
Created:
- repository-level
AGENTS.mdschema README.mddocs/llm-wiki-pattern.mddocs/tazlab-integration.mdwiki/index.mdwiki/overview.md- raw source directories and wiki content directories
Why it matters:
This establishes the durable structure that future agents can use to ingest sources, maintain knowledge pages, and later integrate the wiki cleanly into the wider TazLab context system.
[2026-04-22] restructure | tazlab-wiki context and seed knowledge pages
Created the dedicated AGENTS.ctx/tazlab-wiki/ context and seeded the first durable TazLab knowledge pages in the wiki repository.
Created or updated:
AGENTS.ctx/tazlab-wiki/CONTEXT.mdAGENTS.ctx/CONTEXT.mdwiki/overview.mdwiki/index.mdwiki/concepts/tazlab-knowledge-layers.mdwiki/topics/tazlab-system-map.mdwiki/topics/tazlab-repository-map.md
Why it matters:
This gives future agents a named context that points to the wiki as an organized knowledge surface, while also providing the first durable pages that explain the overall TazLab structure and where different kinds of information belong.
[2026-04-22] restructure | repository hubs and cross-cutting architecture pages
Expanded the wiki from seed pages into a first-pass navigable knowledge base with repository hub pages and cross-cutting architecture topics.
Created or updated:
wiki/entities/agents-ctx.mdwiki/entities/tazpod.mdwiki/entities/ephemeral-castle.mdwiki/entities/tazlab-k8s.mdwiki/entities/mnemosyne-mcp-server.mdwiki/entities/blog-src.mdwiki/entities/wiki-tazlab-net.mdwiki/topics/ephemeral-castle-hetzner-vault-runtime.mdwiki/topics/ephemeral-castle-tailscale-foundation.mdwiki/topics/tazlab-secret-and-identity-flow.mdwiki/topics/tazlab-cluster-delivery-flow.mdwiki/index.mdwiki/overview.mdwiki/topics/tazlab-system-map.mdwiki/topics/tazlab-repository-map.md
Why it matters:
The wiki now describes the main TazLab repositories as first-class hubs, documents the two major ephemeral-castle subdomains called out by the operator, and introduces reusable architecture pages that connect operator environment, infrastructure bootstrap, GitOps, memory, and secret flow into one navigable structure.
[2026-04-22] ingest | blog narratives and CRISP program structure
Added first source-summary coverage from the blog layer and connected it to the wiki’s architecture pages, while also introducing a CRISP program-map page to explain the design tree behind current TazLab work.
Created or updated:
wiki/sources/blog-zero-credentials-on-disk.mdwiki/sources/blog-tailscale-secure-backbone.mdwiki/sources/blog-lushycorp-vault-security-architecture.mdwiki/sources/blog-terraforming-the-cloud-vault-hetzner.mdwiki/sources/blog-recursive-memory-compact-context.mdwiki/topics/tazlab-crisp-program-map.mdwiki/entities/blog-src.mdwiki/entities/agents-ctx.mdwiki/entities/tazpod.mdwiki/entities/ephemeral-castle.mdwiki/index.md
Why it matters:
The wiki now contains not only structural pages about the ecosystem, but also provenance-rich summaries of key published articles and an explicit map of the CRISP initiative tree, which makes the documentation layer more useful for both historical understanding and future agent onboarding.
[2026-04-22] restructure | flux dag and cluster layer detail
Added a code-aligned Flux DAG page for the active tazlab-k8s cluster and wired the existing cluster/secret/system pages to it so future agents can see the actual dependency order and installed workloads in one place.
Created or updated:
wiki/topics/tazlab-flux-dag.mdwiki/topics/tazlab-cluster-delivery-flow.mdwiki/topics/tazlab-system-map.mdwiki/topics/tazlab-secret-and-identity-flow.mdwiki/entities/tazlab-k8s.mdwiki/index.mdwiki/overview.md
Why it matters:
The wiki now explains the cluster as an executable Flux graph, not just as a conceptual architecture. That makes it much easier to answer operational questions about which layer depends on which, what gets installed where, and where the secret, auth, database, and application surfaces actually appear.
[2026-04-22] restructure | tazlab-k8s granularity and technology trunk split
Expanded the TazLab operational trunk into dedicated tazlab-k8s layer pages and created a separate technology/reference trunk for the software stack used to run TazLab.
Created or updated:
wiki/topics/tazlab-k8s-layers.mdwiki/topics/tazlab-k8s-operators.mdwiki/topics/tazlab-k8s-configs.mdwiki/topics/tazlab-k8s-instances.mdwiki/topics/tazlab-k8s-auth.mdwiki/topics/tazlab-k8s-apps.mdwiki/topics/tazlab-infrastructure-tech-stack.mdwiki/topics/tazlab-flux-dag-troubleshooting.mdwiki/entities/proxmox.mdwiki/entities/talos-linux.mdwiki/entities/tailscale.mdwiki/entities/metallb.mdwiki/entities/longhorn.mdwiki/entities/terraform.mdwiki/entities/kubernetes.mdwiki/entities/sops.mdwiki/entities/hashicorp-vault.mdwiki/entities/operator-terminal-tooling.mdwiki/sources/research-proxmox-and-talos-iac.mdwiki/sources/research-tailscale-and-networking.mdwiki/sources/research-talos-storage-and-persistence.mdwiki/sources/research-kubernetes-core-models.mdwiki/sources/research-kubernetes-secrets-and-sops.mdwiki/sources/research-terminal-tooling.md
Why it matters:
The wiki now reflects the way the operator actually thinks about the system: one trunk for TazLab itself and a second trunk for the supporting technologies and external research that explain how the system is built and debugged.
[2026-04-22] lint | broken research links in network entities
Fixed entity references in wiki/entities/metallb.md and wiki/entities/talos-linux.md so they point at the existing wiki/sources/research-tailscale-and-networking.md summary instead of a non-existent page.
Why it matters:
This removes dead links from the technology trunk and keeps the source graph consistent for future navigation.
[2026-04-22] restructure | secret model corrected to Infisical
Updated the wiki’s secret-management pages so the current TazLab state is described as Infisical-backed GitOps delivery, with SOPS demoted to research-only status and the LushyCorp/Vault path called out as the transition track.
Created or updated:
wiki/entities/infisical.mdwiki/entities/sops.mdwiki/entities/hashicorp-vault.mdwiki/entities/tazlab-k8s.mdwiki/topics/tazlab-secret-and-identity-flow.mdwiki/topics/tazlab-infrastructure-tech-stack.mdwiki/sources/research-kubernetes-secrets-and-sops.mdwiki/index.md
Why it matters:
This prevents the wiki from teaching an outdated secret flow and keeps the current operational model aligned with the live cluster and infrastructure context.
[2026-04-22] restructure | deep Ephemeral Castle documentation sweep
Added a deeper code-backed documentation set for ephemeral-castle, including a repository map, bootstrap pipeline, Proxmox/Talos foundation page, a Tailscale foundation expansion, and an analysis note for current topology drift.
Created or updated:
wiki/entities/ephemeral-castle.mdwiki/topics/ephemeral-castle-repository-map.mdwiki/topics/ephemeral-castle-cluster-bootstrap.mdwiki/topics/ephemeral-castle-proxmox-talos-foundation.mdwiki/topics/ephemeral-castle-tailscale-foundation.mdwiki/topics/tazlab-cluster-delivery-flow.mdwiki/topics/tazlab-system-map.mdwiki/analyses/ephemeral-castle-topology-drift.mdwiki/index.md
Why it matters:
This turns ephemeral-castle from a shallow hub into a navigable, code-aligned documentation surface that explains the actual bootstrap pipeline, module boundaries, and the current live topology without hiding doc drift.
[2026-04-23] restructure | wiki homepage draft
Added wiki/homepage.md as the public-facing entry point for the rendered wiki and linked it from wiki/index.md so future publication work has a clear landing page distinct from the internal index.
Why it matters:
This gives the eventual Hugo publication layer a dedicated front door without changing the canonical internal wiki directory structure.
[2026-04-23] restructure | Hugo publication adapter
Added the first publish/ adapter for the wiki, including Hugo mounts, minimal site templates, and the rendered-homepage wiring needed for local preview with hugo server.
Created or updated:
publish/hugo.tomlpublish/layouts/_default/baseof.htmlpublish/layouts/_default/list.htmlpublish/layouts/_default/single.htmlpublish/layouts/index.htmlwiki/homepage.mdwiki/overview.mdREADME.md
Why it matters:
This turns the wiki from a content-only repository into a site that can be previewed locally and later wired into the same deployment chain used by the blog, without restructuring the source wiki tree.
[2026-04-23] restructure | PaperMod theme adoption
Installed PaperMod as a Git submodule under publish/themes/ and switched the Hugo adapter to use the theme directly, keeping only the homepage override needed to preserve homepage.md as the public landing page.
Created or updated:
.gitmodulespublish/themes/PaperModpublish/hugo.tomlpublish/layouts/index.html
Why it matters:
This aligns the wiki publication path with the blog’s theme-management model while keeping the adapter minimal and easier to maintain than a hand-rolled full layout stack.
[2026-04-23] restructure | PaperMod visual refinement
Adjusted the wiki presentation layer so PaperMod behaves like a documentation site instead of a generic blog: stronger link contrast, fixed light theme, cleaner section cards, a more serious homepage, and no duplicate listing appended under the main wiki index.
Created or updated:
publish/hugo.tomlpublish/assets/css/extended/wiki.csspublish/layouts/index.htmlpublish/layouts/_default/list.html
Why it matters:
This makes the rendered wiki materially easier to scan and navigate, fixes low-visibility links, and gives the public surface a more professional documentation-oriented visual language.
[2026-04-23] restructure | wiki image publication pipeline
Added the container build and GitHub Actions publication path for the wiki, mirroring the blog’s delivery pattern while building from the publish/ adapter and publishing to the dedicated tazzo/tazlab-wiki image stream.
Created or updated:
Dockerfile.dockerignore.github/workflows/publish.yml
Why it matters:
This gives the wiki a production-ready image publication lane that matches the existing blog deployment model and keeps the Docker Hub credential contract aligned on the same GitHub Actions secret name used by the blog.
[2026-04-23] fix | wiki Docker build git metadata
Disabled enableGitInfo in publish/hugo.toml so the containerized Hugo build no longer tries to read .git metadata that is not copied into the wiki image build context.
Created or updated:
publish/hugo.toml
Why it matters:
This removes the failed to load Git data buildx failure in GitHub Actions and lets the wiki image publish from the Docker build path without bundling the repository history into the image.
[2026-04-23] restructure | deep Ephemeral Castle documentation expansion
Performed a comprehensive documentation sweep of the ephemeral-castle repository, creating a modular and granular manual for future agents.
Created or updated:
wiki/entities/ephemeral-castle.md(Hub centralizzato)wiki/topics/ephemeral-castle-architecture.mdwiki/topics/ephemeral-castle-terragrunt-layers.mdwiki/topics/ephemeral-castle-rebirth-protocol.mdwiki/topics/ephemeral-castle-vault-runtime-architecture.mdwiki/topics/ephemeral-castle-vault-bootstrap-and-restore.mdwiki/topics/ephemeral-castle-tailnet-security.mdwiki/topics/ephemeral-castle-tailscale-bridge.mdwiki/operations/ephemeral-castle-commands.mdwiki/index.md
Why it matters:
This provides a complete technical operational context for agents, allowing them to understand the Terragrunt layer model, the Vault runtime lifecycle on Hetzner, and the Tailscale mesh security without having to reverse-engineer the entire codebase or read obsolete documents.
[2026-04-23] restructure | deep TazLab K8s documentation sweep
Performed a comprehensive documentation sweep of the tazlab-k8s GitOps repository, detailing the layering pattern, image automation, and secret delivery model.
Created or updated:
wiki/entities/tazlab-k8s.md(Hub centralizzato)wiki/topics/tazlab-k8s-structure.mdwiki/topics/tazlab-k8s-image-automation.mdwiki/topics/tazlab-k8s-secrets-mapping.mdwiki/topics/tazlab-k8s-ingress-and-auth.mdwiki/topics/tazlab-k8s-monitoring.mdwiki/index.md
Why it matters:
This ensures that any agent working on the cluster has a clear understanding of the GitOps workflow, how to safely add new applications, and how secrets are injected without exposing them in manifests.
[2026-04-23] restructure | deep TazPod documentation sweep
Completed the operational manual by documenting the tazpod operator environment, its container architecture, and the sensitive vault-unseal mechanism.
Created or updated:
wiki/entities/tazpod.md(Hub centralizzato)wiki/topics/tazpod-architecture.mdwiki/topics/tazpod-vault-mechanism.mdwiki/operations/tazpod-cli-reference.mdwiki/index.md
Why it matters:
This provides the final piece of the onboarding puzzle for new agents, explaining how to maintain their own secrets, recover the environment from S3, and use the TazPod toolchain to interact with the rest of the TazLab infrastructure.
[2026-04-23] restructure | deep TazLab K8s GitOps manual expansion
Completed the GitOps manual by documenting the Flux DAG, repository structure, operator inventory, and cold-start logic.
Created or updated:
wiki/topics/tazlab-k8s-flux-dag.mdwiki/topics/tazlab-k8s-repository-mapping.mdwiki/topics/tazlab-k8s-operators-inventory.mdwiki/topics/tazlab-k8s-bootstrap-logic.mdwiki/topics/tazlab-k8s-conventions.mdwiki/index.md
Why it matters:
This provides a detailed technical reference for the cluster’s desired state, allowing future agents to navigate the GitOps dependency graph, troubleshoot reconciliation issues, and correctly add or modify infrastructure operators and application manifests.
[2026-04-23] restructure | deep TazPod manual expansion
Completed the operator documentation by secluding the tazpod repository into granular topics covering image layering, the RAM-only security model, and nomadic recovery workflows.
Created or updated:
wiki/topics/tazpod-image-hierarchy.mdwiki/topics/tazpod-vault-security.mdwiki/topics/tazpod-nomadic-recovery-flow.mdwiki/topics/tazpod-provisioning-and-dotfiles.mdwiki/topics/tazpod-sync-daemon.mdwiki/index.md
Why it matters:
This provides a definitive technical manual for the operator environment, ensuring that any future agent understands how to recover from scratch, how secrets are protected in memory, and how the containerized toolchain is provisioned and kept in sync with S3.
[2026-04-25] refine | high-definition TazPod manual revision
Reworked the canonical tazpod pages to align them with the actual Go command dispatch, vault paths, S3 contract, Docker layer chain, and .bashrc provisioning logic instead of relying on older generalized summaries.
Created or updated:
wiki/topics/tazpod-architecture.mdwiki/topics/tazpod-image-hierarchy.mdwiki/topics/tazpod-vault-security.mdwiki/topics/tazpod-nomadic-workflow.mdwiki/topics/tazpod-provisioning-and-dotfiles.mdwiki/topics/tazpod-sync-daemon.mdwiki/operations/tazpod-cli-reference.mdwiki/entities/tazpod.mdwiki/index.md
Why it matters:
The tazpod section now explains the actual runtime contract, command dispatch, persistence boundaries, cryptographic model, and operator recovery flow with enough fidelity that an agent can reason directly from the wiki before opening the code.
[2026-04-25] restructure | tailnet startup and verification path
Documented the non-interactive Tailscale startup flow and the verified peer reachability checks in both the Ephemeral Castle provider context and the wiki runbook/security pages.
Created or updated:
AGENTS.ctx/ephemeral-castle/CONTEXT.mdwiki/operations/ephemeral-castle-commands.mdwiki/topics/ephemeral-castle-tailnet-security.md
Why it matters:
This preserves the working tailnet join path that avoids an interactive login prompt, and it gives future operators a single documented entrypoint plus concrete ping targets for vault and cluster reachability.
[2026-04-26] ingest | Vault API access contract
Documented the Hetzner Vault API access pattern in wiki/topics/tazlab-secret-and-identity-flow.md and wiki/topics/ephemeral-castle-vault-runtime-architecture.md: Vault is reachable over Tailscale at https://lushycorp-api.ts.tazlab.net:8200, but helper tooling still authenticates with a Vault token, with the current canonical operator token sourced from ~/secrets/lushycorp-vault/admin-token.txt. This matters because the migration helper needs a durable, explicit contract and should not assume network access alone is sufficient.
[2026-04-26] ingest | Infisical source-side bootstrap contract
Updated wiki/topics/tazlab-k8s-secrets-mapping.md to record the current Infisical bootstrap inputs for tazlab-secrets: ~/secrets/infisical-client-id and ~/secrets/infisical-client-secret, with the source scope inherited from the ephemeral-castle live/env.hcl contract. This matters because the one-key migration helper needs a concrete source-auth contract as well as a destination-auth contract.
[2026-04-26] ingest | Infisical source-folder derivation
Clarified in wiki/topics/tazlab-k8s-secrets-mapping.md that the migration helper should infer the Infisical source folder from the existing bundle mapping table instead of asking the operator for an extra runtime argument. This matters because the helper contract stays minimal while still remaining deterministic.
[2026-04-27] query | Vault cluster-side reachability contract
Updated wiki/topics/ephemeral-castle-tailscale-bridge.md, wiki/topics/tazlab-secret-and-identity-flow.md, and wiki/topics/ephemeral-castle-vault-runtime-architecture.md after live verification from the cluster and the dedicated Tailscale tool session. The verified result is that cluster pods can already reach the Vault tailnet IP through the Talos node bridge, and HTTPS works when the request uses explicit SNI/host mapping, but workload DNS for lushycorp-api.ts.tazlab.net is not yet wired by the bridge alone. This matters because the Vault migration track is blocked not on raw pod-to-tailnet egress, but on the remaining cluster DNS / hostname contract required by ESO.
[2026-04-27] query | Vault native Tailscale hostname direction
Refined wiki/topics/ephemeral-castle-vault-runtime-architecture.md and wiki/topics/tazlab-secret-and-identity-flow.md with the code-verified distinction between the native Tailscale host identity lushycorp-vm.ts.tazlab.net and the custom runtime alias lushycorp-api.ts.tazlab.net. This matters because the preferred future architecture is to converge the Vault API/TLS contract onto the Tailscale-owned hostname rather than keep carrying custom DNS glue around a non-native alias.
Updated wiki/topics/ephemeral-castle-tailscale-bridge.md too so the bridge page now makes the same distinction explicitly and does not imply that the custom Vault alias is part of the Tailscale-owned naming surface.
[2026-04-28] query | Vault destroy/create matrix and bootstrap-anchor gap
Updated wiki/topics/ephemeral-castle-vault-bootstrap-and-restore.md, wiki/topics/ephemeral-castle-vault-runtime-architecture.md, wiki/topics/ephemeral-castle-hetzner-vault-runtime.md, and wiki/operations/ephemeral-castle-commands.md after the live Phase-1 validation pass for 09-vault-k8s-integration-prep. The durable findings are that the old C2 matrix still governs current behavior, T0 + H0 + S1 is an intentional hard-fail state, create-time validation depends on a live operator-side Tailscale session, and the runtime classifies TazPod state from ~/secrets/lushycorp-vault/ rather than from /workspace/.tazpod/vault/vault.tar.aes directly. This matters because the missing operator-side canonical bootstrap files, not a broken matrix, are what currently block a deterministic destroy/create completion.
[2026-04-28] query | Encrypted vault archive content check
Extended wiki/topics/ephemeral-castle-vault-bootstrap-and-restore.md after a direct decrypted inspection of /workspace/.tazpod/vault/vault.tar.aes. The verified result is that the current encrypted archive predates the April C1/C2 Vault work and contains zero lushycorp-vault/* entries, so the bootstrap-anchor gap is not caused by a bad unlock/materialization step; the active encrypted archive itself never captured the canonical Vault bootstrap set.
[2026-04-28] query | Missing tazpod save/push after Vault Phase B
Extended wiki/topics/ephemeral-castle-vault-bootstrap-and-restore.md again after a code audit of the Vault runtime role and tazpod vault implementation. The verified result is that the runtime does write canonical Vault artifacts into ~/secrets/lushycorp-vault/ during Phase B, but nowhere in the C1/C2 flow does it run tazpod save plus tazpod push vault. This matters because it identifies the real root cause: the operator-side RAM secrets were updated, but the encrypted archive backing future unlocks was never refreshed.
[2026-04-28] query | Vault persistence remediation and runtime re-stabilization
Updated wiki/topics/ephemeral-castle-vault-bootstrap-and-restore.md and wiki/topics/ephemeral-castle-vault-runtime-architecture.md after the runtime persistence fix and live recovery pass. The durable result is that the runtime flow now asserts the RAM vault is really mounted and runs tazpod save / tazpod push vault from /workspace, while the live environment was repaired so the encrypted operator archive again contains the full lushycorp-vault/* canonical set and the remote snapshot lineage was reinitialized under 61e17cbf-f522-4825-9bfe-444373173650. The same pass also surfaced two residual tazpod UX bugs: save can look successful when the RAM mount is absent, and push is cwd-sensitive if called outside the workspace root.
[2026-04-29] detail | mnemosyne-mcp-server debts
Created a dedicated debt detail page for mnemosyne-mcp-server documenting all known code-level gaps found during the Section 4 wiki-archivist survey review.
Created or updated:
wiki/details/mnemosyne-mcp-debts-detail.md— TD-002, async ingestion error swallowing, unreachable temporal filters, unbounded dedup cache, missing graceful shutdown, no HTTP auth, root path serving MCP traffic, Python tool gapswiki/entities/mnemosyne-mcp-server.md— added Known Issues / Technical Debt section linking to the new detail pagewiki/index.md— added Details section
Why it matters:
This anchors the wiki’s technical debt documentation model: instead of burying known issues in generic architecture pages, each area gets a dedicated debt detail page that cross-references the canonical TD register in memory, the AGENTS.ctx context, and the specific source code paths. Agents navigating the wiki can immediately see what is broken or risky in an area without reading the full implementation.
[2026-04-29] detail | mnemosyne-mcp-server section completed
Completed Section 4 of the wiki-archivist survey plan: created all 5 remaining missing pages and updated the entity hub following the standard Level 1 template.
Created or updated:
wiki/topics/mnemosyne-database-schema.md— NEW: database schema, pgvector queries, dimension auto-detectionwiki/details/mnemosyne-ingest-memory-detail.md— NEW: exact ingestion pipeline with code pathswiki/details/mnemosyne-retrieve-memories-detail.md— NEW: semantic search flow and temporal filter gapwiki/details/mnemosyne-deployment-detail.md— NEW: Docker, CI/CD, Flux automation, cluster manifestswiki/details/mnemosyne-python-tools-detail.md— NEW: chronicler.py, gather_sessions.pywiki/entities/mnemosyne-mcp-server.md— UPDATED: added repository structure, quick facts, canonical starting pageswiki/index.md— UPDATED: added Knowledge Systems topic section and 4 new detail entries
Why it matters:
Section 4 was previously marked “Completed” in the survey state but only 6 of 11 planned pages existed. The 5 missing pages included the database schema topic and 4 Level 3 detail pages. The entity hub also lacked standard Level 1 sections. This pass closes all gaps and fixes broken cross-links from the existing topic pages to the newly created details.
[2026-04-29] detail | tazlab-k8s Flux section (Section 3 — Flux scope)
Created and updated pages for the Flux/GitOps scope of Section 3 in the wiki-archivist survey plan.
Created:
details/tazlab-k8s-flux-kustomizations-detail.md— All 12 Flux Kustomizations with exact spec, wait policy, dependencies, timeout, health checksdetails/tazlab-k8s-image-automation-detail.md— 4 image automation pipelines (blog, wiki, mcp, openclaw) with tag patterns and commit strategy
Updated:
entities/tazlab-k8s.md— Full Level 1 hub: repository structure, quick facts, canonical starting pages, relationshipstopics/tazlab-k8s-flux-dag.md— Corrected wait policy truth table, added apps-openclaw, fixed misleading “wait: false from Level 3 onwards” statement, added health checks sectiontopics/tazlab-k8s-operators-inventory.md— Added missing operators (dex, OAuth2 Proxy, cloudflare-ddns, pgadmin, homepage, metrics-server), namespace inventory tablewiki/index.md— Added 2 new detail entries
Why it matters:
The existing flux-dag page had drifted from the actual Kustomization manifests: it incorrectly stated that all Level 3+ Kustomizations use wait: false (in reality, only infrastructure-instances does; apps-openclaw and infrastructure-auth use wait: true). The operators inventory was missing 5 controllers and had no namespace inventory. Both are now aligned with the code.
[2026-04-29] detail | tazlab-k8s Section 3 completed
Completed the remaining operator/app detail pages, reference pages, and Level 4 docs for tazlab-k8s.
Created:
details/tazlab-k8s-cert-manager-detail.md— ClusterIssuers, certificate lifecycle, Cloudflare DNS01details/tazlab-k8s-traefik-detail.md— HelmRelease, LoadBalancer, middlewares, ingress classdetails/tazlab-k8s-external-secrets-detail.md— All ExternalSecrets inventory, templatesdetails/tazlab-k8s-tazlab-db-detail.md— PostgresCluster, databases, init SQL, S3 backupdetails/tazlab-k8s-dex-oauth2-detail.md— Dex OIDC, OAuth2 Proxy, ForwardAuth middlewaredetails/tazlab-k8s-hugo-blog-detail.md— Deployment, redirect ingress, certificate, image automationdetails/tazlab-k8s-hugo-wiki-detail.md— Wiki deployment, TLS, delivery chaindetails/tazlab-k8s-monitoring-detail.md— kube-prometheus-stack, Grafana PostgreSQL backend, dashboardsdetails/tazlab-k8s-openclaw-detail.md— AI agent, network policy, PVCs, TD-019references/tazlab-k8s/flux-kustomization-example.md— Annotated Kustomization YAMLreferences/tazlab-k8s/image-policy-example.md— Full ImagePolicy pipeline examplereferences/tazlab-k8s/external-secret-example.md— Three ExternalSecret variantsreferences/tazlab-k8s/kustomize-layering.md— Base/cluster overlay pattern
Updated:
wiki/index.md— Added 13 new detail + reference entries
Total: 13 new pages created, 3 existing pages updated, all cross-linked correctly.
[2026-04-29] detail | tazpod Section 1 completed
Completed Section 1 (tazpod) of the wiki-archivist survey plan: 9 Level 3 details, 7 Level 4 references, updated hub and 3 topic/operation pages.
Created:
details/tazpod-smart-entry-detail.md— Flow diagram, branch conditions, code pathsdetails/tazpod-vault-lifecycle-detail.md— unlock/lock/save/push/pull, AWS bridge, SetupIdentitydetails/tazpod-sync-daemon-detail.md— 5-min cycle, SIGTERM, log path, failure modeldetails/tazpod-container-lifecycle-detail.md— Docker flags, state machine, MTU issuedetails/tazpod-dotfiles-detail.md— bashrc, tmux, symlinks, OpenCode seedingdetails/tazpod-config-detail.md— All Config struct fields with defaultsdetails/tazpod-crypto-detail.md— AES-256-GCM, PBKDF2, output formatdetails/tazpod-s3-detail.md— S3 client, vault object contract, cwd sensitivitydetails/tazpod-ci-detail.md— Build matrix, conditional Docker pipelinereferences/tazpod/config-yaml-example.md,dockerfile-*(4),bashrc-full.md,taskfile-yml.mdentities/tazpod.md— Full hub with repo structure, quick facts, canonical pages, TD table
Updated:
operations/tazpod-cli-reference.md— Added missing commands, flag tables, exit codestopics/tazpod-sync-daemon.md— Added 5-min interval, SIGTERM, log pathtopics/tazpod-vault-security.md— Added TD-022, TD-021 referencestopics/tazpod-architecture.md— Added links to all new detail pageswiki/index.md— Added 16 new entries + new References subsection
Total: 16 new pages (9 detail + 7 reference), 5 existing pages updated.
[2026-04-29] detail | tailscale Section 7 completed
Completed Section 7 (tailscale networking) of the wiki-archivist survey plan: 4 Level 2 topics, 5 Level 3 details, 3 Level 4 references, updated hub and 2 existing pages.
Created:
entities/tailscale.md— Full hub: network segments, vault hostname evolution, quick facts, known issuestopics/tailscale-iac-management.md— Terraform provider, OAuth client model, ACL as codetopics/tailscale-operator-connectivity.md— Userspace daemon, auth key minting, restart after containertopics/tailscale-cluster-integration.md— Talos System Extension, raw IP vs DNS gaptopics/tailscale-vault-contract.md— Vault hostname evolution, MagicDNS convergence, TD-020details/tailscale-terraform-root-detail.md— Resource inventory, variables, outputsdetails/tailscale-acl-policy-detail.md— Tag ownership, ACL diagram, SSH accessdetails/tailscale-oauth-client-detail.md— Key minting flow, fallback, key propertiesdetails/tailscale-talos-bridge-detail.md— System Extension config, AuthKey injectiondetails/tailscale-magicdns-detail.md— Naming contracts, custom alias pitfallsreferences/tailscale/acl-json.md— Current ACL policyreferences/tailscale/terraform-main-tf.md— Terraform root modulereferences/tailscale/start-sh.md— Operator daemon start script
Updated:
topics/ephemeral-castle-tailnet-security.md— Replaced stale hostnamelushycorp-vm-ts-tazlab-net-3with currentlushycorp-vault, added vault hostname note, links to new pagestopics/ephemeral-castle-tailscale-bridge.md— Updated verification with current FQDN and tailnet IP, corrected custom alias explanationwiki/index.md— Added Tailscale Networking section, 5 new details, 3 references
[2026-04-29] detail | blog-src Section 5 completed
Completed Section 5 (blog-src) of the wiki-archivist survey plan: 4 Level 2 topics, 3 Level 3 details, updated hub.
Created:
entities/blog-src.md— Full hub: repo structure, quick facts, canonical pagestopics/blog-publication-pipeline.md— Multi-step GitOps publication chaintopics/blog-content-structure.md— Article organization, front matter, bilingual modeltopics/blog-comments-system.md— Cusdis Cloud, bilingual threads, future self-hostedtopics/blog-theme-management.md— Blowfish versioning, pinning, config sectionsdetails/blog-post-workflow-detail.md— 5-phase writing workflow, prompt files, image processingdetails/blog-hugo-config-detail.md— Site, language, theme configuration referencedetails/blog-ci-detail.md— GitHub Actions pipeline, tag strategy, delivery chain
[2026-04-29] detail | ephemeral-castle Section 2 completed
Completed Section 2 (ephemeral-castle + vault) of the wiki-archivist survey plan: 8 Level 3 details, 5 Level 4 references, updated hub and 2 existing pages.
Created:
entities/ephemeral-castle.md— Full hub: repo structure, quick facts, canonical pages, TD tabledetails/ephemeral-castle-create-destroy-detail.md— 6-stage create pipeline, destroy process, preflight checksdetails/ephemeral-castle-ansible-vault-detail.md— Classification, guards, execution, post-convergencedetails/ephemeral-castle-terraform-modules-detail.md— 6 modules, build orderdetails/ephemeral-castle-terragrunt-layers-detail.md— Dependency chain, env.hcl, secret injectiondetails/ephemeral-castle-vault-ansible-scripts-detail.md— phase-a-bootstrap, unseal, backup, restoredetails/ephemeral-castle-vault-systemd-detail.md— 5 systemd units, Quadlet TD-016details/ephemeral-castle-golden-image-detail.md— Builder pipeline, v1-v4 historydetails/ephemeral-castle-proxmox-cluster-detail.md— create/destroy/nuclear-wipe/stress-testreferences/ephemeral-castle/vault-hcl-template.mdreferences/ephemeral-castle/create-sh-stages.mdreferences/ephemeral-castle/ansible-inventory.mdreferences/ephemeral-castle/env-hcl.mdreferences/ephemeral-castle/vault-certs-fetch.md
Updated:
topics/ephemeral-castle-vault-runtime-architecture.md— Added TD links and detail page referencesoperations/ephemeral-castle-commands.md— Added Ansible playbooks, golden-image build, corrected ping targetswiki/index.md— Added 8 new details, 5 references
Total: 15 new pages, 2 existing pages updated. Section 2 fully completed.
[2026-04-29] detail | agents-ctx Section 6 + cross-cutting Section 8 completed
Final two sections completed. Created 22 pages total.
Section 6 (agents-ctx):
entities/agents-ctx.md— Full hub with context registry and canonical pages- 5 Level 2 topics: context-system, memory-system, crisp-methodology, pi-council, wiki-archivist
- 3 Level 3 details: archive-flow, crisp-workflow, memory-files
Section 8 (cross-cutting + blog ingestion):
concepts/zero-trust-architecture.md— Security model across all layersconcepts/nomadic-operator.md— Portable operator identitytopics/tazlab-operating-model.md— Repository roles in daily work- 7 blog source ingestion pages: ephemeral-castle-vision, tazpod-rising, tazpod-v2-ram-vault, bootstrap-from-zero, phoenix-protocol, immutable-handover, terragrunt-pivot
Total survey complete: 8 sections, all pages created and cross-linked.
[2026-04-30] query | Transport root cause confirmed, TUN mode adopted, split playbooks, timing improvement
Updated wiki pages after the TazPod hostnet+TUN runtime confirmed that the remaining Hetzner Vault create pipeline failures were caused by the old Docker userspace-networking + tailscale nc transport path, not by Vault/Ansible logic. The full create cycle now runs in ~344s (down from ~1200s).
Updated:
topics/tailscale-operator-connectivity.md— Added Host Network + TUN Mode section documenting--network host,--cap-add NET_ADMIN,/dev/net/tun,tazpod-tailscale-up,TAILSCALE_SOCKETauto-detection,render-tailscale-inventory.shTUN auto-detection, and the performance improvement.operations/ephemeral-castle-commands.md— Replaced monolithicvault-s3-backup-recovery.ymlwith 3 split playbooks (install/converge/post), added new phase log patterns (*-60-vault-runtime-install.log,*-70-vault-runtime-converge.log,*-80-vault-runtime-post.log), updated preflight to note that hostnet+TUN mode runs Tailscale natively viatazpod-tailscale-up, added 344s timing table.entities/ephemeral-castle.md— Added TD-024 (Closed) to Known Issues, updated vault tailnet IP to 100.82.13.87, updated create.sh description to “8-stage provisioning pipeline (~344s)”, added playbook names to ansible entry.wiki/index.md— Updated tailscale-operator-connectivity description to reflect both modes.
Why it matters: The transport-layer root cause is now confirmed and resolved. The wiki should teach future operators that the old userspace path is deprecated and that hostnet+TUN is the default, faster, and more reliable runtime mode.
[2026-05-02] update | tazpod v0.3.21 — vault auto-lock, vault CLI, KUBECONFIG
Updated:
entities/tazpod.md— version 0.3.18 → 0.3.21, added TD-027 to Known Issuestopics/tazpod-image-hierarchy.md— added vault CLI and KUBECONFIG ENV to k8s layerdetails/tazpod-dotfiles-detail.md— replaced staletazpod()wrapper, addedvault_maybe_locktrap section with reference counting, added auto-load on shell startdetails/tazpod-vault-lifecycle-detail.md— added auto-lock on last shell exit section, TD-027 regression analysiswiki/log.md— this entry
Why it matters: The vault auto-lock regression had two cumulative root causes going back months. Documenting the trap + reference counting fix and the multi-shell behavior ensures operators understand how the vault lifecycle works and why it only locks on the last exit.
[2026-05-03] update | tazpod v0.3.22 — final marker-file vault auto-lock
Updated:
entities/tazpod.md— version 0.3.21 → 0.3.22, TD-027 summary corrected to marker-file final fixdetails/tazpod-dotfiles-detail.md— replaced stalepgreptrap with final marker-file implementation in/tmp/.tazpod-shells/details/tazpod-vault-lifecycle-detail.md— updated auto-lock section to final v0.3.22 design and historywiki/log.md— append entry
Why it matters:
The earlier pgrep-based shell counting was not resistant enough to real operator behavior (background subshells, orphaned docker exec sessions, repeated container rebuild tests). The final marker-file approach is simpler to reason about, survives stale-process cleanup, and matches the desired rule: first exit of multiple shells does nothing, last exit locks the vault.
[2026-05-05] update | CRISP 07-tailscale-operator-deployment split → wiki alignment
Updated wiki to reflect the CRISP project split of 07-tailscale-operator-deployment into two subprojects:
10-operator-dns-resolution— Tailscale Kubernetes Operator bootstrap + MagicDNS resolution (magellanic-gondola.ts.net) for cluster pods, via DNSConfig + CoreDNS forwarding. Hard prerequisite for09-vault-k8s-integration-prepPhase 2.20-tailscale-service-exposure— Postgres tailnet exposure, admin dashboard migration. Deferred until after Vault migration (09/10).
Updated:
entities/tailscale.md— Addedk8s_operatorOAuth client (tagtag:k8s-operator, scopedevices), Tailscale Kubernetes Operator section, updated Quick Factstopics/tailscale-cluster-integration.md— Updated Connectivity Model with DNS resolution path diagram, documented CoreDNS hostNetwork constraint and Operator DNS solutiontopics/tazlab-k8s-operators-inventory.md— Added Tailscale Operator as #14 with HelmRelease details, addedtailscalenamespace to inventoryentities/tazlab-k8s.md— Addedtailscale/to operators/core/, configs/, and DNSConfig to bridge/ in directory treetopics/tazlab-crisp-program-map.md— Updated30-hetzner-vault-consumerssection with 07 split and child project descriptionstopics/tailscale-vault-contract.md— Split cluster pod path into current (IP-only with CoreDNS constraint) and planned (Operator DNS resolution)wiki/log.md— this entry
Why it matters:
The 07 split mirrors a real architectural decision (MagicDNS resolution via Operator DNS + CoreDNS forwarding, avoiding hostNetwork and Talos machine config changes). The wiki must reflect the planned state so future agents and operators understand the DNS architecture before crisp-build executes the plan.
[2026-05-07] update | antigravity plugin removed
Removed all antigravity (opencode-antigravity-auth@beta) references from the wiki after the plugin was purged from the TazPod runtime and image due to ToS violation risk.
Updated:
details/tazpod-dotfiles-detail.md— removed antigravity.json seed and npm install steps from OpenCode auto-seeding sectionreferences/tazpod/bashrc-full.md— replaced the antigravity opencode.json/antigravity.json block with standard model configtopics/tazpod-provisioning-and-dotfiles.md— removed antigravity seed steps, added removal notewiki/log.md— this entry
Why it matters:
The antigravity plugin was removed from both the current runtime and the tazpod .bashrc provisioning so it will not reappear on next container restart. The wiki must reflect the current provisioning state to avoid teaching operators about a removed component.
[2026-05-08] ingest | Tailscale Operator DNS, create.sh hardening, Infisical EU endpoint
Updated pages with findings from the 10-operator-dns-resolution build session (8 destroy/create cycles).
Created/Updated:
topics/tailscale-cluster-integration.md— Replaced “Planned” DNS path with deployed solution: hostNetwork CoreDNS relay DaemonSet (port 5353), static hosts mapping for Vault, note about DNSConfig limitation (operator-proxy names only)topics/ephemeral-castle-rebirth-protocol.md— Added ghcr pull secret section, CoreDNS MagicDNS patch section, storage parallelization note, TD-026 auth race, documented log locationstopics/tazlab-k8s-operators-inventory.md— Tailscale Operator updated from “Planned” to “Deployed 2026-05-08” with 3-layer Flux DAG detailstopics/tazlab-k8s-secrets-mapping.md— Added Infisical EU endpoint (eu.infisical.com), project slug, secrets pathwiki/log.md— this entry
Why it matters: The cluster bootstrap process was hardened against ghcr.io anonymous rate limits, CoreDNS inlineManifest overwrites, and sequential layer bottlenecks. The Tailscale Operator DNS path was corrected after discovering DNSConfig only resolves operator-managed proxy names. The Infisical EU endpoint was discovered (setup.sh and ESO were configured with the wrong region endpoint). Auth race against Dex documented as TD-026.
[2026-05-09] review | tailscale + tazlab-k8s post Tailscale Operator deployment
Review pass after Tailscale Operator deployment (2026-05-08). Updated stale wiki pages to reflect live cluster state.
Updated:
entities/tailscale.md— K8s Operator da Planned a Deployed,k8s_operatorOAuth aggiornato, Quick Facts correttitopics/tazlab-k8s-flux-dag.md— 12→15 Kustomizations, aggiunto ramo Tailscale (3-layer DAG), livelli rinumerati (da 4 a 5)details/tazlab-k8s-flux-kustomizations-detail.md— inventory da 12 a 15, DAG diagram con ramo Tailscale, 3 nuove schede (infrastructure-tailscale, operators-tailscale, tailscale-dns), wait table aggiornatatopics/tailscale-vault-contract.md— sezione “planned: DNS resolution” → “deployed 2026-05-08: DNS relay”details/tailscale-magicdns-detail.md— gap risolto dal DNS relay, documentato flusso pod DNS e limitazione DNSConfigAGENTS.ctx/crisp/CONTEXT.md— registry:10-operator-dns-resolutionda Draft a Completed
Why it matters: La wiki diceva ancora “Planned”/“Draft”/“12 Kustomizations” mentre il Tailscale Operator è deployato su cluster dal 2026-05-08 con 3 nuove Kustomization e DNS relay funzionante. Il review allinea la documentazione alla realtà del codice.
[2026-05-15] restructure | new Hermes Agent section
Created the Hermes Agent section for the new Proxmox LXC deployment (ephemeral-castle/hermes/). Hermes was implemented after the last wiki survey (2026-04-29) and had no wiki coverage.
Created:
entities/hermes.md— Entity hub with repo structure, quick facts, canonical pages, relationshipstopics/hermes-lxc-deployment.md— Level 2 topic: architecture, design decisions, iteration history, storage model, lifecycle timing
Updated:
entities/ephemeral-castle.md— Addedhermes/to repository structure, added hermes relationshipwiki/index.md— Added hermes entity entry and new “AI Agent Services” topic section
[2026-05-15] update | Hermes Agent — Pet vs Cattle persistence pattern
Updated wiki to reflect the final persistence architecture: CT 999 (pet) owns the 10G volume, CT 105 (cattle) mounts it via API. Replaced backup/restore references with the Pet vs Cattle pattern.
Pages updated:
entities/hermes.md— Full rewrite with Pet vs Cattle architecture, both CT IDs, research assets referencestopics/hermes-lxc-deployment.md— Full rewrite: new lifecycle timings (137s), research history, API call references
[2026-05-16] detail | tazpod code structure page
Created a new Level 3 detail page documenting the tazpod Go source code structure after a full source read pass.
Created:
details/tazpod-code-structure-detail.md— Package tree, file-by-file function inventory (all 8 files), dispatch table, key call chains (up,smartEntry,unlock,save+push), cross-file dependencies, 10 code-encoded architectural decisions, known issues table
Updated:
entities/tazpod.md— Added Code Structure Detail to CLI & Container Lifecycle canonical pagestopics/tazpod-architecture.md— Added child link to Code Structure Detailwiki/index.md— Added new detail entrywiki/log.md— this entry
Why it matters: The wiki had 9 Level 3 detail pages and 7 Level 4 reference pages for tazpod covering lifecycle, vault, config, crypto, S3, CI, smart entry, and dotfiles, but no page documented the actual Go code structure itself — how main.go dispatches, how the 8 files relate, what the internal packages contain, and what the full call chains look like. This page fills that gap as the definitive code-navigation map.
[2026-05-20] forge | tazpod
Forged the TazPod Development & Hardening context.
Created:
wiki/contexts/tazpod-context.md— Pre-built operational context file.
Updated:
wiki/contexts/INDEX.md— Added the new context to the catalog index.wiki/log.md— this entry.
Why it matters:
This establishes the tazpod development and hardening context as a self-contained brief, indexing all relevant wiki pages, memory items, open technical debts, and CRISP project dependencies to make it immediately operational for execution.
[2026-05-20] update | tazpod v0.3.30 — Antigravity CLI and persistence
Updated:
entities/tazpod.md— Current version bump to 0.3.30.details/tazpod-dotfiles-detail.md— Added.antigravityand.antigravityclito the persistent symlinks table.wiki/log.md— this entry.
Why it matters:
TazPod was updated to v0.3.30 by adding the Antigravity CLI to the AI Docker layer (Dockerfile.ai) and extending .bashrc bootstrap script to mount .antigravity (settings/extensions) and .antigravitycli (trusted workspace registrations) folders persistently under /workspace/.tazpod/. This ensures the AI agent state is preserved across container restarts.
[2026-05-20] update | tazpod vault S3 history design
Updated wiki pages with the tazpod-vault-s3-history CRISP project design: S3 history key structure, content-hash skip logic, retention policy (N=50), TD-022 fix (vaultFilePath dual-path), pull –index, and list vault-history.
Updated:
details/tazpod-s3-detail.md— added History Copies section, new S3 Methods table, fixed TD-022 section, updated Vault Object Contractdetails/tazpod-vault-lifecycle-detail.md— updated push/pull/save sections with content-hash, –index, history/retentiondetails/tazpod-sync-daemon-detail.md— added note that history is manual-only, daemon does not produce history
Why it matters: Documents the full design for the upcoming feature, including the content-hash skip trick (hash plaintext before encryption to avoid salt/nonce noise) and the dual-path resolution that works from both container and host.
[2026-05-20] forge | lushycorp-vault
Forged the LushyCorp Vault Runtime operational context.
Created:
wiki/contexts/lushycorp-vault-context.md— Pre-built operational context for Hetzner Vault runtime.
Updated:
wiki/contexts/INDEX.md— Added the new context to the catalog index.wiki/log.md— this entry.
Why it matters: This establishes the LushyCorp Vault runtime context as a self-contained brief, indexing all relevant wiki pages (vault architecture, bootstrap & restore, create/destroy lifecycle, Tailscale contract), memory items (chronicle entries for Phase 1/2, TD-016/020/021/022), and CRISP project dependencies (09-vault-k8s-integration-prep, 15-tailscale-operator-hardening, 10-operator-dns-resolution) to make it immediately operational for execution.
[2026-05-21] update | wiki allineamento Vault — 09 Phase 2
Updated 4 pages and the index after verifying prerequisites for 09-vault-k8s-integration-prep Phase 2:
Updated:
wiki/topics/tailscale-vault-contract.md— rimosse sezioni obsolete (relay DaemonSet, IP-only path). Aggiunta architettura ExternalName egress proxy, CoreDNS Disable&Replace, Migration Direction con Phase 1 ✅ / Phase 2 🔄 / Phase 3.wiki/details/tailscale-magicdns-detail.md— sostituita sezione relay DaemonSet con ExternalName + DNSConfig (architettura corrente). Aggiunto CoreDNS Hardening su Talos, nota “Previous Approach (decommissioned)”.wiki/entities/hashicorp-vault.md— reso operativo: tabella stato layer, CRISP projects table, link a tutti i topic correlati.wiki/topics/ephemeral-castle-hetzner-vault-runtime.md— “converging toward” → “converged” (Phase 1 completata).
Added to index:
entities/hashicorp-vault.md— mancante dalla sezione Entities.
Why it matters: the wiki now riflette l’architettura corrente (ExternalName egress proxy, CoreDNS Disable&Replace) invece del relay DaemonSet obsoleto, e documenta lo stato Phase 2 appena sbloccato.
[2026-05-28] update | Bootstrap engine restructured — CoreDNS user-managed, Vault-native secrets, one-shot cluster
Updated 2 wiki pages to reflect the bootstrap restructuring (2026-05-28):
Updated:
entities/ephemeral-castle.md— Updated repo structure description (engine layer now includes CoreDNS + vault secrets + direct file tokens), added TD-028/029/030 to Known Issues.topics/ephemeral-castle-rebirth-protocol.md— Full rewrite of the bootstrap flow: Talos patches baked into proxmox-talos module, engine layer details (CoreDNS, vault secrets, github/tailscale tokens), bootstrap deadlock avoidance table, PGO sync step, final convergence timing.
Key content added:
- CRITICAL LESSON documented:
machine.certSANs≠cluster.apiServer.certSANs. Wrong path triggers trustd PKI regeneration causing cluster deadlock. - Bootstrap deadlock table with 6 fix scenarios.
- Bootstrap order: platform → engine (CoreDNS+vault+secrets) → networking+gitops → storage → PGO sync → Grafana.
Why it matters: The wiki now describes the actual one-shot bootstrap process that requires zero manual intervention, replacing the old process that had circular dependencies and manual secret creation steps.
[2026-05-28] update | Tailscale DNS container fixes — stateful filtering, auto-start, update-hosts
Updated 3 wiki pages to reflect the Tailscale DNS fixes in the TazPod container (2026-05-27→2026-05-28):
Root cause documented: Tailscale v1.66+ stateful filtering drops UDP DNS from Docker bridge interfaces to MagicDNS (100.100.100.100). Fix: --stateful-filtering=false, --accept-dns=false, update-hosts.sh.
Updated:
references/tailscale/start-sh.md— Full rewrite aligned with actualstart.sh: stale process cleanup,--stateful-filtering=false,--accept-dns=false,update-hosts.shcall. Added changelog table.topics/tailscale-operator-connectivity.md— Removed “no auto-start mechanism” statement. Added DNS root cause section, auto-start via.bashrc,update-hosts.shreference. Updated TUN mode section with all DNS flags.details/tazpod-dotfiles-detail.md— Corrected Tailscale Auto-Start section with actualif/elselogic: first shell launchesstart.sh, second shells runupdate-hosts.sh. Added DNS fix chain note.
Why it matters: The wiki now correctly documents the current Tailscale DNS architecture inside the TazPod container instead of the outdated userspace-only, no-auto-start state. Operators and agents can understand the stateful filtering root cause, the fix chain, and the auto-start behavior from the wiki without reading the scripts.
[2026-05-22] update | wiki Vault migration completata — Infisical come legacy
Updated 3 pages to reflect completion of Vault migration and Infisical retirement:
Updated:
wiki/topics/tazlab-k8s-secrets-mapping.md— riscritta: tabella con Vault paths reali, two-store model (Vault primary, Infisical legacy). Rimossa sezione bootstrap Infisical.wiki/entities/infisical.md— riscritta: da “current backend” a “superseded by Vault, legacy fallback”. Aggiunta sezione decommission timeline.wiki/details/tazlab-k8s-external-secrets-detail.md— aggiornata: tabella with two stores (Vault primary, Infisical legacy).wiki/entities/hashicorp-vault.md— consumer migration → Completed.
Why it matters: future agents reading the wiki will now see Vault as the primary backend, not Infisical.
[2026-05-24] lint | Infisical/Zero-SOPS stale references pulite su 23 pagine
Trigger: Allineamento wiki a codice dopo sessione CRISP project 15 e ricerca Vault Agent Injector.
Contesto: 23 pagine wiki ancora citavano Infisical come backend attivo. Ricerche agent sui repo live hanno confermato:
env.hclnon ha piú variabili Infisical (ora usaget_env()da~/secrets/)secrets-fetchermodule non usa Infisical (legge solo env vars)- Terragrunt layers non creano piú provider Infisical
- ClusterSecretStore
tazlab-secretsha credenziali vuote — nessun ExternalSecret lo referenzia - SOPS/age non sono mai stati in uso nel codice attuale
Pagine corrette (lista completa in appendix):
Why it matters: Future agent che legge wiki vede Vault come backend attivo. Informazioni allineate al codice live.
Pages Updated
entities/hashicorp-vault.md— CRISP status 10/12 Completed, 22 ExternalSecrets, Tailscale Operator exposure completata, Vault Agent Injector futureentities/tazlab-k8s.md— backend da “Infisical (→ Vault)” a “Vault”entities/ephemeral-castle.md— layer 1 da “Infisical” a “bootstrap credentials (~/secrets/)”entities/infisical.md— da “superseded in progress” a “decommissioned”topics/tazlab-secret-and-identity-flow.md— riscritta: layered model Level 1/2/3, Vault backend, Infisical legacy, future Agent Injectortopics/tazlab-k8s-bootstrap-logic.md— Infisical → Vaulttopics/tazlab-k8s-ingress-and-auth.md— Infisical → Vault per wildcard TLStopics/tazlab-k8s-operators-inventory.md— ClusterSecretStore e Tailscale OAuth source da Infisical a Vaulttopics/tazlab-k8s-configs.md— “Infisical-backed” → “Vault via ExternalSecret”topics/ephemeral-castle-architecture.md— Infisical → env vars da ~/secrets/topics/ephemeral-castle-repository-map.md— Infisical-backed → bootstrap ~/secrets/topics/ephemeral-castle-proxmox-talos-foundation.md— Infisical → ~/secrets/topics/ephemeral-castle-cluster-bootstrap.md— Infisical → operator env varstopics/tazlab-infrastructure-tech-stack.md— Infisical → Vaultdetails/tazlab-k8s-external-secrets-detail.md— tabelle “Infisical Key” → “Vault Path”. Aggiunte voci: Tailscale, Grafana, AWS backrest. Aggiunto future Agent Injector.details/tazlab-k8s-cert-manager-detail.md— Infisical → Vault pathdetails/tazlab-k8s-dex-oauth2-detail.md— Infisical → Vaultdetails/tazlab-k8s-hugo-wiki-detail.md— Infisical → Vaultdetails/tazlab-k8s-openclaw-detail.md— Infisical → Vaultdetails/ephemeral-castle-terragrunt-layers-detail.md— Infisical → operator env vars, ClusterSecretStore → Vaultdetails/ephemeral-castle-terraform-modules-detail.md— Infisical → operator environmentreferences/ephemeral-castle/env-hcl.md— riscritta: no Infisical vars, get_env() source tablereferences/tazlab-k8s/external-secret-example.md— name datazlab-secretsatazlab-secrets-vaulthomepage.md— “Infisical transizionale” → “Vault primario”
[2026-05-27] update | Tailscale service exposure + bashrc auto-start
What changed
- Created
wiki/topics/tailscale-service-exposure.md— 6 services migration from MetalLB/Traefik to Tailscale Ingress/LoadBalancer - Updated
wiki/references/tazpod/bashrc-full.md— added tailscale auto-start block with setsid - Updated
wiki/index.md— added tailscale-service-exposure to Tailscale Networking section
Why it matters
Service exposure via Tailscale is now the canonical path for internal services. Documentation was missing the migration details, design decisions (D1-D4), and the correct tailscale startup configuration.
[2026-05-27] review | Full wiki alignment (tailscale area)
What changed
- Updated
wiki/entities/tailscale.md— OAuth scopes updated (services+auth_keys), TD-020 closed, DNSConfig CR story corrected, Service Exposure link added - Updated
wiki/details/tailscale-oauth-client-detail.md— added k8s_operator client with services scope, credential storage for both clients, key minting via tazpod-tailscale-up - Updated
wiki/details/tailscale-acl-policy-detail.md— added tag:k8s, tag:internal-apps, new ACL rules for service exposure, fixed “planned” labels to active - Updated
wiki/topics/tailscale-iac-management.md— added k8s_operator OAuth client definition with services scope
Pages OK
- entities/tailscale.md — now reflects current state (TD-020 closed, OAuth scopes, exposure)
- details/tailscale-oauth-client-detail.md — both clients documented, correct scopes
- details/tailscale-acl-policy-detail.md — all tags and rules current
- topics/tailscale-iac-management.md — k8s_operator added
- topics/tailscale-service-exposure.md — newly created (this batch)
Pages with stale info (fixed)
- entities/tailscale.md: OAuth scope “devices” → “devices, auth_keys, services”
- entities/tailscale.md: TD-020 open → closed (replaced with TD-025)
- details/tailscale-acl-policy-detail.md: missing tag:k8s-operator, tag:k8s, tag:internal-apps
- details/tailscale-acl-policy-detail.md: “planned” labels on active rules
- topics/tailscale-iac-management.md: missing k8s_operator client
Cross-area findings
- wiki/docs/ directory missing archivist-procedure.md (referenced by AGENTS.ctx/wiki/CONTEXT.md but file lives in AGENTS.ctx/wiki/docs/)
[2026-05-27] update | Tailscale TUN fix + .bashrc auto-start
references/tailscale/start-sh.md: updated daemon start with TUN auto-detect (kernel-native when/dev/net/tunavailable, userspace fallback otherwise)references/tazpod/bashrc-full.md: replaced old blockingtazpod-tailscale-upcall with non-blockingtools/tailscale/start.shviasetsid, singleton socket check, visible rocket messagedetails/tazpod-dotfiles-detail.md: added Tailscale Auto-Start section with code block and timing notesentities/tazpod.md: bumped current version from 0.3.30 → 0.3.35entities/tailscale.md: updated operator daemon description to referencetools/tailscale/start.shwith TUN detection
[2026-05-29] update | ProxyGroup kube-apiserver + Vault DB engine
Updated:
entities/hashicorp-vault.md— added Database Engine, JWT auth, ProxyGroup, VM route acceptance, container detailstopics/tailscale-service-exposure.md— added ProxyGroup section, VIP routing note, –accept-routes requirement
Context: Replaced LoadBalancer Service with ProxyGroup for K8s API server exposure. Enabled Vault Database Secret Engine for PostgreSQL dynamic credentials. Configured Vault JWT auth with jwks_url. SSH key injected via Hetzner rescue mode. All 5 Mnemosyne memories saved.
[2026-05-29] update | Cross-check CRISP plan vs wiki — fixes applied
Cross-checked the CRISP plan for 10-vault-agent-injector-phase1 against the wiki. Found and fixed:
- Cilium assumption removed (cluster uses Flannel, confirmed by wiki)
- CoreDNS IP corrected from old relay
10.96.0.101to current DNSConfig architecture - Flux DAG dependsOn corrected to
infrastructure-tailscale-dns(DNS readiness before injector) - PLAN Stages 1-3 marked as completed (work done in session)
- Wiki entities updated:
tazlab-k8s.md(K8s version, CNI),ephemeral-castle.md(K8s version, CNI, oidc-reviewer, JWKS endpoint)
[2026-05-29] update | Stage 4-5 completed — Vault Agent Injector + Grafana migration
Updated:
entities/hashicorp-vault.md— add Vault Agent Injector status, Grafana migration, known bugstopics/tailscale-service-exposure.md— already updated in earlier session
Key events:
- Vault Agent Injector deployed (chart 0.32.0, injector-only, JWT auth via ProxyGroup)
- vault-k8s bug #660 workaround (auth-config-path annotation)
- Grafana migrated to dynamic Vault credentials (GF_DATABASE_USER__FILE / __PASSWORD)
- ExternalSecret tazlab-db-pguser-grafana removed
- Sidecar disabled via agent-pre-populate-only (read-only FS on Talos)
- All credentials verified working
[2026-05-29] update | Vault Agent Injector Pattern documentation + Followup completion
Created:
topics/vault-agent-injector-pattern.md— standard annotation set, Talos-specific requirements, bug #660 workaround, troubleshooting
Updated:
entities/hashicorp-vault.md— add Injector Pattern reference
Context: Completion of 11-vault-agent-injector-phase1-followup project.
[2026-06-01] update | Vault JWT auth fix, monitoring sbloccato, vault-k8s-config Ansible playbook
What changed
- Vault JWT bound_issuer corretto: Aggiornato da singolo issuer a concatenazione multi-issuer richiesta da Talos:
"https://lushycorp-k8s.magellanic-gondola.ts.net:6443,https://kubernetes.default.svc.cluster.local" - Vault database engine: Password
tazlab-adminaggiornata dopo destroy+create (PGO genera nuova password) - grafana-sa ServiceAccount: Creata e aggiunta come manifest Flux in
tazlab-k8s/infrastructure/operators/monitoring/grafana-sa.yaml - Monitoring stack: kube-prometheus-stack v61.3.1 installato e funzionante (Grafana 3/3, Prometheus 2/2, kube-state-metrics, node-exporter)
- Vault K8s config migrata in Ansible: Creato playbook
vault-k8s-config.yml(stagek8s_config) che configura JWT auth + database engine viakubectl execsul podvault-configurator. Sostituisce shell inline increate.sh - TD-034: Aggiornato a “In progress” con nota sulla risoluzione parziale
Pages created
ephemeral-castle/runtimes/lushycorp-vault/hetzner/ansible/vault-k8s-config.ymlephemeral-castle/runtimes/.../roles/vault-runtime/tasks/k8s-config.ymltazlab-k8s/infrastructure/operators/monitoring/grafana-sa.yaml
Why it matters:
Il cluster è pienamente operativo dopo destroy+create con monitoring attivo. Config Vault in Ansible idempotente. grafana-sa gestita da Flux. Prossimo destroy+create applica tutto automaticamente.
[2026-06-01] update | One Shot Cluster raggiunto — 14m 15s full ciclo
What changed
- One Shot Cluster: Quarto ciclo destroy+create (full da zero) completato in 14m 15s senza interventi manuali.
- Fix finali: VAULT_ANSIBLE_DIR usa SCRIPT_DIR, Ansible retry loop (until/retries=30/delay=10) su database config per gestire finestra password PGO post-restore.
- Stato: Flux 19/19, VSO 10/10, Grafana 3/3, DB 4/4.
Pages updated
ephemeral-castle/clusters/tazlab-k8s/proxmox/create.sh— path fix + PGO wait miglioratoephemeral-castle/.../roles/vault-runtime/tasks/k8s-config.yml— retry loop su database config
Why it matters:
Cluster completamente automatizzato. Prossimi cicli destroy+create non richiedono interventi.
[2026-06-05] forge | ephemeral-castle context
What changed
Created a pre-built operational context for the full ephemeral-castle infrastructure layer.
Pages created
wiki/contexts/ephemeral-castle-context.md— Full context: scope, wiki reading list, memory/debts/CRISP references, repo structure, execution hints, known pitfalls, open questions
Pages updated
wiki/contexts/INDEX.md— Added ephemeral-castle entry to context library index
Why it matters:
Provides a self-contained working brief for any agent working on the infrastructure layer (Proxmox, Talos, Terragrunt, Vault runtime, Tailscale, Hermes) without requiring preliminary research across wiki, memory, and CRISP.
[2026-06-07] cycle | 9th destroy+create — terragrunt cache fix, one-shot terragrunt phase
What changed
5th destroy+create cycle after Ansible→Terraform migration. Terragrunt part now fully one-shot (secrets → vault-jwt → engine → platform → parallel layers). Flux convergence needs manual post-steps for database + monitoring.
Bugs fixed
- Terragrunt
-reconfiguremancante → engine falliva dopo cache cleanup - Namespace engine mancanti (tailscale, external-secrets, tazlab-db)
- Dex namespace in operator wrong dir (VSO bloccato)
- Create.sh exit code mascherato da
echo "EXIT_...:$?" - Core kustomization riferiva operator dir eliminate (dex, tazlab-db)
Still manual (post-Flux)
- Privilege enforcement (ALTER ROLE) per DB password sync
- vault-db-config apply con password aggiornata
- VSO VaultDynamicSecret reconcile forzato
Why it matters
Terraform/Terragrunt phase ora one-shot anche dopo cache cleanup. 9 interventi manuali → 2 interventi manuali.
[2026-06-07] milestone | First true one-shot destroy+create (9th cycle)
What happened
Ansible->Terraform migration completed. Cycle 9 achieved first one-shot cluster bootstrap: create.sh exit code 0, zero manual interventions, 83 pods in 8m30s.
Key discoveries
- Post-Flux is redundant: vault-db-config applied before platform (persistent Vault layer), passwords sourced from secrets-fetcher (same root for engine and vault-db), VSO auto-reconciles VaultDynamicSecret. No ALTER ROLE, no VDS annotation, no smoke test needed.
- VSO reconciliation: VSO reconciles grafana-dynamic-creds within minutes without any annotation trigger. With vault-db-config applied before VSO starts, the refresh is fast enough.
- kubectl wait pod master: kubectl wait for=condition=Ready pod -l role=master fails IMMEDIATELY if no pod matches the label. Must poll for pod existence first.
- Terragrunt cache cleanup: extra_arguments init_reconfigure + disable_dependency_optimization = true required to survive cache cleanup.
Result
Total time: 8m30s. All 21 Flux kustomizations, Blog, Wiki, Grafana, Prometheus, DB, Mnemosyne, pgAdmin fully operational.
[2026-07-05] restructure | PKI Vault project wiki sweep
Updated the wiki to reflect PKI Vault project changes (2026-07-01 to 2026-07-03):
- VSO active as primary secret delivery operator, ESO dormant, Vault Agent Injector removed
- Infisical fully decommissioned, all entity pages updated to decommissioned status
- cert-manager ClusterIssuer renamed from
tazlab-issuertoletsencrypt-issuer - Blog and wiki now use Let’s Encrypt cert-manager Certificates (blog-tazlab.net-tls with 4 domains, wiki-tazlab.net-tls)
- Internal ingress TLS uses Vault PKI (*.tazlab.net) via VSO VaultPKISecret (
vault-pki-tls) - Database mTLS documented: customTLSSecret + customReplicationTLSSecret + pg_hba cert auth for Grafana
- Grafana mTLS documented: VaultPKISecret, extraInitContainers, ssl_mode/GODEBUG=tlskyber=0
- PKI 3-tier architecture (Offline Root GPG → Intermediate → Generated) documented on Vault runtime pages
- 8 PKI roles + 8 JWT policies for per-namespace auth documented
- VSO Flux DAG added (infrastructure-operators-vso → infrastructure-vso-secrets → infrastructure-tls)
- Vault Agent Injector pattern page marked as historical
- Known issues updated: TD-041, TD-042, TD-043 added where applicable
- Vault runtime architecture page expanded with PKI secret engines section
- Zero-trust architecture updated: Infisical → Tailscale OAuth
- Overview.md refreshed with current coverage
- All pages: stale Infisical, ESO-primary, VAI, wildcard-tls references corrected
Updated:
- Entities: hashicorp-vault, tazlab-k8s, ephemeral-castle, infisical
- Topics: secret-flow, ingress-auth, secrets-mapping, operators-inventory, operators, flux-dag, bootstrap-secrets, configs, conventions, structure, repo-mapping, layers, monitoring, system-map, VAI-pattern, tailscale-exposure, tailscale-vault-contract, vault-runtime-architecture, vault-bootstrap-restore
- Details: cert-manager, external-secrets, monitoring, tazlab-db, dex-oauth2, mnemosyne-deployment, terraform-modules, create-destroy, ansible-scripts, systemd, magicdns
- Other: zero-trust-architecture, lushycorp-vault-context, overview, homepage, index
Why it matters:
The wiki now correctly reflects the post-PKI project state: VSO-based secret delivery, Let’s Encrypt + Vault PKI TLS, database mTLS, and Infisical fully retired. This prevents agents from learning outdated secret-flow or TLS architecture from the wiki.
[2026-07-05] fix | VaultPKISecret template bug discovered and fixed
During a routine deploy test, discovered that VaultPKISecret transformation.templates with excludeRaw:true was missing tls.crt and tls.key mappings — only ca.crt was templated. This caused VSO to produce invalid kubernetes.io/tls secrets on certificate renewal (missing required tls.crt/tls.key fields). Fixed by adding tls.crt and tls.key templates to all 6 VaultPKISecrets. See chronicle 2026-07-05 for details.
[2026-07-11] update | PKI/mTLS alignment
Updated wiki pages after PKI and mTLS project completions:
entities/hashicorp-vault.md: Vault Database Engine marked as removed, CRISP projects updated with PKI entries, mTLS status added.topics/tazlab-secret-and-identity-flow.md: Updated to reflect VSO as primary, ESO dormant, gopass migration in progress.topics/tazlab-k8s-secrets-mapping.md: Added VaultPKISecret table with 6 client/server certs, updated VSO section, noted Grafana DB password no longer used.details/tazlab-k8s-tazlab-db-detail.md: Expanded mTLS section to cover all 3 apps (Grafana, mnemosyne, pgAdmin), added pg_hba rules, Vault DB engine removal.details/tazlab-k8s-monitoring-detail.md: Fixed Grafana ssl_mode fromdisabletorequire, added note about grafana-dynamic-creds removal.=== wiki/log.md append ===
2026-07-14: Wiki update for gopass migration
- Updated: entities/tazpod.md (gopass architecture), topics/tazpod-architecture.md (simplified), topics/tazpod-vault-security.md (deprecated), topics/tazpod-nomadic-workflow.md (simplified), topics/tazlab-secret-and-identity-flow.md (gopass), operations/tazpod-cli-reference.md (deprecated vault commands)
- Created: topics/tazpod-gopass-migration.md (new)
- Deprecated: details/tazpod-vault-lifecycle-detail.md, details/tazpod-sync-daemon-detail.md, details/tazpod-crypto-detail.md, details/tazpod-s3-detail.md, topics/tazpod-sync-daemon.md
- Updated: entities/hashicorp-vault.md (Infisical refs), entities/infisical.md (historical banner)
- Updated: wiki/index.md (added Gopass Migration section)
[2026-08-12] update | Hermes Agent redesign — LXC → KVM VM 501
Hermes Agent migrated from LXC container (CT 105, Debian 12) to a dedicated KVM VM (VM 501 hermes, Ubuntu 26.04, 4 vCPU/8 GB) in a standalone repo github.com/tazzo/hermes-agent. CRISP project hermes-agent-redesign completed (report: skills/memory/reports/2026-08-12_hermes-agent-vm-redesign.md).
Updated pages:
entities/hermes.md— Full rewrite: VM 501 KVM architecture, standalone repo, lvrename orphan persistence pattern, dashboard auth (basic auth + scrypt), gopass secret paths, key discoveries from destructive tests.topics/hermes-vm-deployment.md— NEW: current KVM deployment architecture (replaces LXC page).topics/hermes-lxc-deployment.md— Marked SUPERSEDED (CT 105 destroyed), kept for historical reference.entities/ephemeral-castle.md— Removedhermes/directory from structure, updated relationship (moved out to standalone repo).contexts/ephemeral-castle-context.md— Removed Hermes LXC references, updated CRISP registry row (project renamed tohermes-agent-vm-redesign, completed).contexts/INDEX.md— Updated ephemeral-castle context entry.wiki/index.md— Updated hermes entity description + added new topic under AI Agent Services section.
[2026-08-30] update | Hindsight platform documented + memory migration status
Documented the new Hindsight multi-agent memory platform (Vectorize.io, deployed 2026-08-28) and the in-progress legacy memory migration from Mnemosyne, following the 4-level model.
Created:
- entities/hindsight.md (Level 1 hub — quick facts, manifest tree, starting pages, relationships)
- topics/hindsight-architecture.md (Level 2 — 3-pod stateless design, zero-PVC rationale, bank model, LLM/embedding quota pacing, migration protocols mark-before-advance + done=searchable, deep-verification findings)
- details/hindsight-deployment-detail.md (Level 3 — file-by-file manifest map, API env contract, 4 documented gotchas, PGO database chain, VSO secret/PKI recipe, digest pinning, NetworkPolicy)
Updated:
- entities/mnemosyne-mcp-server.md — coexistence section (read-only legacy layer until migration sign-off)
- concepts/tazlab-knowledge-layers.md — added the Hindsight layer, mnemosyne marked read-only during migration
- index.md — hindsight entity/topic/detail entries added
Why it matters: Hindsight becomes TazLab’s shared searchable memory for all agents; the wiki now records its architecture, the exact deployment contract (env collision, control-plane port, pgvector superuser requirement, fsGroup), the bank design ratified by the memory-migration-hindsight project, and the live migration state (137 items imported, 2026-01 batch in progress) so future agents do not rediscover the year-hallucination audit or re-hit the embedding quota wall blind.
[2026-09-10] review | two-month alignment sweep (2026-07-10 → 2026-09-10)
What changed
Full review of the wiki against memory (chronicle + past-summary + debts) and live repositories, covering the last two months of TazLab activity. Four clusters of changes:
- Skills migration (2026-07-29) — 9 AGENTS.ctx-era pages reframed to the OMP skills system: entities/agents-ctx.md (now describes the /workspace/AGENTS.md loader + SKILLS/ with the 10-skill registry and legacy not-migrated areas), context-system, memory-system, crisp-methodology, pi-council + wiki-archivist (marked legacy/not migrated), archive-flow / crisp-workflow / memory-files details; cross-references fixed in homepage, overview, knowledge-layers, system-map, repository-map, operating-model, wiki-tazlab-net, mnemosyne-mcp-server, contexts/INDEX, blog-post-workflow-detail, mnemosyne-mcp-debts-detail, crisp-program-map, secret-and-identity-flow, terragrunt-layers, lxc-storage-crisp-design, tazpod-dotfiles-detail, bashrc-full.
- tazlab-k8s cluster area — ESO→VSO dex/oauth2 migration (3 VaultStaticSecrets, static dex ConfigMap, zero ExternalSecrets left, ESO truly dormant), homepage app topic page NEW (2026-08 outage: unpinned homepage:latest → v2.0.0 auth gate rejected kubelet probe Host; fixes: pin v2.1.2, probe Host header, image automation, cloudflare-ddns pin 1.17.0), Alertmanager no-receivers state (TD-057, correct key alertmanagerSpec.configSecret, reverted fix b0b46bc), 21 Flux kustomizations, homepage image-automation pipeline #4 (ghcr + semver), repo made public 2026-07-16 after git-filter-repo history purge. Pages: entities/tazlab-k8s, monitoring topic + detail, dex-oauth2-detail, external-secrets-detail, secrets-mapping, image-automation topic + detail, flux-dag, operators-inventory, flux-kustomizations-detail, NEW topics/tazlab-k8s-homepage.
- Hermes — entities/hermes.md + hermes-vm-deployment.md extended with the five post-2026-08-12 additions: hermes-restart.service (CLI restart not bypassable — hardcoded root guard), Caddy research publisher (:8080, VPN-only, linger), hermes-chrome.service (durable headless Chrome, CDP 127.0.0.1:9222, connect_over_cdp only), Samba CIFS mount from CT 107 (gopass-sourced creds, automount), VM-side refurb collector (T14/L14/X13 Gen 2 filter, cron 2 days).
- Hindsight section — NEW topics/hindsight-migration-status.md (Level 2): live import state 754 docs done (per-batch table from import-state.json), backlog (3 new-sep + 19 chronicle archives + 57 reports + 69 doctrine docs), TD-058 date-marker corruption closed permanently 2026-09-03 (sanitize_content() guard, re-retain 23/224, resume via td058_restrain.py, ~22% null occurred_start as residual limitation), remaining known issues. entities/hindsight.md + hindsight-architecture.md updated to the half-migrated framing.
Why it matters
The wiki was last aligned on 2026-08-30 (Hindsight) and described a pre-migration context system, an ESO-era cluster, a homepage with no incident history, a Hermes VM without its post-August services, and no record of the tazlab-k8s public/history-purge event. Agents navigating the wiki would have learned obsolete secret delivery, obsolete skill-loading paths, and a stale migration state.
[2026-09-10] update | CT106 runtime + dsh Web UI documented; nginx reverse proxy retired
Added:
- details/tazpod-proxmox-runtime-detail.md (Level 3 — CT106
tazpod-proxmoxprovisioning viatazpod/runtimes/lxcwith the fullcreate.shphase list, Ansible layer inventory, the idempotency rules learned on 2026-09-10, the dsh Web UI service contract, the SSH-loopback access model with token/cookie lifecycle, and the legacy nginx + sync-daemon removal)
Updated:
- entities/tazpod.md — new “LXC Runtime (CT106)” section linking the runtime detail
- index.md — details entry for the CT106 runtime page
Why it matters: CT106 hosts the DeepSeek Harness Web UI, and until now the wiki had no page for that container at all. The detail records why dsh must stay bound to 127.0.0.1:3081 (privileged RPCs are pinned to the loopback origin: any reverse proxy returns HTTP 403 and silently degrades settings persistence), how remote access is meant to work (SSH port forward + one-time launch token → 30-day cookie), and the two leftovers that were removed the same day (nginx on :3080 and the restart-looping tazpod-sync.service with 10,117 restarts). It also captures the IaC traps that broke create.sh and the playbook for months — missing heredoc terminator, /workspace/... controller paths, authorized_key moved out of ansible-core, herdr vs hdr, and the .ssh directory→symlink refusal — so a future agent does not rediscover them, plus the cordis.patch.yml must-be-an-array gotcha that aborts dsh at boot.
[2026-09-10] update | Hindsight ingest fix + Flux DAG freeze root cause and hardening
Updated:
- details/hindsight-deployment-detail.md — fifth documented gotcha: OpenCode Go requires a stable
x-opencode-sessionper conversation (HTTP 400MissingSessionIDotherwise) and Hindsight’s ingest reports nothing to the caller, so every ingest of the migration window was silently lost; fix isHINDSIGHT_API_LLM_DEFAULT_HEADERSon api + worker, with the shared-prompt-cache trade-off recorded - details/tazlab-k8s-flux-kustomizations-detail.md — new “DAG Freeze: Root Cause and Hardening” section: 13/23 Kustomizations stuck in
DependencyNotReadywith nothing actually failing, single root object, missed dependency-ready requeue; hardening = 15-minute intervals plus theflux-dag-watchdogCronJob (2-minute schedule, 3 passes, dedicated least-privilege RBAC, hardened container) verified by recovering a frozen DAG to 23/23
Why it matters: both failures were invisible. The Hindsight one silently discarded every memory ingested during the migration (the caller saw queued), and the Flux one left the platform half-applied for ~16 hours after a reboot while every dashboard stayed “green” because nothing was failing. Recording the mechanisms, the supported configuration knob and the residual alerting gap (TD-067, TD-057) means the next agent diagnoses both in minutes instead of re-deriving them — and knows that a frozen DAG is a Flux re-queue behaviour, not a broken workload.
[2026-09-14] update | dsh/CT106 nginx-era residue removed (TD-069 + TD-065 closed)
Updated:
- details/tazpod-proxmox-runtime-detail.md — legacy section rewritten:
/etc/dsh-tls/key material deleted from CT106, the LANisLoopbackvendor patch reverted by reinstalling the clean dsh package (verified in the source tree AND in the bundle actually served to the browser),patch-remote-settings.shdeleted,web-login-url.shrewritten to print the loopback tunnel URL, and the now-unusedinfra/dsh-tls/*secrets removed from the store
Why it matters: the loopback origin is what authorises dsh’s privileged RPCs, so a leftover LAN-IP patch is not cosmetic — it re-opens the exact bypass the SSH-tunnel design exists to close, and the helper scripts would have re-applied it or pointed operators at a dead login URL. The residue is now gone on this host, the detection method (grep the install tree and the served bundle) is recorded, and the last nginx TLS private key no longer lives on a machine that stopped needing it.
[2026-09-21] update | Pi package rename + retired root-context references removed
What changed
- references/tazpod/dockerfile-ai.md + topics/tazpod-image-hierarchy.md — Pi coding agent package updated from the deprecated
@mariozechner/pi-coding-agentto@earendil-works/pi-coding-agent, with a migration note (the old package’s last release is 0.73.1 and prints “please use @earendil-works/pi-coding-agent instead going forward”; the live CT106 container was already migrated bypi update). - Removed dead references to the retired root context tree across the wiki: every path that resolved under it (tailscale scripts, memory files, CRISP projects, per-area
CONTEXT.mdfiles) was repointed to the liveSKILLS/...path or dropped. Pages touched: entities/agents-ctx.md, entities/infisical.md, entities/wiki-tazlab-net.md, entities/hermes.md, index.md, overview.md, concepts/tazlab-knowledge-layers.md, contexts/INDEX.md, docs/tazlab-integration.md, README.md, and the topics/details/operations pages for ephemeral-castle, tailscale, tazpod, tazlab-cluster-delivery-flow, tazlab-flux-dag, tazlab-crisp-program-map, tazlab-k8s-bootstrap-secrets, tazlab-repository-map, tazlab-secret-and-identity-flow, tazlab-system-map, mnemosyne-mcp-debts, blog-post-workflow, blog-content-structure, hermes-lxc-deployment, agents-ctx-*. - references/tazpod/bashrc-full.md — the quoted
.bashrctailscale block synced to the live file, which already uses/workspace/SKILLS/tools/tailscale/. - index.md — the explicitly-retired pages (
pi-council,wiki-archivist) moved under a labelled “Legacy, retired” grouping;contexts/marked a legacy static catalog. - log.md — banner added at the top noting that pre-2026-07-29 entries reference the retired tree (append-only history kept verbatim).
Why it matters
The retired root context tree no longer exists on disk, so every one of those paths was a dead link pointing agents at files that are not there. The Pi reference documented a deprecated package, so any rebuild from the wiki’s own guidance would have pinned the frozen 0.73.1 release. The wiki now points only at live SKILLS/... paths and records the rename, so a reader following any path lands on a real file.
[2026-09-24] update | teaching.tazlab.net documented; stale site TLS/ExternalSecret claims corrected
What changed
Documented the new didactics surface at teaching.tazlab.net (CRISP project teaching-tazlab-net), and corrected two site detail pages that still described the retired ExternalSecret era.
Created:
details/tazlab-k8s-teaching-detail.md(Level 3) — namespaceteachingand the manifest map; the Deployment/Service contract (port 8080, non-root 10001, read-only rootfs +/tmpemptyDir, startup/readiness/liveness probes, 200m/256Mi → 2/512Mi); the environment contract including theoptional: trueOPENCODE_API_KEY; exposure (Traefik main Ingress + Certificateteaching-tazlab.net-tlsvia ClusterIssuerletsencrypt-issuer, plus the separate web-only redirect Ingress and why a redirect middleware on the sites’ HTTPS-only router would be a no-op, with the ACME solver-priority reasoning); the Vault-deliveredOPENCODE_API_KEY(VaultStaticSecret +vaultauthallowedNamespacesrequirement, failure mode); the runtime contract (uvicorn flags, proxy-headers trust, graceful shutdown, build stages); the logging contract (JSON lines, request_id, WARN on discarded items and degraded LLM, no secrets); image automation; the full delivery chain; DAG position; deviations from the site lane.
Updated:
details/tazlab-k8s-hugo-wiki-detail.md— the TLS row and the matching sentence no longer claim “wildcard-tls via ExternalSecret from Vaulttazlab-secrets-vault”: the wiki has its own cert-managerCertificate(wiki-tazlab.net-tls,letsencrypt-issuer, HTTP-01,Ready=Truelive), the repository holds zero ExternalSecrets, and the Vault-PKI wildcard is not used there. The DAG block now reads “creates ClusterIssuer letsencrypt-issuer — no ExternalSecrets exist”, and the manifest table listscertificate.yaml+kustomization.yamlso the TLS claim is checkable from the page itself.details/tazlab-k8s-hugo-blog-detail.md— the DAG block no longer claimsconfigs“creates github-external-secret for Flux automation”; it now states the ClusterIssuer and that Flux commits with theflux-systemGitRepository credentials.index.md— catalogue row for the new detail page under Details.
Why it matters
teaching.tazlab.net is a new public surface, and the first publicly exposed site whose runtime differs from the nginx pattern (Python service with probes and resource limits, read-only rootfs, and a Vault-delivered key of its own), so the exact contract — including the two silent failure modes, optional: true hiding a rejected VaultStaticSecret and a redirect middleware that cannot fire on an HTTPS-only router — now lives in the wiki instead of only in the CRISP project. The two corrected pages had been asserting removed mechanisms (ExternalSecret-delivered wildcard TLS, github-external-secret): verified live, there are zero ExternalSecret resources cluster-wide and both sites use cert-manager Certificate objects, so anyone following those pages would have gone looking for a resource that no longer exists.
[2026-09-25] decommission | dsh Web UI removed from CT106 and from the Ansible baseline
The DeepSeek Harness (dsh) Web UI was retired because it is no longer used. The removal touched three layers and is recorded here because the durability rules for this container (rebuild from Ansible, idempotent convergence) make it easy to resurrect a removed surface by accident.
Changed:
details/tazpod-proxmox-runtime-detail.md— the dsh Web UI and SSH-loopback access sections are gone, replaced by a “Removed” section listing what was deleted; the page also records the re-run assessment of the Ansible baseline (--check:ok=71 changed=2 failed=0) and the live container resources.index.mdandentities/tazpod.md— catalogue and link descriptions no longer advertise a dsh access model.tazpodrepository (runtimes/lxc): deletedansible/roles/tazpod/tasks/layer5-dsh.ymlandtemplates/dsh.service.j2, removed therestart dshhandler, thedsh_version/dsh_web_portdefaults, the layer import, the dsh checks increate.shand the dsh rationale interraform.tfvars.SKILLS/tools/dsh-web-access/(tunnel helper, TOOL.md, research note) and its row inSKILLS/tools/SKILL.md.
On the container: the dsh.service unit was stopped, disabled and deleted (daemon-reload), the @deepseek-ai/dsh package was removed from the tazpod user’s nvm prefix (520 packages), and /var/log/dsh-web.log was deleted. ~/.dsh/ (41 MB of profiles, settings, sessions) was deliberately left in place — it holds operator settings and history, so its deletion is a separate, explicit decision.
Why it matters:
A container that is rebuilt from Ansible converges to whatever the role says, so a removed service that still exists in the role — or a service still enabled on the live container — would come back on the next cycle. Removing it in both places is what makes the decommission durable; the replacement operator surface (Paperclip, CRISP project paperclip-lxc-deployment) is being designed to live on the same container, so the wiki must not keep describing the old one as the access path.
Correction (2026-09-25, same day). The entry above initially stated that ~/.dsh/ had been left in place. It was subsequently deleted on explicit operator instruction; details/tazpod-proxmox-runtime-detail.md and the CRISP project’s RESEARCH.md were corrected to record the deletion, which was also verified live (no ~/.dsh under /home/tazpod or /root, no dsh package in the nvm prefix, nothing listening on 3081).
[2026-09-25] service | Paperclip deployed on the TazPod container
CRISP project paperclip-lxc-deployment built and verified: Paperclip (npm paperclipai, agent control plane) now runs natively inside CT106 as paperclip.service, reachable on the private network at http://192.168.1.206:3100 in authenticated + private mode.
Created:
details/paperclip-tazpod-detail.md— the service page: provisioning layer, database identity, secrets channel, unit hardening notes and operationsindex.md,entities/tazpod.md— links to the new page
Why it matters:
The container gained its operator surface after the dsh decommission, and the durable part is the provisioning, not the running process: the service is recreated from the TazPod Ansible baseline (layer5-paperclip), its state lives on the pet volume so a rebuild does not rotate the secrets master key, and the database identity is a GitOps-declared user with TLS-only, database-scoped pg_hba rows. Three findings are recorded here because they cost time and would cost it again: pg_hba matches (DATABASE, USER, ADDRESS) so a database-scoped reject row does not restrict the user; Ansible materialises a task’s environment: in the argv of the become wrapper (visible in ps), so secrets must be sourced from a file; and RestrictAddressFamilies needs AF_NETLINK or libuv’s uv_interface_addresses kills a Node service at startup.
[2026-09-25] change | Paperclip service runs as the operator user
Follow-up to the deployment, same day: the service was moved from its dedicated paperclip account to tazpod, because Paperclip is replacing the tmux-launched agents and those agents write to the repository working copies, push through gopass-provided credentials and use the operator’s SSH keys.
Updated:
details/paperclip-tazpod-detail.md— service user, agent environment section (write access, push credentials viaGIT_CONFIG_GLOBAL+GITHUB_TOKEN, sandbox deltas), pet-volume ownership
Why it matters:
The previous shape (a dedicated unprivileged service account, read-only repositories, no credentials) was the safer default but could not do the work the operator wants orchestrated. The current shape reproduces the operator’s own capabilities inside the service, so the trust boundary moved from “the app is contained” to “the app is the operator” — worth remembering when reading any future hardening note about this unit. The push credential still never touches disk: the helper is a function of the environment variable rendered into the 0600 env file.
[2026-09-25] change | First agents and projects on Paperclip (and the wizard’s blind spot)
The first-agent wizard offers only Claude and Codex, and its connection test cannot succeed here, so the CEO was created through the CLI/API instead — pi_local with opencode-go/deepseek-v4.1-flash, plus the six projects (Cluster & Infra, TazPod, Vault & Secrets, Wiki & Docs, Blog, Teaching) all led by that agent.
Updated:
details/paperclip-tazpod-detail.md— new section “Creating agents and projects when the wizard is not enough”: the CLI recipe, the two traps (provider-qualified model identifier, per-API-base board tokens) and the proof of a successful heartbeat
Why it matters:
Two failures looked like broken configuration and were not: the wizard is simply narrower than the platform, and the model field needs the provider prefix. Both only surface at run time, so the durable lesson recorded here is to trust agent runtime-state after a manual heartbeat rather than the save dialog.
[2026-09-25] lint | Paperclip deployment claims corrected, agent org chart added
A read-only review of the Paperclip deployment (Reviewer) checked the deployment notes against the live system and refuted or found stale several statements. Corrected against the running unit, the env file and the process environment:
Updated:
details/paperclip-tazpod-detail.md— (1) the “no token on disk” claim is false:GITHUB_TOKENsits in cleartext in/etc/paperclip/paperclip.env(0600 tazpod:tazpod) and is exported byEnvironmentFile=into every spawned agent (verified via/proc/<MainPID>/environ), while the credential helper, the git config and the remote URL stay secret-free; (2) the unit hardening notes now match the live unit (ProtectHome=no,ReadWritePaths=/workspace /home/tazpod,UMask=0022); (3) the payload/shim row points at/home/tazpod/.local/bin/paperclipaiand records that thepaperclipaccount no longer exists; (4) the operations commands no longer usesudo -u paperclip(impossible underNoNewPrivileges); (5) the section now states the blast radius plainly —/workspacewrite access covers the whole pet volume including/workspace/.paperclipstate and its master key, andGITHUB_TOKENis readable by every agent. Also corrected the stale “all six projects led by the CEO” sentence.entities/agent-company.md— new org chart: the CEO plus five reports, each agent’s single-writer repository surface and project leads, the reporting line, and governance in force (per-agent monthly budgets, new-agent approval gate, read-only Reviewer)index.md— entity entry for the org chart
Why it matters:
A reader acting on the old text would have misjudged both the sandbox (it is not one) and the secret handling (the push credential does touch disk, and every agent can read it). Matching the page to the live unit and process, and documenting who owns what, is the minimum for the wiki to stay trustworthy. Command anchors used: systemctl cat paperclip, getent passwd paperclip, tr '\0' '\n' < /proc/<MainPID>/environ, paperclipai org get, paperclipai agent list, paperclipai project list.
[2026-09-25] lint | dsh / DeepSeek Harness references audited (no drift found)
Full-text audit of the wiki for dsh / DeepSeek Harness after the decommission recorded earlier the same day. Pattern: grep -rniE '\bdsh\b|deepseek[ -]harness' over index.md, details/, entities/, topics/, operations/, contexts/, concepts/, sources/, analyses/, references/ and docs/; handshake occurrences were excluded as substring noise. wiki/guide/ does not exist in this repository (the runbook/navigation surfaces are operations/, contexts/ and the index).
Real matches, by file:
details/tazpod-proxmox-runtime-detail.md— theRemoved: dsh Web UIsection and the “Historical context worth keeping” paragraph. Intentional and accurate; unchanged.index.mdandentities/tazpod.md— the two catalogue/link descriptions for the CT106 page. Both already read “decommissioned 2026-09-25”, not as a live surface; unchanged.details/hindsight-deployment-detail.md— a single upstream-fact aside in gotcha 5 (“Upstream also lists DeepSeek Harness itself among the clients with incomplete session support, discussion #5495”). It documents the OpenCode Go session-header requirement, not a TazLab surface, and is neither stale nor an instruction to use dsh; unchanged.
Excluded as non-matches: deepseek-v4.1-flash (the OpenCode Go model identifier in details/paperclip-tazpod-detail.md and details/tazlab-k8s-teaching-detail.md), “Test harness” (details/ephemeral-castle-golden-image-detail.md), and every handshake.
Live re-verification on CT106 (tazpod-proxmox) today: systemctl status dsh → Unit dsh.service could not be found; command -v dsh → nothing; no @deepseek-ai directory in the tazpod nvm prefix; ss -tln → nothing on 3080/3081; /home/tazpod/.dsh absent; /var/log/dsh-web.log absent. /root/.dsh could not be re-checked as the operator user (permission denied); the decommission entry records it was verified absent during the removal.
Why it matters:
Every remaining mention is either protected history (this log, the intentional “Removed” section) or a single upstream citation, so the audit changed no page body. Recording the search and the classification here means the next agent does not have to repeat it to reach the same conclusion, and the live checks anchor the “decommissioned” claim to today’s container rather than to the text that makes it.
[2026-09-26] update | ~/.pi pet-volume guarantee documented on the CT106 runtime page
Platform commit d7dd4ff (tazzo/tazpod master) moved the pi state directory onto the pet volume. Documented it on the TazPod container runtime page and kept the related pages consistent.
Updated:
details/tazpod-proxmox-runtime-detail.md— new section “Thepistate directory is pet-backed (~/.pi)”: the two state trees (paperclips/<timestamp>-<agentId>.jsonltranscripts andagent/skills), the path table (/workspace=pve-vm--999--disk--2, canonical/workspace/.paperclip/home/.pi, legacy/workspace/.tazpod/.pi, account path/home/tazpod/.pias a symlink), the four-steppaperclip-pi-home.ymlmigration/seeding, and the no-op-on-steady-state guard. The Ansible layer list now nameslayer5-paperclip. It also records a caveat: the.bashrcAI-tool symlink loop still forces.pito the legacy path, so the canonical target is not stable across interactive shells (both locations are pet-backed, so durability holds).details/paperclip-tazpod-detail.md— the heartbeat-session note now states~/.piis a pet-volume symlink and links to the runtime page.index.md— runtime-page description mentions the pet-backed~/.pistate directory.
Evidence (live, 2026-09-26): readlink -f /home/tazpod/.pi → /workspace/.tazpod/.pi; findmnt -no SOURCE,TARGET,FSTYPE /workspace → /dev/mapper/pve-vm--999--disk--2 /workspace ext4; /workspace/.paperclip/home not yet created. The .bashrc caveat is read from the deployed /home/tazpod/.bashrc and tazpod/dotfiles/.bashrc.
Why it matters:
The transcripts are the readable record of what each agent did; the wiki now says where they live, why they survive a rebuild, and where the guarantee is currently leaky. The caveat is routed to the Platform Engineer as a follow-up issue rather than left as an assumption.
[2026-09-26] decommission | Hermes Agent VM 501 destroyed, data disk preserved
The board destroyed the unused Hermes Agent VM (VM 501 hermes, 192.168.1.205) on 2026-09-26. The wiki still described it as a live operator surface, so the operational content was replaced by a “Removed” section and the catalogue descriptions were corrected.
Changed:
entities/hermes.md— decommission banner +Removed: VM 501 decommissioned (2026-09-26)section (what was deleted, the destroy-log evidence, the preservedvm-501-data-orphandisk, how./create.shrecreates the VM); Overview switched to past tense; Quick Facts gained aStatusrow; the canonical-pages heading marked historical. Architecture, discoveries and secret paths kept as the record.topics/hermes-vm-deployment.md— decommission banner; newRemovedsection with the same facts and the lvrename rationale; the Dashboard Access subsection marked historical. Architecture/lifecycle kept as the record.topics/hermes-lxc-deployment.md— the superseded banner now notes that the KVM successor is decommissioned too.index.md— the entity entry and theAI Agent Servicessection no longer advertise Hermes as current.entities/ephemeral-castle.md— the relationship line and the 2026-08-12 note carry the decommission.entities/hindsight.md,details/hindsight-deployment-detail.md,topics/hindsight-architecture.md— the per-agenthermesbank is marked dormant and theopencode-gogateway is no longer described as “shared with Hermes” in the present tense.topics/tazlab-operating-model.md,topics/tazlab-repository-map.md— repository-table/map rows now state that VM 501 was decommissioned and the data disk is preserved.
Evidence:
- Destroy run log
/workspace/hermes-agent/logs/destroy_20260926_075300.log: VM 501 unlinked (unused0: local-lvm:vm-501-disk-2),vm-501-disk-2renamed tovm-501-data-orphan,vm-501-cloudinit/vm-501-disk-1/vm-501-disk-0removed, 1 terraform state instance removed, data disk verified preserved. - Live verification (2026-09-26, from CT106
tazpod-proxmox):ssh root@192.168.1.200 'qm list | grep -E "^\s*501\s"'→ no output (VM 501 NOT PRESENT);ssh root@192.168.1.200 'lvs | grep vm-501'→vm-501-data-orphan pve Vwi-a-tz-- 20.00g data 28.59.
Examined and deliberately left unchanged (accurate history, no drift):
contexts/INDEX.mdandcontexts/ephemeral-castle-context.md— records of the 2026-08-12 move out ofephemeral-castle, not claims about the VM being live.topics/tazpod-gopass-migration.md— past migration checklist (“22: hermes agent scripts ✅”), historical.topics/lxc-storage-crisp-design.md— cites the hermes LXC as provenance for the LXC provisioning pattern, not as a live service.topics/hermes-lxc-deployment.mdbody — CT 105 history (destroyed 2026-08-12), kept for reference.
Why it matters:
A reader acting on the old text would have tried to reach a dashboard and an SSH endpoint that no longer exist. Recording the reversible-preservation detail (vm-501-data-orphan + ./create.sh) means a future operator can restore the surface without a restore step, and the lvrename orphan pattern that made it safe is now anchored to a real decommission instead of only to design notes.
[2026-09-26] ingest | TAZ-19 trusted orchestration host — TazPod LXC provisioning runbook
Published the TAZ-19 operator runbook as durable wiki documentation, after TAZ-12 re-keyed TazPod LXC provisioning to the operator-owned key pinned to tazlab.
Changed:
topics/tazpod-lxc-orchestration-host.md— new topic page. States the decision (trusted orchestration host istazlab,192.168.1.200) and the reason (thetazpod-provisionkey’srestrict,from="192.168.1.200"pin on CT106 forces the run to originate from tazlab); the control-host requirements table (ansible-core,terraform,gopass+ store GPG key,git,openssh-client, both checkouts,runtime.env,ansible.cfg); the provisioning-key contract (/root/.ssh/tazpod-provision,0600 root:root); the idempotent bootstrap script (tazpod@e38dc17); the ping/--checkacceptance commands; the fullcreate.shrun and phase order. No secret values, only paths and names.entities/tazpod.md— LXC Runtime section now links the orchestration-host topic.details/tazpod-proxmox-runtime-detail.md— Provisioning section gains a “Where the run happens” note; See Also links the new topic.topics/tazpod-provisioning-and-dotfiles.md— See Also links the new topic.index.md— topic entry under “Operator Tooling (tazpod)”.
Evidence:
tazzo/tazpod@e38dc17(“lxc: add the trusted orchestration-host bootstrap (TAZ-19)”) addsruntimes/lxc/scripts/install-orchestration-host.sh(150 lines); the script in the worktree is identical to that commit (git diff e38dc17 -- runtimes/lxc/scripts/install-orchestration-host.shempty).- The script and the runbook both carry the
from="192.168.1.200"rationale and the tazpod/tazlab-secrets checkout + keypair verification.
Why it matters:
The privileged bootstrap and verification on tazlab are operator actions outside agent reach, so the decision and the exact prerequisites must survive in the wiki: a reader who missed TAZ-19 would otherwise try to run create.sh from a workstation and be rejected by the key pin. Marked explicitly that the runbook records the decision and prerequisites, not an executed result.
[2026-09-27] ingest | Multica — control plane live on tazlab-k8s, daemon registered on CT106
Added the durable page for the agent-orchestration control plane and its runtime, both verified live today, and the operational knowledge the build had to discover to get there.
Changed:
details/tazlab-k8s-multica-detail.md— new detail page. The two halves and who owns each (Flux+Vault for the control plane, Ansiblelayer6-multicafor the daemon); the manifest table with the registration points; the certificate database identity (fourpg_hbarows,DATABASE_URLwithsslcert/sslkey/sslrootcert, PKI roledb-client-multica, Git-declared grants Job); the seven-keymultica-secretsproduced by oneVaultStaticSecret; the four postRenderer patches with the reason each exists and the warning that an unmatched patch target is a silent no-op; the LAN-only exposure where the frontend proxies the API and WebSocket same-origin; the headless login (DEV-mode code read from the backend log, thenPOST /auth/verify-code→POST /api/tokens); the image lane (GHCR pinned, Docker Hub mirror not yet published); and the CT106 daemon contract (unit, env file,~/.multica/config.jsonas the CLI’s own credential file,OPENCODE_API_KEY/EXA_API_KEYdelivery, the two switches that are off for a systemd reason).index.md— details entry under “## Details”, next to the teaching page.
Evidence (live, 2026-09-27, from CT106 tazpod-proxmox):
curl http://192.168.1.240:3000/→ 200 from the VIP;/api/config→daemon_server_urlanddaemon_app_url=http://192.168.1.240:3000,allow_signup: true,server_version: v0.5.3. Podsmultica-multica-backendandmultica-multica-frontend1/1 Running; Servicemultica-multica-frontendLoadBalancerwith EXTERNAL-IP192.168.1.240; Secretmultica-secrets(7 keys) anddb-client-multica-tlspresent.- Browser session against the running app:
/login→ code read fromkubectl logs deploy/multica-multica-backend -n multica([DEV] Verification code for taz@tazlab.net: …) → signed in →/tazlab/issuesrendered with the agent’s issue;/tazlab/runtimesshowstazpod-proxmox · omp/18.2.7 · Online · 3 runtimes · All idle. - Daemon:
multica version→ 0.5.3;systemctl is-active multica-daemon→ active, enabled;multica daemon status --output json→workspaces[0].runtimes= 3 ids, agents[pi, omp, antigravity, opencode]; the log showsregistered runtime provider=pi|omp|opencodeandskip registering runtime: version too old … antigravity 1.1.4 below minimum 1.1.10. - End-to-end task: issue
TAZL-1assigned to the agent on theompruntime → taskcompletedin 29 s, 7 tool calls, and the agent’s comment carries the real output ofhostname,omp --version,pi --version,multica version,ls /etc/multica. - Layer idempotency: a second ansible run of the role converged with
changed=0. - Git:
tazzo/tazpod@8b5ed4bwires the provider key into the unit.
Why it matters:
The wiki previously described two agent control planes and neither of these facts: that the lab now runs a control plane whose database identity is a certificate (so it survives a rebuild), and that its daemon needs a provider key in the unit environment — pi’s auth.json is empty and omp routes to opencode-go, so without OPENCODE_API_KEY every claimed task dies at the CLI handshake, a failure that looks like an agent bug and is actually a provisioning gap. The page also records the two things that make the login work at all in a lab with no mail relay: RESEND_API_KEY empty ⇒ the code is printed to the backend log, and APP_ENV=production ⇒ MULTICA_DEV_VERIFICATION_CODE is inert.
[2026-09-28] update | Paperclip moved to its own container (CT108) — page created, CT106 marked historical
The wiki still described the agent company as running inside CT106 (tazpod-proxmox), as it was built on 2026-09-25. On 2026-09-26 the company was carried to a dedicated, unprivileged container, CT108 paperclip (192.168.1.208), and CT106’s paperclip.service was stopped and disabled. Nothing in the wiki mentioned CT108, the egress chokepoint, the container’s own gopass store, or the guest’s identities.
Changed:
details/paperclip-container-detail.md— new Level 3 page. Guest shape (unprivileged, nesting/keyctl off, static address, 32 GB pet volumevm-108-disk-1→/workspace, rawlxc.cap.drop/cgroup2.io.maxwritten bycreate.shover root SSH); theruntimes/lxc-papercliptree and its sixcreate.shphases; the five Ansible layers; the unit (canary asExecStartPre, master key handed over as a path becauseLoadCredential=cannot work in an unprivileged LXC, hardening, limits); the separateagentgopass store on the data volume, its own inside-generated GPG key, one-way seeding over stdin,core.readonlyand the canary’s exit codes; the carry (four artefacts,paperclipai onboarddeliberately never run, rollback = swap the unit back); the four identities (paperclipwith no sudo and no SSH, the operator-gated Proxmox user/role/token, the Kubernetespaperclip-observer, the Vault AppRole); the tailnet join in userspace mode (TD-093) and what it means; the egress chokepoint (mitmproxy on127.0.0.1:3128, its CA, the policy allowlist and the two injections, the nftables uid split, the drop-in binding, fail-closed, and the two limits: TD-095 and the absentvault:rule); operations, rollback and the deliberately-absent list.details/paperclip-tazpod-detail.md— MOVED banner: the body is kept as the record of the CT106 era (the CLI traps and the blast-radius finding are still worth reading) with the live page linked at the top; the Concept moved to past tense.details/tazpod-proxmox-runtime-detail.md— the container’s role corrected: Paperclip ran here 2026-09-25 → 2026-09-26 and its unit is disabled; the layer list now nameslayer6-multicaandlayer7-multica-team.entities/tazpod.md,entities/agent-company.md,index.md— links and descriptions point at the CT108 page; the agent-company hub states that the Multica team is a separate, Git-declared roster.
Verified live (2026-09-28, from CT106 as tazpod): curl http://192.168.1.208:3100/api/health → {"status":"ok","deploymentMode":"authenticated","deploymentExposure":"private","bootstrapStatus":"ready"}; systemctl status paperclip on CT106 → inactive (dead), disabled. Everything else on the page is read from tazpod/runtimes/lxc-paperclip at its current revision; the guest itself is not SSH-reachable from CT106 (the provisioning key is pinned from="192.168.1.200"), so the in-guest state is documented from the layer that renders it.
Why it matters:
A reader following the old text would operate a control plane that no longer runs there, and would not know that the lab’s agent credentials now pass through a chokepoint, that the container has its own store, or that the tailnet presence is ephemeral. The move is also the answer to the question the old page’s “blast radius” paragraph raised: the agents no longer run with the operator’s whole pet volume writable.
[2026-09-28] lint | tazlab-db aligned to PostgreSQL 17.2, and a two-month-old service claim corrected
The database page still reported PostgreSQL 16; the cluster has been on 17.2 since 2026-09-27, and the page’s “External Service” section pointed at a MetalLB service (tazlab-db-external, 192.168.1.241) that was disabled on 2026-05-23 and no longer exists in the repository.
Changed (details/tazlab-k8s-tazlab-db-detail.md):
- Version row corrected:
spec.postgresVersion: 17/status.postgresVersion: 17, serverPostgreSQL 17.2, imageubi8-17.2-1, PGO 5.7.2. - Users table: eight roles (added
hindsight,postgres,paperclip,multica, each with its auth method). - New section
The 17 major upgrade: the ordered Git sequence (5bbd96a→3ad7659), measured cost (~90 s data work, ~6 min downtime, 80 pods healthy), the two research errors (spec.transferMethodabsent from the installed CRD; wrong image tags), the absence of any in-place rollback, and the extension handling (pgauditat 17.0,vectorviaALTERonly, one-shot Jobs becausedatabaseInitSQLruns once). - Backup section: the annotation-driven one-off full backups (pre/post upgrade), why the second one was needed (new WAL timeline, live timeline
3), and why the schedules were suspended rather than left running. - External Service replaced by
Service exposure:tazlab-db-tailnet(Tailscale class,tazlab-db.magellanic-gondola.ts.net, NodePort 32227 pinned) as the only external path, with the old MetalLB service marked disabled. - Client certificates: six, each in its consumer’s namespace (Grafana, mnemosyne, pgAdmin, tazlab-admin, hindsight, multica).
pg_hbasection rewritten from the live rule list (36 rules): order significance, the(DATABASE, USER, ADDRESS)field-order trap, and Paperclip’s deliberatemd5-over-TLS exception.- New subsection on schema grants for late-added databases (
multica-db-grants-job.yamland themanualSelector: truerequirement). - Known Issues: the stale
pgaudit 16.0catalog row inmulticaandtemplate1(observed 2026-09-28, remediation named, handed to the Cluster agent), the no-rollback property of a major upgrade, and the TD-096 dependency stall. details/tazlab-k8s-flux-kustomizations-detail.mdandindex.md— the one-line summaries no longer say Postgres 16.
Verified live (2026-09-28, from CT106): select version() → PostgreSQL 17.2; pg_settings → server_version=17.2, data_directory=/pgdata/pg17, shared_preload_libraries=pgaudit; kubectl get postgrescluster … -o jsonpath → 17 17; kubectl get svc -n tazlab-db → no tazlab-db-external, tazlab-db-tailnet with NodePort 32227; kubectl get vaultpkisecret -A → 8 objects.
Why it matters:
The page is the reference for every consumer of the shared database, and two of its claims were actively wrong — the version, and a connection address that has not existed since May. A reader acting on either would open a change against the wrong target.
[2026-09-28] update | Multica: the Git-declared agent team, the mail path, and the image markers
The Multica page was accurate about the control plane and the daemon but predated the work that landed after it: the agent team is now declared in Git, the login-mail path is configured, and three image/rollout details had been discovered the hard way.
Changed (details/tazlab-k8s-multica-detail.md):
- New section
The agent team (declared in Git): the roster as source of truth (configs/multica-team/roster.yml: workspacetazlab, runtimeOh-My-Pi (tazpod-proxmox), the two shared skillslab-team/lab-orchestration), the per-agent defaults (permission: workspace→public_to+ workspace invocation target;max_concurrent_tasks: 1because a handoff is a wakeup, not a call), the eleven agents with their domains, the reconciler’s compare-then-write idempotence (never deletes, stores no id, never touchescustom_env/mcp_config/credentials,--dry-run), the layer’s wiring as the operator user, and the push-credential helper rendered into/home/tazpod/.config/git/config. - Authentication section: the mail path is configured but not armed —
resendFromEmail: onboarding@resend.devreplaces the chart default that belongs to a domain this lab does not own, whileRESEND_API_KEYis still empty, so the DEV-mode log is what actually works; plus the operator-account requirement for the daemon PAT. - Image lane rewritten: repository and tag as separate fields, the
:tagsetter suffix in the image-policy markers (the first automated commit wrote a full image reference into the tag field), the automation’s exact shape, and a new subsection onrolloutRestartTargetsnaming the release-prefixed Deployments (a rotated secret otherwise never reaches a running process). - See Also: the sibling-app link now points at the CT108 container page, and the observer identity is linked.
Verified live (2026-09-28): multica agent list --output json → eleven agents, all public_to, all max_concurrent_tasks: 1; multica daemon status --output json → running, cli_version 0.5.3, three runtimes; kubectl get secret -n multica multica-secrets -o json → the same seven keys, RESEND_API_KEY empty; kubectl get helmrelease -n multica → multica-0.5.3+b4f1ca977880, READY.
Why it matters:
The team is the lab’s operating structure — agents that exist only in the control-plane database are objects a rebuild may not bring back, and the page now records where they actually live. The two “silent” failure modes (a marker without :tag, a rollout target with the wrong name) are precisely the kind of thing that looks configured and does nothing.
[2026-09-28] lint | paperclip-observer identity, Vault AppRole, and the teaching test gate
Three facts were live but absent from the wiki: the read-only Kubernetes identity the agent container uses, the lab’s first AppRole trust domain, and the test gate that now blocks the teaching image.
Changed:
details/tazlab-k8s-paperclip-observer-detail.md— new Level 3 page: why the identity exists (cluster health reports), its shape (ServiceAccount influx-system, ClusterRole/Binding =view∪flux-view-flux-system, get/list/watch only, nosecrets, nopods/exec), thenodesgrant and its rationale, the token Secret and the operator step that copies it into gopass, how the container renders its kubeconfig from it (never reading the operator’s cluster-admin credential), theinfrastructure-agents-paperclipKustomization (leaf, nodependsOn), verification commands and the revocation path.entities/hashicorp-vault.md— newNon-Kubernetes identitiessection: theauth/approle-agentmount, rolepaperclip-agent(service token, 1h period, 24h explicit max, single policy, single-use 10m SecretID, CIDR-bound to192.168.1.208/32), policyagent-paperclip(own KV subtree + its own PKI role; confinement by omission plus explicit denies), the login rate-limit quota, who mints the wrapped SecretID, and the honest status: the chokepoint ships without avault:rule, so nothing consumes it yet. Also corrected: 8 VaultPKISecrets (was 6) and the mTLS claim (six apps, Paperclip the deliberate exception).details/tazlab-k8s-teaching-detail.md— the delivery chain now shows thetestjob andneeds: test(TD-077 closed 2026-09-25), including why the job pins the production Python major and installs the real rendering dependencies.index.md— entries for the two new pages.
Verified live (2026-09-28): kubectl get clusterrole,clusterrolebinding paperclip-observer (Flux-owned, created 2026-09-26) and kubectl get sa,secret -n flux-system; vault read auth/approle-agent/role/paperclip-agent + vault auth list + vault policy read agent-paperclip + vault list sys/quotas/rate-limit → mount, role settings, policy and approle-agent-login-rate-limit all as documented; teaching.tazlab.net commit c0b2664 and the current .github/workflows/publish.yml.
Why it matters:
An agent’s cluster credential and a secret-broker identity are exactly the objects whose real reach is invisible from the outside — “read-only” and “one policy” are claims a reader must be able to verify, and now can. The teaching gate is the difference between “the image built” and “the exercises are correct”.
[2026-09-28] lint | stale claims found and NOT fixed (routed, not silently rewritten)
pgaudit 16.0in themulticadatabase and intemplate1while the binaries are 17.0 — documented as a Known Issue on the database page; the fix (ALTER EXTENSION pgaudit UPDATE) belongs to the Cluster agent.paperclip-agentis not among the tailnet peers seen from CT106 (2026-09-28), while the layer and the RUNBOOK join it with--hostname=paperclip-agent; the ephemeral auth key explains it (the node leaves when it goes offline), and the container page now says so instead of asserting reachability. Whethertailscaledinside CT108 is healthy could not be checked — the guest is not SSH-reachable from CT106.gopass show -o bootstrap/tailscale/{api-key,oauth-client-id}returns exit 11 (“key not found”) and a full read fails withgpg: public key decryption failed— the onboarding path for re-minting a tailnet auth key is therefore not exercisable from CT106 today. Same class as TD-097 (transient/incorrect gopass reads); left for the Security/TazPod owners rather than documented as fact.- The chokepoint’s Proxmox rule is dead by design (TD-095) and its
vault:rule is absent: both are recorded on the container page as limits, not as working features.
[2026-09-30] update | the teaching graph-reading page is a random graph mill
What changed
TAZLAB-38 released teaching.tazlab.net as commit 74dadcc (the re-land of 1572410 onto the polish(web) frontend refresh) on 2026-09-30: the graph-reading page stopped being a form the operator configures and prints. Every configurator choice now defaults to random, one click produces exactly one graph, and the generator draws the reading the drawn motion can answer — the teacher asks the questions in person.
Changed:
details/tazlab-k8s-teaching-detail.md— new section The graph-reading page (cinematica-grafici-lettura): the four served controls (Quanti tratti3/4/5; thesegment_kindscontrol that renders one motion selector per segment withcount_from: count;Grandezza sul grafico;Sistema di misura), all defaulting toCasuale; the seed as a page-levelCasuale/Numerochoice rather than a bare number; what is gone (the reading selector — the generator draws it, and refuses an acceleration asked of an all-uniform motion; theNumero di esercizifield — the page pinscount=1; the statement above the graph —show_statement=False, while the statement is still generated and verified for the PDF and the tests); the exact unit-scale table (si,kmh= 18/5,cm= ×100); and the four generator/steps defects the random draw exposed.- Same page — The descriptor contract — three files, or it is a silent no-op:
app/generators/physics/segments.pyemits the controls,app/api/schemas.pydocuments them (ConfigControl,kind∈select|segment_kinds,count_from),web/src/config.jsrenders them and skips an unknown kind with a console warning. A new kind must be added in all three. - Same page — No frontend test coverage: no test imports
web/src/*,web/package.jsondeclares onlybuild/dev, and thetestjob is pytest withnpm cifor KaTeX alone.web/src/is therefore compiled (Dockerfile stage 1npm run build, so a syntax error fails the image job) but never tested: a behavioural regression ships green. - Same page, Delivery Chain — the “a green pipeline means the exercises are correct” claim is now scoped to the Python service, with a pointer to the frontend exception above.
index.md— the details entry for the page names the new material.
Verification
Live, 2026-09-30, https://teaching.tazlab.net/#/fisica/cinematica/cinematica-grafici-lettura: GET /api/pages returns the page with count: 1, show_statement: false and exactly the four controls described, defaults all random. In a browser the page carries #seed-mode (Casuale/Numero) with #seed disabled while random, a Genera button and no count input; one press yields one card, one <svg>, no .statement and one Passaggi block; a second press on the random seed yields a different graph. Repository side: app/pages.py (registry entry), app/api/schemas.py (ConfigControl), app/generators/physics/segments.py (configurer(), default_options(), _draw_ask, unit systems), web/src/config.js, web/src/app.js, web/src/pages.js, .github/workflows/publish.yml, Dockerfile.
Why it matters
The page had never been described in the wiki — only its cluster footprint was — so nothing there was stale; what was missing was the page itself, and the one fact that changes how the next person works: the configurator is a three-file contract, and the gate that stopped TD-077 covers the Python service only, so a frontend regression can reach the live site green.
Correction (2026-09-30, same day). The two claims above that the frontend is outside CI — “the test job is pytest with npm ci for KaTeX alone” and “the gate that stopped TD-077 covers the Python service only, so a frontend regression can reach the live site green” — were true when written and stopped being true later the same day, when commit df8a7b7 landed the frontend gate. The entry is kept verbatim as the record of the state at the time; see the entry below for what replaced it.
[2026-09-30] update | the teaching publish chain gains the frontend test gate (TD-110)
What changed
df8a7b7 (merged into master as c96ddd1, published and live) gave web/ a vitest suite and put it in the Publish Teaching workflow, which turned the wiki’s “the frontend is outside CI” fact false. Two live pages and one log sentence still said the opposite.
Updated:
details/tazlab-k8s-teaching-detail.md— the section No frontend test coverage is replaced by a top-level Frontend test gate (it was a###nested under the graph-reading page, and it is a repo-wide fact the Delivery Chain now points at):web/package.json("test": "vitest run"),web/vitest.config.js(jsdom,include: ["test/**/*.test.js"],css: false), the two suites and what each asserts (9 inconfig.test.js, 12 inapp.test.js), why the assertions are behavioural and not DOM snapshots, the fixture pin intests/test_web_fixture.pywith its regenerate command, the counts from the run below, and the honest limits (KaTeX’s stylesheet is not loaded;figure.jsandformula.jsare only reached throughpages.js).- Same page, Delivery Chain — the
testjob line reads… npm ci (KaTeX + dev deps) → npm test (vitest, web/) → python -m pytest tests -q, and the paragraph that scoped the green-pipeline claim to the Python service now states the gate covers both halves and names the step’s position. index.md— the details entry ends with the gate (21 vitest tests, fixtures pinned to/api/pages) instead of “the frontend’s lack of test coverage”.
Verification
Repository at df8a7b7: .github/workflows/publish.yml carries Run the frontend test suite (run: npm test, working-directory: web) between npm ci --no-audit --no-fund and python -m pytest tests -q. Workflow run 36757786129 (head c96ddd1, both jobs green): Test Files 2 passed (2) / Tests 21 passed (21), duration 1.92s; pytest 482 collected with 2 skipped; test 1m31s, build-and-push 1m26s.
Why it matters
The last two sentences of the previous entry were a warning about a gap that no longer existed, on a page an agent reads before touching web/src/. Left alone they would have had the reader looking for a missing gate instead of the npm test step that is in the workflow, and would have sent the next frontend regression back to “the gate that stopped TD-077” — which now catches it.
[2026-10-19] decommission | Paperclip removed
What changed
The Paperclip experiment is over. The guest CT108 (paperclip, 192.168.1.208) and its data volume were destroyed, the shared tazlab-db lost the paperclip database, the role and the four pg_hba rows, the read-only Kubernetes identity (paperclip-observer) was pruned, and the Vault AppRole paperclip-agent went with its policy, quota and mount. Nothing was archived: the operator’s decision.
Pages
details/paperclip-container-detail.md, details/paperclip-tazpod-detail.md, details/tazlab-k8s-paperclip-observer-detail.md and entities/agent-company.md carry a dated historical banner. details/tazlab-k8s-tazlab-db-detail.md no longer lists paperclip as a live consumer and keeps the (DATABASE, USER, ADDRESS) reject-row lesson, now carried by the multica and buzz rows. The published blog post Too Many Agents for tmux keeps its URL and carries a dated closing note.
Why it matters
A decommissioned system that stays described as live is worse than one that is deleted: the next reader provisions against it. The lesson survives; the system does not.
[2026-10-19] decommission | Buzz removed
What changed
The Buzz relay left the cluster: the apps-buzz Kustomization, the Helm release buzz (chart 0.1.9), the deployment and its Redis, the three Services (including buzz-lan on 192.168.1.240:3010), the ServiceMonitor, the NetworkPolicy and the two VSO Secrets are gone; the namespace and its dead probe pod (TD-158) went with them. The shared tazlab-db lost the buzz database, the role and the four pg_hba rows, the Vault KV/PKI/JWT identity was removed, and the nine cluster/buzz/* gopass entries were deleted. On CT106 the layer8 tooling, the agent home and the three buzz* symlinks were removed; the OMP sessions were kept on the operator’s request.
Pages
details/tazlab-k8s-tazlab-db-detail.md lists seven live roles, marks buzz as removed, shows the current pg_hba example and 32 rules. The published article Tre orchestratori keeps its URL with a dated closing note.
Why it matters
The reject-row lesson stays on the multica row; the :3010 port is free while the rest of 192.168.1.240 is untouched.
[2026-10-20] decommission | Multica removed
What changed
The Multica control plane left the cluster: the apps-multica Kustomization and the Helm release multica-multica (chart 0.5.3) went in two commits, the image automation (2 ImageRepository + 2 ImagePolicy + the ImageUpdateAutomation) was removed, the four VSO objects and the multica allowlist entry were pruned, and the namespace went with them. The shared tazlab-db lost the multica database (79 MB), the role and the four pg_hba rows; the Vault KV, PKI role, JWT role and policy were removed; the two infra/multica/* gopass entries were deleted. On CT106 the daemon (multica-daemon.service), /etc/multica, ~/.multica (71 MB), /workspace/.multica (5.2 MB), the CLI and the Multica-rendered git config were removed, and the layer6/layer7 team tooling left tazpod.
Volumes
The three upload volumes — the bound PV and the two orphaned Released copies, all Retain, 5 Gi each — and their Longhorn volumes were deleted explicitly: 15 Gi freed.
Pages
details/tazlab-k8s-multica-detail.md is historical; tazpod-proxmox-runtime-detail.md, tazlab-k8s-flux-kustomizations-detail.md, index.md, entities/tazpod.md, entities/agent-company.md and entities/hashicorp-vault.md were updated (six database roles, 28 pg_hba rules, 13 agents in the historical note, Vault counts). The published Multica article keeps its URL with a dated closing note.
[2026-10-20] deploy | Halloween live at halloween.tazlab.net
What changed
The halloween app was added to tazlab-k8s through the teaching/wiki lane: namespace,
base + overlay, Flux Kustomization (dependsOn core + configs), Traefik TLS Ingress +
web-only redirect, per-host cert-manager Certificate, and image automation for
tazzo/tazlab-halloween (halloween-<N>-<sha>). State is intentionally ephemeral:
emptyDir /data + /tmp, no PVC/Longhorn/fsGroup; one replica Recreate; one Uvicorn
worker. The Docker Hub image is public; no application secrets.
Verification
https://halloween.tazlab.net/healthz → 200; GET HTTP → 301 / HEAD → 308; HTTPS 200 with a
valid Let’s Encrypt chain; Certificate Ready=True; no PVC; full simulator game (two
players, wrong password, recovery, victory) passed and reset to lobby. The scanner/audio fix
(halloween-2-c91765e…) was delivered automatically by CI → Docker Hub → Flux
ImageUpdateAutomation; master-only story voice, one-shot scanner/3-second duplicate guard,
and the viewport-fitted master dashboard (halloween-3-f3bc566…).
Pages
New details/tazlab-k8s-halloween-detail.md; updated index.md,
topics/tazlab-k8s-image-automation.md and details/tazlab-k8s-image-automation-detail.md.
ambrogio-memory: the service and its contract (2026-10-21)
The lab’s memory left the markdown files and became a service: one Go binary, SQLite, an API on
:7810, the skill as the client contract, the internal agent that writes the account of each
closed cycle, and the backup pushed to git every thirty minutes. An independent agent tested it
and found seven defects (a broken URL in the contract, pagination ignored, documents write-only,
the debt text missing from the bundle, no discovery surface, an empty account accepted, and no
idempotency on the log); all seven are closed in 66ef795.
Pages
New entities/ambrogio-memory.md, topics/ambrogio-memory-contract.md,
details/ambrogio-memory-verbs-detail.md; updated index.md.
ambrogio-memory: the second independent test (2026-10-21)
The same fresh agent retested 11373b3: two real defects (an unknown debt status answered
“no debts”; the unknown-parameter refusal covered only three verbs) and four minors (the
read-only instance answered 500, the contract’s wording on the close date and the three-word
rule, a reused client id with other words, the log rows lost by a restore). All closed, and the
summariser now refuses an account that is mostly repetition instead of closing the cycle on it.
ambrogio-memory: the third test round (2026-10-21)
Four rough edges found by the same tester: an empty fourth snapshot, a rename with the wrong
field counted as applied, a budget that looked like a ceiling, and render recreating the
retired root files. All closed in 0baa1de, together with the two read-storm questions (the
archive list carries no bodies; the register pages). The briefing itself had two errors — the
restore must run before the service starts, and stderr is empty at the default log level.
ambrogio-memory: the fourth round, the safety net (2026-10-21)
A fresh subagent restored the backup and rendered it again. The restore was not faithful:
the export banner replaced the state preamble, every document lost a trailing newline, the
archive span and order were lost, and verify compared the wrong tree and could never
return zero. Fixed in bf95892, with meta.json per cycle and a byte-identical
restore/render round trip. The served skill’s one-byte difference was jq -r, not the
service.
ambrogio-memory: the fifth round (2026-10-21)
Two findings: eleven debts were in a status the API itself rejects (“in progress”, with a
space, from the old register), invisible to every filter and counted by the open counter; and
a list’s count was the page, not the total. Fixed in 0005019 (import normalisation, a
one-time UPDATE, and total beside count).
ambrogio-memory: the sixth round (2026-10-21)
Five findings, all in the edges: the search limit was per source, the lists answered with a
cursor they refused, a restore renumbered the cycles, the index under-declared the parameters,
and verify failed on a memory directory with no export yet. Fixed in 476fdc1; the
restore/render round trip stays at zero differences.