Author SHA1 Message Date
ic-builder fedc405800 COO-area chats: secrets tooling runs as TSGCOO Linux account
TSGCOO (docker group) operates the vault via /data2/TSGCOO/.local/bin/sm;
reachableceo crosses over with sudo -u TSGCOO (NOPASSWD, sudoers.d).
Ticket: https://projects.knownelement.com/issues/829
2026-09-06 17:26:40 -05:00
ic-builder 9fdec4fa0d retire the ~/.creds textfile pattern — Bitwarden via smcli only
Founder ruling 2026-09-06: all secrets via the TSGCOO vault through the
KNELSecretsManager Go CLI (sm); no upstream Rust bw, no textfile creds.
Legacy dir archived (root-only).

Ticket: https://projects.knownelement.com/issues/829
2026-09-06 17:21:48 -05:00
ic-builder 199bb26177 Cross-linking v2 + CR gating + KNEL repo naming rules
Gitea gets full Redmine URLs (#note-M anchors, never bare #NNN —
that resolves inside Gitea). GLPI CRs join the lockstep: CR filed
before the change, CR deep link required in PR bodies and tickets.
KNEL org repos all carry the KNEL prefix.

Standard: https://projects.knownelement.com/issues/820
2026-09-06 09:41:05 -05:00
+22 -7
View File
@@ -29,10 +29,11 @@ question (see Questions). Effective 2026-08-31.
## Hard rules
- ALL builds/tests through the repo's compose lifecycle services (pinned-builder `check`). NEVER run toolchains on the host. Host runs only git, docker, unix utils. NO dev.sh, NO Makefile — docker compose is the only lifecycle interface (k8s/gitops-portable; template: go-cli-mcp-template #578).
- Secrets: ONE place — ~/.creds (0600 env files). NEVER in repos, images, compose files, app databases, logs, or error strings. Configs hold refs (env:/file:), never material.
- Secrets: ONE place — the TSGCOO Bitwarden vault, accessed ONLY via the KNELSecretsManager Go CLI (`sm`, container ukrrs-secretsmgr-cli). RULING 2026-09-06: the legacy ~/.creds textfile pattern is RETIRED and ARCHIVED (/root/knel-creds-archive-20260906.zip, 400) — no new textfile creds, no upstream Rust bw CLI. NEVER in repos, images, compose files, app databases, logs, or error strings.
- COO-area chats run secrets tooling AS the TSGCOO Linux account (/data2/TSGCOO, docker group — no sudo; cross-over: `sudo -u TSGCOO`, NOPASSWD). Entry: /data2/TSGCOO/.local/bin/sm. Ruling 2026-09-06.
- Host hygiene (ruling 2026-08-31, RETIRES the old curl ban): common shell commands on the host are fine, curl included. NOT fine: package installs on the host (apt-get/pip/etc) or piling work/toolchains onto it — ALL work runs in containers (python inside dev/build containers is fine). Keep the host a thin, clean layer.
- Missing CLI on the host? DOCKER PULL IT (ruling 2026-08-31, standing permission): agents may pull tooling images freely — anything that makes the work easier (jq, ripgrep, etc. already fine from host; grab whatever else via `docker run --rm <pinned-or-digest image>`). No permission needed; never apt/pip instead.
- New gitea repos default to PUBLIC (ruling 2026-08-31): create with `--private=false`; go private only when the human asks or the content demands it (secrets are never repo content anyway — ~/.creds is the only home for those).
- New gitea repos default to PUBLIC (ruling 2026-08-31): create with `--private=false`; go private only when the human asks or the content demands it (secrets are never repo content anyway — the Bitwarden vault (via `sm`) is the only home for those).
- NO Python from agents, ever (ruling 2026-08-31, human preference): ALL text/JSON/CSV processing = bash, sed, awk, perl, cut, jq, sort/uniq. Never python one-liners; HTTP = curl. Same rule for anything you hand the human: shell only.
- 100% compose lifecycle: every container is a compose service with container_name; storage in named volumes; no ad-hoc docker run for services, no manual renames. Scoped ops only — NEVER bare `down`.
- Image tags: digests or pinned versions, NEVER :latest.
@@ -43,6 +44,14 @@ question (see Questions). Effective 2026-08-31.
- PUSH AS YOU GO (ruling 2026-08-31, standing permission): agents commit AND push work as it lands — do not wait for the human. The human's primary monitoring surface is Redmine/Gitea/Discourse activity, not ssh to hosts or running crush. Never force-push; respect branch protections.
- pfv-tsys5 fleet rolls (ruling 2026-08-31): crush may reboot OTHER VMs on pfv-tsys5 (sectestbed fleet) via `qm` as needed. VM 5111 (the human workstation hosting crush sessions) reboots only when the human pulls the trigger. The PVE host itself NEVER reboots casually (NFS server for -02). Hardware window slipped to ~OCT 2026: presume VM 5111 stays 8 vCPU / 48G until that window — plan on interim values as the operating values.
- Locale (ruling 2026-08-31): human + fleet sit in TEXAS, America/Chicago (Central; UTC-5 in summer). Times the human says ("1638 CST") are Central local. Never re-derive weekday/date from UTC log strings — docker/journal print UTC = local +5h; e.g. 2026-08-31 is a Monday, "Friday" = 2026-09-04.
- Repo naming (ruling 2026-09-06): every repo in the KNEL org carries the KNEL prefix (CamelCase per KNELBMS/KNELIAC; KNELk8s is the sanctioned k8s spelling). Executed 2026-09-06 under [#819]; new repos MUST follow. Gitea keeps permanent redirects for old names, but canonical URLs are the prefixed ones.
## Production change management (CR gating — ruling 2026-09-06)
- EVERY production change files a GLPI CR BEFORE the change lands. CR deep link format: `https://cmdb.knownelement.com/front/change.form.php?id=N`.
- The PR body MUST reference the CR deep link; the Redmine ticket MUST reference the CR deep link. A PR without its CR link is not ready for review.
- CRs are solved only WITH verification evidence as a followup (what was checked, logs/URLs). Closed is human-only.
- Physical-plant / live-infra changes additionally need a Uptime Kuma maintenance window before apply.
## Enforcement (mechanical, belt and suspenders)
@@ -53,18 +62,24 @@ question (see Questions). Effective 2026-08-31.
## Systems of record
- Redmine = ALL work tracking (tickets, schedule, decisions-as-work-items). Reference `[#NNN]` in every commit. NEVER close a ticket without explicit human permission. Ticket-first inside repos (see gate above).
- Redmine = ALL work tracking (tickets, schedule, decisions-as-work-items). Every commit carries the full Redmine comment URL (`https://projects.knownelement.com/issues/NNN#note-M`) — never a bare `#NNN` (see Reference format below). NEVER close a ticket without explicit human permission. Ticket-first inside repos (see gate above).
- Discourse = long-form docs + durable decisions/rationale. Repo .md files are stubs pointing there (exceptions: AGENTS.md, STATUS.md, questions-v*.md, runbooks that must live beside code).
- No per-repo JOURNAL.md (ruling 2026-08-31): work lives in Redmine, decisions in Discourse. Existing repo JOURNALs are read-only history — do not extend.
- STATUS.md = agent-owned, git-tracked, SUPER SPARSE: active ticket #s + one-line state each + an Inbox for mid-task interrupts. No narrative, no history — Redmine has that. Point-in-time only.
## Cross-linking (gitea ↔ redmine ↔ discourse — always in lockstep)
## Cross-linking (gitea ↔ redmine ↔ discourse ↔ glpi — always in lockstep)
- Every gitea repo README links its Redmine project AND its Discourse doc/category.
- Every Redmine project overview links its gitea repo(s) AND Discourse category.
- Every Discourse doc/category links its gitea repo AND Redmine project.
- Per work item: ticket ↔ Discourse doc ↔ PR/commit ([#NNN] in subject or body).
- Links are created AT BIRTH of any artifact and updated in the same turn the work lands. Anyone landing on ANY of the three must reach the other two in one click. An artifact without its links is not done.
- Per work item: ticket ↔ Discourse doc ↔ PR/commit ↔ CR. Redmine ticket comments MUST carry the full Gitea commit/PR URLs (clickable). Discourse posts link the CR, the commit and the ticket.
- Links are created AT BIRTH of any artifact and updated in the same turn the work lands. Anyone landing on ANY of the systems must reach the others in one click. An artifact without its links is not done.
## Reference format (ruling 2026-09-06 — no bare `#NNN` in Gitea)
- In Gitea (commit messages, PR bodies, comments), a bare `#NNN` resolves against Gitea's OWN issue tracker — it NEVER links Redmine. All Redmine references in Gitea are FULL URLs, and the URL of record is the issue COMMENT anchor: `https://projects.knownelement.com/issues/NNN#note-M`.
- In Redmine, bare `#NNN` is correct (resolves locally). Gitea artifacts referenced FROM Redmine use full URLs: `https://git.knownelement.com/KNEL/<Repo>/commit/<sha>`.
- Rule of thumb: whichever system you are writing IN gets the short form; every OTHER system gets the full clickable URL.
## Commit messages (ruling 2026-09-01)
@@ -101,5 +116,5 @@ question (see Questions). Effective 2026-08-31.
- All LLM traffic flows through the gateway (z.ai plan is the shared, metered budget: demand shaping is fleet-wide; per-request policy ladder normal -> peak -> cooldown -> hard; /status publishes the signal).
- There are NO per-key quotas; never mint credentials. Identity is platform-level; X-Consumer is attribution only.
- Master key stays env-only (~/.creds/gateway.env), ops/bootstrap only.
- Master key stays vault-only (KNELSecretsManager `sm`), ops/bootstrap only.
- Gateway repo work follows its own promote.sh pipeline; see tiers above.