diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9434215 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +# KNEL/cloudron — credential REFS only. +# Material secrets live in ~/.creds (0600). NEVER commit real values here. +# +# Pending founder ask (#685/#727): Cloudron API token. +# When issued, store the material value in ~/.creds/cloudron.env as: +# CLOUDRON_API_TOKEN= +CLOUDRON_API_TOKEN= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cf38fee --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.crush/ +*.log +.tmp/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..96db1f6 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,50 @@ +# AGENTS.md — KNEL/cloudron (tsys-cloudron / my.knownelement.com) + +Fleet-machine repo for the production Cloudron host. Layering: global +`~/.zcode/AGENTS.md` < `KNEL/PFVCluster/AGENTS.md` < this file. The global +rules (ticket-governed work, push-as-you-go, Discourse as doc SoR, secrets in +`~/.creds` only) all apply; this file adds host specifics only. + +## Agent authority (non-negotiable) + +- No work without an approved Redmine ticket (project 88, Cloudron). + Ticket-first: `echo '#NNN' > .crush/active-ticket`. +- Propose, never implement — findings become Feedback sub-tickets. +- NEVER close a ticket; NEVER 100% done-ratio — founder UAT gates "done". +- Production mutations only when the ticket says so; rollback documented + in the ticket BEFORE the change (see #685 notes for the pattern). + +## Access (SSH-only, NON-NEGOTIABLE) + +- SSH `root@my.knownelement.com` is the ONLY access path. No panel + back-channels, no guest-agent (qemu guest exec is banned fleet-wide). +- ALL ssh/scp routes through the chokepoint (from a PFVCluster checkout): + + ```bash + VM_IP=my.knownelement.com VM_USER=root bash tests/remote.sh vm '' # quick reads, timeout 30 + VM_IP=my.knownelement.com VM_USER=root bash tests/remote.sh vm-file