Skip to content

backlog(B-0806 iter-7 P2): Ansible+GitOps + Crossplane composition — cross-OS declarative management for Windows + Macs#5129

Merged
AceHack merged 2 commits into
mainfrom
otto-cli/b0806-ansible-gitops-crossplane-cross-os-2026-05-26
May 26, 2026
Merged

backlog(B-0806 iter-7 P2): Ansible+GitOps + Crossplane composition — cross-OS declarative management for Windows + Macs#5129
AceHack merged 2 commits into
mainfrom
otto-cli/b0806-ansible-gitops-crossplane-cross-os-2026-05-26

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented May 26, 2026

Summary

Iter-7 capstone capturing the maintainer's 2026-05-26 substrate-engineering pull:

  • "This is good for declarative oses other than nix like id love to have it setup my windows machines and macs. ansible gitops"
  • "it's like cross plane too kinda"

End-state architecture (4-reconciler shape)

git (single source of truth)
├── k8s/applications/    → ArgoCD pulls → applies to K8s            (exists)
├── nixos/flake.nix      → autoUpgrade pulls → nixos-rebuild switch (B-0801)
├── ansible/playbooks/   → ansible-pull cron pulls → applies to OS  (NEW — iter-7)
└── crossplane/          → Crossplane controller pulls → external APIs (NEW — iter-7)

Each substrate class has one reconciler; all share git as source of truth. Composes with .claude/rules/m-acc-multi-oracle-end-user-moral-invariants.md at substrate-class scope.

Key recommendations captured

  • Pattern 3 (ansible-pull) for OS substrate — rejects Pattern 1 Operator (K8s host required + network reachability concern) + Pattern 2 Webhook AAP (commercial cost). Pull-from-host matches NixOS autoUpgrade analog.
  • Crossplane for cluster-external infra — extends existing ArgoCD substrate rather than adding a second control plane.

6 design questions for the maintainer (sub-target-blocking)

Pull cadence, branch model, secret handling, ansible-bootstrap, state observability, conflict handling — all documented in the row body as substrate-engineering decisions to land before iter-7 sub-target work begins.

Composes with

  • B-0794 (iter-5.4 homelab gh-auth — enables host→git auth for the pull side)
  • B-0800–B-0805 (iter-6 cluster-update arc)
  • B-0805 capstone (dep-pin discipline applies to ansible collections + Crossplane providers too)

🤖 Generated with Claude Code

…larative management for Windows + Macs + non-NixOS Linux (the maintainer 2026-05-26)

The maintainer 2026-05-26 substrate-engineering pull:
- "This is good for declarative oses other than nix like id love to have it
  setup my windows machines and macs. ansible gitops"
- "it's like cross plane too kinda"

Today's substrate covers NixOS (cluster nodes via flake.nix) + macOS-laptops
(install.sh imperative) + Debian/Ubuntu-Linux (install.sh imperative) but:
- macOS state isn't declaratively-defined (only tooling is)
- Windows has no substrate at all
- External infrastructure outside K8s is operator-imperative

Three substrate-engineering directions converge: Ansible (cross-OS host
config), Crossplane (external infra as K8s CRDs), ArgoCD (K8s manifests
only — existing). Combined end-state: 4-reconciler shape where everything
is in git + each substrate class has one reconciler:

  git → ArgoCD     → K8s workloads
  git → NixOS rebuild → cluster nodes
  git → ansible-pull → heterogeneous OS (macOS/Windows/non-NixOS Linux)
  git → Crossplane  → cluster-external infrastructure (cloud, DNS, etc.)

Recommendation captured: Pattern 3 (ansible-pull) for OS substrate
(rejecting Pattern 1 Operator + Pattern 2 Webhook AAP due to cost +
infrastructure burden). Crossplane for external-infra (extends existing
ArgoCD substrate). Both compose with iter-6 cluster-update arc.

Decomposed into 5 sub-targets (each filing as sibling B-NNNN at impl):
- Sub-target 1: macOS ansible-pull substrate
- Sub-target 2: Windows ansible-pull substrate (NEW substrate; opens Zeta
  to Windows-running maintainers)
- Sub-target 3: Crossplane bootstrap as ArgoCD app
- Sub-target 4: non-NixOS Linux ansible-pull
- Sub-target 5: dep-pin discipline encoding for ansible-galaxy + Crossplane
  provider versions (per B-0805)

6 design questions for the maintainer captured as sub-target-blocking:
pull cadence, branch model, secret handling, bootstrapping the bootstrap,
state observability, conflict handling.

This is iter-7 scope (post-iter-6 cluster-update arc). Row captures the
architectural direction + recommendations while iter-6 is still queued.

Per `.claude/rules/no-directives.md`: row articulates options + recommendation;
the maintainer integrates the picks before iter-7 implementation begins.

Co-Authored-By: Claude <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 26, 2026 08:19
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@AceHack AceHack enabled auto-merge (squash) May 26, 2026 08:19
…n-1 rejection per maintainer 2026-05-26 (K8s always present + support both)

Two maintainer-supplied refinements after the row's initial filing:

(1) "it would be ansible combined with ace package manager ../scratch
    install.sh like setup for those oses and our declarative package
    management"

Added Ace package manager (B-0288, in-progress) as the cross-OS package
layer that ansible-pull/Operator invokes. The combined architecture is
three layers:
  ansible/playbooks/     [orchestration / reconciliation]
    invokes →
  Ace package manager    [cross-OS package layer]
    reads →
  tools/setup/manifests  [install.sh-style declarative source]

ansible orchestrates, Ace installs, manifests declare. Each layer
has one job. Ansible+GitOps is NOT a replacement for the package
layer Zeta is building separately.

(2) "we are alwasy going to have k8s i don't mind the coupling but we
    can support both"

Relaxed the Pattern-1 (Operator) rejection. K8s is always present in
Zeta's substrate (the full-ai-cluster is the cluster substrate; not
optional), so K8s-coupling is NOT a rejection criterion. Recommendation
updated: support BOTH Pattern-1 (Operator) AND Pattern-3 (ansible-pull).
Pattern-2 (commercial AAP) stays rejected on cost.

Architectural diagram updated to show the three-layer composition inside
the ansible-pull branch. Composes_with frontmatter adds B-0288.

Co-Authored-By: Claude <noreply@anthropic.com>
@AceHack AceHack merged commit cc143ba into main May 26, 2026
28 of 29 checks passed
@AceHack AceHack deleted the otto-cli/b0806-ansible-gitops-crossplane-cross-os-2026-05-26 branch May 26, 2026 08:23
AceHack added a commit that referenced this pull request May 26, 2026
…-search-first-authority (3-anchor empirical evidence 2026-05-26) (#5131)

* rule: verify-existing-substrate-before-authoring (sibling to dep-pin-search-first-authority) — 3-anchor empirical evidence from session 2026-05-26

Single 2026-05-26 session produced 3 same-root-cause failures
("Otto-defaults-to-plausible-but-unverified" at substrate-authoring
scope):

ANCHOR 1: cascade #4 ISO audit (PR #5119) asserted boot/grub/grub.cfg
without verifying NixOS-actual layout (isolinux + refind). Blocked 4
ISO builds. Fixed via PR #5125. Covered by dep-pin-search-first-
authority rule landed PR #5126.

ANCHOR 2: B-0806 backlog row (PR #5129) authored Ace section as if Ace
were just "a package manager CLI" without reading docs/agendas/ace-
package-manager/AGENDA.md + project memory + 7+ related backlog rows.
The maintainer 2026-05-26: "that is what ace has been since we first
talked about it you just keep forgetting we have substantial backlog
around this". Fixed via PR #5130.

ANCHOR 3: B-0806 hat/fork-negotiation NOT integrated into architecture
even after Anchor-2 correction. The maintainer 2026-05-26: "i'm
assuming you have the hat / fork negoation for ace too". Fixed via
PR #5130 follow-on commit.

Same root cause class as the dep-pin rule, but at a DIFFERENT surface:
this is substrate-authoring scope (backlog rows, rules, skills,
architectural framings), not version-pin scope. dep-pin-search-first-
authority + this rule + fighting-past-self-vs-peer-agent compose to
cover the surfaces today's empirical evidence showed are vulnerable.

The rule auto-loads at cold-boot per wake-time-substrate.

Provides:
- Operational discipline: 4-step grep + read top hits + decide + cite
  inline
- Checklist template for inline substrate-inventory pass annotation
- All 3 empirical anchors preserved so future-Otto sees the cost of
  skipping
- Cross-references to dep-pin + fighting-past-self for full coverage

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(rule-ext): MD032 false-positive — "+ refind" parsed as list start; reword to "plus refind"

markdownlint MD032 fired on line 100 because the wrap-continuation
"+ refind, NOT legacy GRUB..." starts with `+ ` which is a valid
markdown list marker. Linter doesn't know this is a wrapped paragraph
continuation from line 99.

Reword "isolinux + refind" → "isolinux plus refind" to disambiguate.
No content change.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(rule-ext): 2 real Copilot findings on #5131 — content-grep + fixed-string discipline; 3rd (table double-pipe) is FP

(1) Earlier inventory snippet used filename/directory-name filtering
    (`find docs/agendas -type d | grep -i "$topic"`) which misses
    substrate that mentions the topic in CONTENT without the keyword in
    the filename. Should be content-search via grep -rl. Same gap for
    docs/trajectories/.

(2) Earlier snippet used `grep -E "$topic"` (regex) + unquoted shell
    globs (`memory/*${topic}*`). Both break when topic contains regex
    metacharacters (`+`, `.`, `B-NNNN`) or spaces. Use `grep -F`
    (fixed-string) for safety + content-search (no globs).

(3) Bonus fix: `.claude/skills/` was missing from the inventory surfaces
    even though skills are explicitly in-scope for the rule. Added.

3rd Copilot thread (table double-pipe at line 158/149) is the
documented known-FP class per `.claude/rules/blocked-green-ci-investigate-threads.md`
("Table double-pipe (`||`) ... 4 confirmed FPs in one session"). Direct
inspection of line 158 (`| Surface | Rule that catches it |`) confirms
single pipes; resolving that thread no-op per the suspect-by-default
discipline.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Lior <lior@zeta.dev>
Co-authored-by: Claude <noreply@anthropic.com>
@AceHack AceHack review requested due to automatic review settings May 26, 2026 08:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant