feat: Phase 1 FDA host-operator Role and railiance01 pilot (WP-0009 T02–T07)
Some checks failed
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
ci / test (push) Failing after 9s

Lock DEC-FDA-001 working defaults; add roles/host-operator package with
OS/security and load protocols; scaffold eng-coulomb-railiance01-ho-001
with bound agent, vault, ramp checklists, and Kai quote/ledger.
This commit is contained in:
tegwick 2026-07-16 10:47:52 +02:00
parent ca7e4ead77
commit 2d347d062f
31 changed files with 1171 additions and 58 deletions

View file

@ -347,6 +347,9 @@ Schema: [integrations/schedule-schema.md](integrations/schedule-schema.md).
- [ADR-005: Scheduled Agent Execution](adr/ADR-005-scheduled-agent-execution.md)
- [ADR-006: Customer Engagement Convention](adr/ADR-006-customer-engagement-convention.md)
- [Forward-Deployed Engagement Architecture](forward-deployed-engagement-architecture.md) — client-requestable Roles, ramp-up/down, client vaults
- [DEC-FDA-001 working defaults](decisions/DEC-FDA-001-working-defaults.md)
- [roles/host-operator](../roles/host-operator/) — first Role package (pilot)
- [engagements/pilots/eng-coulomb-railiance01-ho-001](../engagements/pilots/eng-coulomb-railiance01-ho-001/) — Phase 1 pilot tree
- [wiki/ForwardDeployedAgencyBusinessModel.md](../wiki/ForwardDeployedAgencyBusinessModel.md) — Kai trial currency, seats/duties, confidentiality
- [wiki/EcosystemIntegration.md](../wiki/EcosystemIntegration.md) — two-layer measurement model
- [WP-0002: Agency Framework](../workplans/kaizen-agentic-WP-0002-agency-framework.md)

View file

@ -0,0 +1,77 @@
# DEC-FDA-001 — Forward-deployed agency working defaults
**Status:** accepted (working default; sponsor may override)
**Date:** 2026-07-16
**Workplan:** KAIZEN-WP-0009-T02
**Deciders:** kaizen-agentic (implementation default for Phase 1 pilot)
## Context
Architecture open questions blocked Phase 1 scaffolding. We lock **working
defaults** so host-operator @ railiance01 can proceed without waiting on a
separate product decision cycle. Overrides are welcome; change this DEC and
bump architecture/business model versions.
## Decisions
### D1 — Kai ledger home
**Decision:** Phase 1 uses a **file-based JSONL ledger** at
`engagements/.../commercial/ledger.jsonl` (schema in architecture §10).
No State Hub extension and no finance-system integration in Phase 1.
**Rationale:** Offline, reviewable, zero new infrastructure; enough to prove
unit economics before EUR.
### D2 — Engagement store placement
**Decision:**
| Artifact | Location |
|----------|----------|
| Role packages (supplier IP) | `kaizen-agentic/roles/<role-id>/` |
| Pilot engagement tree | `kaizen-agentic/engagements/pilots/<engagement-id>/` |
| Future production client vaults | Client-owned repo (e.g. railiance-hosts or dedicated ops-engagements); pilot may be **copied** out later |
**Rationale:** Keep Phase 1 self-contained in the supplier repo for iteration.
Client-owned vault remains the confidentiality rule; pilot path is scaffolding,
not a claim of ownership of operational knowledge.
### D3 — Multi-target binding
**Decision:** **One Engagement, N Targets.** One bound agent definition;
baselines and findings are per-target under `vault/baselines/<target-id>.md`.
Pilot has N=1 (`railiance01`).
### D4 — Metrics sharing with supplier optimizer
**Decision:** **Opt-in, default off.** Pilot does not publish vault content or
raw metrics to supplier optimizer. Local `.kaizen/metrics` or engagement
`reports/` only. Shared aggregates require `contribute_metrics: approved` on
the engagement record (not set for pilot).
### D5 — Craft base for host-operator
**Decision:** `base_agent: sys-medic`. Bound definition may start as sys-medic
prompt + engagement binding appendix; Role package owns charter, protocols, and
memory template.
### D6 — Privilege policy
**Decision:** `privileged_ops`, package upgrade, firewall change, and reboot
require **recorded human approval** in the vault session log before execution.
Observe-class work does not.
## Consequences
- Phase 1 pilot proceeds under `engagements/pilots/eng-coulomb-railiance01-ho-001/`
- Architecture and business model docs promote to **v0.2 (working accepted)**
- ADR-007 may later elevate these defaults to fleet convention (T11)
## Related
- [forward-deployed-engagement-architecture.md](../forward-deployed-engagement-architecture.md)
- [ForwardDeployedAgencyBusinessModel.md](../../wiki/ForwardDeployedAgencyBusinessModel.md)
- KAIZEN-WP-0009

View file

@ -1,10 +1,12 @@
# Forward-Deployed Engagement Architecture
**Status:** draft specification v0.1
**Status:** v0.2 working accepted (DEC-FDA-001 defaults)
**Date:** 2026-07-16
**Type:** architecture extension (not yet an accepted ADR)
**Type:** architecture extension (ADR-007 optional later — WP-0009 T11)
**Companion business model:** [wiki/ForwardDeployedAgencyBusinessModel.md](../wiki/ForwardDeployedAgencyBusinessModel.md)
**Decisions:** [docs/decisions/DEC-FDA-001-working-defaults.md](decisions/DEC-FDA-001-working-defaults.md)
**Extends:** ADR-002 (memory), ADR-003 (protocols), ADR-005 (schedule), ADR-006 (customer engagement)
**Pilot tree:** `engagements/pilots/eng-coulomb-railiance01-ho-001/`
---
@ -681,18 +683,27 @@ kaizen-agentic once pilot checklist passes twice.
## 15. Open technical questions
1. Single monorepo path `engagements/` vs dedicated client engagement repo per company?
(**Recommend:** dedicated client repo or subdirectory in existing ops repo — e.g. railiance-hosts or a new `coulomb-ops-engagements`.)
2. Should bound definitions be signed (supply-chain) for production host ops?
3. Multi-target engagements: one agent definition vs. one per host?
(**Recommend:** one engagement, N targets, N baseline files.)
4. How aggressively to share metrics aggregates with supplier optimizer by default?
(**Recommend:** off until opt-in flag on engagement.)
Resolved for Phase 1 by [DEC-FDA-001](decisions/DEC-FDA-001-working-defaults.md):
| Question | Working default |
|----------|-----------------|
| Engagement store | Pilot under `engagements/pilots/` in kaizen-agentic; production vaults client-owned later |
| Multi-target | One engagement, N targets, N baseline files |
| Metrics to supplier optimizer | Opt-in, default off |
| Kai ledger | File JSONL under engagement `commercial/` |
Still open (non-blocking):
1. Should bound definitions be signed (supply-chain) for production host ops?
2. When to copy pilot vault to a client-owned repo for pure custody?
---
## Related documents
- [DEC-FDA-001](decisions/DEC-FDA-001-working-defaults.md)
- [roles/host-operator](../roles/host-operator/)
- [pilot engagement](../engagements/pilots/eng-coulomb-railiance01-ho-001/)
- [wiki/ForwardDeployedAgencyBusinessModel.md](../wiki/ForwardDeployedAgencyBusinessModel.md)
- [agency-framework.md](agency-framework.md)
- [adr/ADR-006-customer-engagement-convention.md](adr/ADR-006-customer-engagement-convention.md)

10
engagements/README.md Normal file
View file

@ -0,0 +1,10 @@
# Engagements
File-based **forward-deployed agency** engagements (KAIZEN-WP-0009, DEC-FDA-001).
| Path | Purpose |
|------|---------|
| `pilots/` | Supplier-repo Phase 1 pilot trees (scaffolding; operational knowledge still treated as client-confidential) |
| (future) client repos | Production vaults under client custody |
See [docs/forward-deployed-engagement-architecture.md](../docs/forward-deployed-engagement-architecture.md).

View file

@ -0,0 +1,51 @@
apiVersion: kaizen.agentic/v1
kind: Engagement
metadata:
id: eng-coulomb-railiance01-ho-001
request_id: engreq-coulomb-railiance01-ho-001
created: "2026-07-16"
updated: "2026-07-16"
workplan: KAIZEN-WP-0009
status:
phase: staffing
# requested | quoting | funded | staffing | ramp_up | operating
# renewing | ramp_down | closed | cancelled
notes: "Phase 1 scaffold complete; pending access verify to enter ramp_up"
spec:
client:
id: coulomb
billing_account: coulomb-ops-kai
role:
id: host-operator
version: "0.1.0"
targets:
- kind: host
id: railiance01
agent_definition:
path: agent-host-operator.md
derived_from: roles/host-operator/agent-definition.md
base_craft: agents/agent-sys-medic.md
vault:
root: vault/
memory: vault/memory.md
schedule:
path: schedule.yml
checklists:
ramp_up: checklists/ramp-up-status.md
ramp_down: checklists/ramp-down-status.md
policy:
confidentiality: client_owned
contribute_metrics: false
contribute_lesson: false
human_approval_for:
- privileged_ops
- package_upgrade
- firewall_change
- reboot
redaction_profile: default-host-ops
commercial:
currency: kai
seat_product: expert_seat_4x
capability_tier: 4
ledger_ref: commercial/ledger.jsonl
quote_ref: commercial/quote.yaml

View file

@ -0,0 +1,33 @@
# Access plan — eng-coulomb-railiance01-ho-001
**Target:** host `railiance01`
**Classes requested:** `host_observe`, `privileged_ops` (gated)
**Secrets:** never stored in this tree
## Intended path
| Step | Action | Owner |
|------|--------|-------|
| 1 | Inventory / facts from `railiance-hosts` (read-only) | operator |
| 2 | SSH cert via ops-warden (`warden sign` / `cert_command`) identity hint `agt` | operator |
| 3 | Tunnel if needed (`ops-bridge`, e.g. state-hub-railiance01) | operator |
| 4 | Observe session: non-destructive health/load/os checks | host-operator agent |
| 5 | Privileged ops only after human approval recorded in vault | human + agent |
## Credential routing
- SSH certificates → **ops-warden**
- API keys / DB passwords → **OpenBao** via `warden route` (not this agent)
- Do **not** message ops-warden for secret values
## Verification log
| Date | Result | Notes |
|------|--------|-------|
| _pending_ | | RU-01 not yet complete |
## Revocation
| Date | Action |
|------|--------|
| _open_ | On ramp-down: stop renewing agent certs; set schedule disabled; mark here |

View file

@ -0,0 +1,105 @@
---
name: host-operator
engagement_id: eng-coulomb-railiance01-ho-001
role_id: host-operator
role_version: "0.1.0"
description: Host operator for railiance01 (coulomb pilot engagement)
category: infrastructure
memory: enabled
memory_path: engagements/pilots/eng-coulomb-railiance01-ho-001/vault/memory.md
targets:
- kind: host
id: railiance01
confidentiality: client_owned
phase: staffing
access_classes: [host_observe, privileged_ops]
human_approval_for: [privileged_ops, package_upgrade, firewall_change, reboot]
base_agent: sys-medic
model: inherit
---
# Session Start Protocol
1. Confirm engagement `eng-coulomb-railiance01-ho-001` and target **railiance01** only.
2. Read vault memory at `memory_path` (client confidential — do not copy into supplier `agents/`).
3. Read `access-plan.md` and `ENGAGEMENT.yaml` phase.
4. If phase is `ramp_up`, follow `roles/host-operator/ramp-up.md` and update `checklists/ramp-up-status.md`.
5. If phase is `operating`, run the scheduled duty protocol(s).
6. If phase is `ramp_down`, follow `roles/host-operator/ramp-down.md`.
7. Acknowledge charter, open threads, and last session log line in your opening brief.
8. Never store secrets, private keys, or API tokens in the vault or reports.
# Session Close Protocol
1. Update Host Profiles, OS & Patch State, Security Posture, Load & Workload Envelope as needed.
2. Update Recurring Findings / Cleared Issues / Open Threads.
3. Append Session Log: `YYYY-MM-DD · railiance01 · <key finding> · <outcome>`.
4. Write report under `reports/` for completed duties.
5. Bump memory frontmatter `last_updated` and `session_count`.
6. Append Kai ledger entry in `commercial/ledger.jsonl` for the duty (billing metadata only).
---
You are **Host Operator** for engagement **eng-coulomb-railiance01-ho-001**.
## Engagement binding
| Field | Value |
|-------|-------|
| Client | coulomb |
| Target | host `railiance01` (k3s production; forgejo/apps) |
| Role | host-operator 0.1.0 (tier 4) |
| Base craft | SysMedic (`agents/agent-sys-medic.md`) |
| Vault | `vault/` (client confidential) |
| Inventory anchor | `railiance-hosts` |
## Charter (pilot)
**In scope**
- OS package currency and reboot planning (with approval)
- Security hygiene: listeners, basic firewall posture, cert expiry awareness
- Load average, CPU, memory, disk; workload identification
- k3s node health signals (sys-medic protocol)
- Documentation in the engagement vault
- Recommendations and gated remediation proposals
**Out of scope**
- Application feature development
- Unilateral production data deletion
- Hosts other than railiance01
- Secret value retrieval into chat or git
- Expanding blast radius without engagement amendment
## Protocols
| Duty | Protocol path |
|------|----------------|
| Health assessment | `agents/protocols/sys-medic/k3s-node-health-assessment.md` |
| Load & workload | `roles/host-operator/protocols/load-workload-review.md` |
| OS & security | `roles/host-operator/protocols/os-security-pass.md` |
## Privilege gate
Before any of `privileged_ops`, `package_upgrade`, `firewall_change`, `reboot`:
1. Write an Action Proposal (blast radius, rollback, evidence)
2. Obtain human approval recorded in vault session log
3. Execute only within the approved scope
4. Record outcome under Cleared Issues or Findings
## Output quality
Use SysMedic report structure for assessments (Executive Summary, Health Status,
Findings, Safe Actions, Escalation, Suggested Commands). Prefer inspect commands
first; label change commands as optional and approval-gated.
## Full Role prompt
Operational principles and safety rules inherit from:
- `roles/host-operator/agent-definition.md`
- `agents/agent-sys-medic.md`
When instructions conflict, **engagement binding and safety gates win**.

View file

@ -0,0 +1,15 @@
# Ramp-down status — eng-coulomb-railiance01-ho-001
Source checklist: `roles/host-operator/ramp-down.md`
| ID | Criterion | Status | Evidence |
|----|-----------|--------|----------|
| RD-01 | Open threads triaged | todo | vault/memory.md Open Threads |
| RD-02 | Handoff pack written | todo | vault/handoff/README.md |
| RD-03 | Outstanding risks listed | todo | vault/handoff/risks.md |
| RD-04 | Access revoked | todo | access-plan.md |
| RD-05 | Schedule disabled | todo | schedule.yml |
| RD-06 | Client vault custody confirmed | todo | ENGAGEMENT.yaml note |
| RD-07 | Supplier workspace scrubbed | todo | operator attestation |
**Phase gate:** all `done` → set status.phase to `closed`; finalise ledger.

View file

@ -0,0 +1,16 @@
# Ramp-up status — eng-coulomb-railiance01-ho-001
Source checklist: `roles/host-operator/ramp-up.md`
| ID | Criterion | Status | Evidence |
|----|-----------|--------|----------|
| RU-01 | Access path verified | todo | access-plan.md |
| RU-02 | Host baseline documented | todo | vault/baselines/railiance01.md |
| RU-03 | Coach / orientation brief filed | done | reports/orientation.md (scaffold) |
| RU-04 | First health review complete | todo | reports/*-health-review.md |
| RU-05 | Security snapshot initial | todo | vault/memory.md Security Posture |
| RU-06 | Load envelope initial | todo | vault/memory.md Load & Workload Envelope |
| RU-07 | Escalation contacts confirmed | done | vault/memory.md Engagement Charter |
| RU-08 | Human approval path tested | todo | vault/session-log/ or session log |
**Phase gate:** all `done` → set `ENGAGEMENT.yaml` status.phase to `operating` and enable schedule entries.

View file

@ -0,0 +1,33 @@
# Commercial — Kai trial ledger
- **Quote:** [quote.yaml](quote.yaml) — month-1 estimate (~72800 Kai)
- **Ledger:** [ledger.jsonl](ledger.jsonl) — append-only charges/credits
- **Schema:** architecture §10 (`KaiLedgerEntry`)
## Rules
- No secrets or full shell transcripts in ledger lines
- Seat/ramp charges when phase transitions are accepted
- Duty charges on session close
- Empty account pauses new duties (ramp-down still allowed)
## Example duty charge
```json
{
"apiVersion": "kaizen.agentic/v1",
"kind": "KaiLedgerEntry",
"id": "kai-YYYYMMDDTHHMMSSZ-001",
"account": "coulomb-ops-kai",
"engagement_id": "eng-coulomb-railiance01-ho-001",
"type": "duty_charge",
"product": "standard_review",
"capability_tier": 4,
"access_surcharge_product": "host_observe",
"amount_kai": 1700,
"currency": "KAI",
"session_ref": "reports/YYYY-MM-DD-health-review.md",
"created_at": "YYYY-MM-DDTHH:MM:SSZ",
"metadata": {"target": "railiance01", "phase": "operating"}
}
```

View file

@ -0,0 +1 @@
{"apiVersion":"kaizen.agentic/v1","kind":"KaiLedgerEntry","id":"kai-20260716-quote-open","account":"coulomb-ops-kai","engagement_id":"eng-coulomb-railiance01-ho-001","type":"note","product":"quote_snapshot","capability_tier":4,"amount_kai":0,"currency":"KAI","created_at":"2026-07-16T08:00:00Z","metadata":{"total_quoted_kai":72800,"phase":"staffing","note":"Month-1 estimate recorded; no charge until fund/ramp"}}

View file

@ -0,0 +1,35 @@
# Kai quote — eng-coulomb-railiance01-ho-001 (trial month-1 estimate)
# FX calibration only: 1000 Kai ≈ 1 EUR list (see business model)
apiVersion: kaizen.agentic/v1
kind: KaiQuote
metadata:
engagement_id: eng-coulomb-railiance01-ho-001
created: "2026-07-16"
currency: KAI
trial: true
spec:
capability_tier: 4
account: coulomb-ops-kai
line_items:
- product: expert_seat_4x
description: Host-operator seat (1 month)
amount_kai: 10000
- product: ramp_up_package
description: Ramp-up (half tier weight per business model)
amount_kai: 10000
- product: standard_review
description: Daily review × 20 business days × tier 4
amount_kai: 32000
detail: "20 * 400 * 4"
- product: deep_assessment
description: Weekly OS/security × 4 × tier 4
amount_kai: 19200
detail: "4 * 1200 * 4"
- product: privileged_ops_surcharge
description: Est. 4 privileged sessions × 400
amount_kai: 1600
total_kai: 72800
notes:
- Internal coulomb quarterly grant illustrative budget 200000 Kai
- Actual charges posted to ledger.jsonl as duties complete
- Token pass-through waived for pure internal pilot

View file

@ -0,0 +1,33 @@
# Orientation brief — eng-coulomb-railiance01-ho-001
**Status:** scaffold (RU-03)
**Date:** 2026-07-16
## Context for host-operator
- First forward-deployed host-operator pilot for coulomb on **railiance01**
- Prior agency craft: sys-medic + k3s node health protocol
- Related ops docs live in `railiance-hosts` (inventory, forgejo-on-railiance01, ADR-004 runner)
- No prior engagement vault session history
## Coach notes
If project memories exist on related repos, run:
```bash
kaizen-agentic memory brief sys-medic --target <related-repo>
```
Paste relevant non-secret patterns here. Until then, treat baseline as empty and
build envelope from first observe session.
## Watch from inventory/docs (pre-memory)
- Single-node k3s production sensitivity
- Privileged runner/DinD implications
- Prefer observe-class first session
## RU-03 mark
When this file is accepted as orientation, mark RU-03 `done` in
`checklists/ramp-up-status.md` (scaffold counts as filed; refresh after first live session if needed).

View file

@ -0,0 +1,33 @@
apiVersion: kaizen.agentic/v1
kind: EngagementRequest
metadata:
id: engreq-coulomb-railiance01-ho-001
created: "2026-07-16"
spec:
client:
id: coulomb
domain_slug: railiance
billing_account: coulomb-ops-kai
role:
id: host-operator
version_constraint: ">=0.1.0 <1.0.0"
targets:
- kind: host
id: railiance01
inventory_ref: railiance-hosts
notes: "k3s production; forgejo/apps workloads; coulomb ecosystem"
duty:
health_review: daily
os_security_pass: weekly
load_review: daily
timezone: Europe/Berlin
access:
requested_classes: [host_observe, privileged_ops]
cert_identity_hint: agt
knowledge:
vault_placement: pilot_in_supplier_repo
confidentiality: client_owned
commercial:
currency: kai
trial: true
quote_requested: true

View file

@ -0,0 +1,25 @@
# Duty cadence for eng-coulomb-railiance01-ho-001
# activity-core wiring optional (Phase 3); manual prepare is enough for Phase 1
engagement_id: eng-coulomb-railiance01-ho-001
timezone: Europe/Berlin
entries:
- id: daily-health-load
agent: host-operator
duty: standard_review
protocols:
- load-workload-review
- k3s-node-health-assessment
cadence: daily
cron: "0 9 * * 1-5"
enabled: false
notes: "Enable after ramp_up exit (RU checklist complete)"
- id: weekly-os-security
agent: host-operator
duty: deep_assessment
protocols:
- os-security-pass
cadence: weekly
cron: "0 10 * * 1"
enabled: false
notes: "Privileged upgrades remain human-gated even when enabled"

View file

@ -0,0 +1,47 @@
# Baseline — railiance01
**Engagement:** eng-coulomb-railiance01-ho-001
**Status:** pending first observe session (RU-02)
**Last captured:** —
## Identity
| Field | Value |
|-------|-------|
| Hostname | railiance01 |
| Inventory | railiance-hosts |
| Notes | k3s production; forgejo/apps |
## Capture checklist (fill on first session)
```bash
hostname
uptime
uname -a
cat /etc/os-release
nproc
free -h
df -h
ss -tuln | head -40
# if k3s:
kubectl get node -o wide 2>/dev/null || k3s kubectl get node -o wide 2>/dev/null
```
## Recorded values
_To be filled during ramp-up._
## Known quirks (from docs, pre-session)
- Forgejo + in-cluster Actions runner documented in railiance-hosts ADR-004
- State Hub / activity-core historically deployed on this cluster path
- Access often via ops-bridge from workstation
## Envelope seed
| Metric | Baseline | Notes |
|--------|----------|-------|
| Load | | |
| Memory | | |
| Disk | | |
| Top workloads | | |

View file

@ -0,0 +1,13 @@
# Handoff pack — eng-coulomb-railiance01-ho-001
Filled during **ramp-down** (RD-02).
## Contents (when complete)
- Summary of how railiance01 was operated under this engagement
- Pointer to final baselines
- Open risks → `risks.md`
- Deferred patches and reboot debt
- Contacts and access revocation status
_Status: not started (engagement not in ramp_down)._

View file

@ -0,0 +1,7 @@
# Outstanding risks — eng-coulomb-railiance01-ho-001
_Populated during operate and finalised at ramp-down (RD-03)._
| Risk | Severity | Mitigation / owner | Status |
|------|----------|--------------------|--------|
| _none recorded_ | | | |

View file

@ -0,0 +1,74 @@
---
agent: host-operator
engagement_id: eng-coulomb-railiance01-ho-001
project: coulomb-railiance01
last_updated: "2026-07-16"
session_count: 0
confidentiality: client_owned
---
# Host Operator Memory — railiance01 pilot
## Engagement Charter
- **Duty:** Keep railiance01 operational and secure; OS currency; load and workload review
- **Cadence:** daily health/load (business days); weekly OS/security pass
- **Change windows:** prefer low-traffic periods; reboot only with human approval
- **Escalation:** coulomb / railiance human operator (Bernd / on-call as designated)
- **Out of scope:** app features; other hosts; secret vending
## Project Context
Coulomb ecosystem production host `railiance01` runs k3s and platform workloads
(including Forgejo/apps per railiance-hosts docs). This engagement is the first
forward-deployed host-operator pilot (KAIZEN-WP-0009).
## Host Profiles
| hostname | role | typical load | services | last review |
|----------|------|--------------|----------|-------------|
| railiance01 | k3s production | _TBD ramp-up_ | k3s, forgejo/apps (inventory) | never |
## OS & Patch State
_Pending first OS security pass (RU-05 / weekly protocol)._
## Security Posture
_Pending first security snapshot (RU-05)._
## Load & Workload Envelope
_Pending first load review (RU-06)._
## Accumulated Findings
_None yet._
## What Worked
_None yet._
## Watch Points
- Single-node production: privileged mistakes have full blast radius
- DinD / Actions runner privilege model on railiance01 (see railiance-hosts ADRs)
- Disk growth from images, logs, and backups
## Recurring Findings
_None yet._
## Cleared Issues
_None yet._
## Open Threads
- Complete RU-01 access verification
- Capture baseline `vault/baselines/railiance01.md`
- First health + load review report
## Session Log
<!-- YYYY-MM-DD · host(s) · key finding · outcome -->

21
roles/README.md Normal file
View file

@ -0,0 +1,21 @@
# Roles
Supplier-owned **Role** packages for the forward-deployed agency model.
A Role is a versioned product (craft + protocols + memory template + billing
hints). An **Engagement** binds a Role to a client and targets; see
[docs/forward-deployed-engagement-architecture.md](../docs/forward-deployed-engagement-architecture.md).
```
roles/
<role-id>/
ROLE.yaml
memory-template.md
ramp-up.md
ramp-down.md
protocols/ # optional; may also live under agents/protocols/
```
| Role | Tier | Status |
|------|------|--------|
| [host-operator](host-operator/) | 4× | pilot (KAIZEN-WP-0009) |

View file

@ -0,0 +1,61 @@
# Host Operator — supplier Role package
# See docs/forward-deployed-engagement-architecture.md §5.1
apiVersion: kaizen.agentic/v1
kind: Role
metadata:
id: host-operator
version: "0.1.0"
title: Host Operator
category: infrastructure
capability_tier: 4
status: pilot
spec:
description: >
Competent technical administrator for named Linux hosts — keep the system
operational and secure with up-to-date OS, regular review of system load,
and identification of demanding or overloading workloads.
base_agent: sys-medic
agent_definition_template: agent-definition.md
protocols:
- agent: sys-medic
slug: k3s-node-health-assessment
path: agents/protocols/sys-medic/k3s-node-health-assessment.md
- agent: host-operator
slug: os-security-pass
path: roles/host-operator/protocols/os-security-pass.md
- agent: host-operator
slug: load-workload-review
path: roles/host-operator/protocols/load-workload-review.md
memory_template: memory-template.md
default_cadence:
health_review: daily
os_security_pass: weekly
load_review: daily
timezone: Europe/Berlin
access_classes_allowed:
- read_only
- host_observe
- privileged_ops
ramp_up:
checklist_ref: ramp-up.md
exit_criteria:
- host_baseline_documented
- access_path_verified
- first_health_review_complete
- coach_orientation_filed
ramp_down:
checklist_ref: ramp-down.md
exit_criteria:
- handoff_pack_written
- open_threads_triaged
- access_revoked
- vault_export_confirmed
billing:
seat_product: expert_seat_4x
duty_weights:
standard_review: 1.0
deep_assessment: 1.0
pilot_targets:
- kind: host
id: railiance01
notes: coulomb k3s production node

View file

@ -0,0 +1,87 @@
---
name: host-operator
description: Technical host administrator — OS currency, security posture, load and workload review
category: infrastructure
memory: enabled
role_id: host-operator
role_version: "0.1.0"
base_agent: sys-medic
# Engagement binding fields are filled by staff/render (see pilot agent file)
# engagement_id, targets, memory_path, phase, access_classes, human_approval_for
---
# Session Start Protocol
1. Read engagement binding (frontmatter): targets, phase, access classes, vault path.
2. Load vault memory at `memory_path` (engagement vault — **client confidential**).
3. If phase is `ramp_up`, follow `roles/host-operator/ramp-up.md`.
4. If phase is `ramp_down`, follow `roles/host-operator/ramp-down.md`.
5. If phase is `operating`, select protocol by duty type (health, OS/security, load).
6. Acknowledge memory and charter in the opening brief.
7. Never place secrets, private keys, or long-lived tokens in the vault or reports.
# Session Close Protocol
1. Update Host Profiles, OS & Patch State, Security Posture, Load & Workload Envelope as needed.
2. Update Recurring Findings / Cleared Issues / Open Threads.
3. Append Session Log: `YYYY-MM-DD · <host(s)> · <key finding> · <outcome>`.
4. Write or update a client-visible report under `reports/` when a scheduled duty completes.
5. Bump `last_updated` and `session_count`.
6. Record metrics if configured; append Kai duty charge only to `commercial/ledger.jsonl` (no secrets).
---
You are **Host Operator**, a careful technical administrator for named Linux hosts
(often k3s production nodes in the coulomb / railiance ecosystem).
Your craft base is **SysMedic** (health assessment, evidence-driven diagnosis).
You extend that craft with **ongoing duty**: keep systems operational and secure,
with up-to-date OS, and regular review of load and workloads that may overload the host.
# Core Mission
For each assigned target host:
1. Maintain situational awareness (baseline, load envelope, security posture)
2. Detect degradation early (health, disk, memory, noisy workloads)
3. Keep OS and security hygiene current (with human gates for privileged change)
4. Document findings in the **engagement vault** (client-owned knowledge)
5. Propose safe remediation; execute only within access class and approval policy
# Principles
- Safety first; observe before acting
- Distinguish observation, diagnosis, recommendation, and action proposal
- Privileged ops require recorded human approval
- Operational knowledge stays in the engagement vault — do not copy into supplier public agents
- Prefer minimally disruptive remediation
- Credential routing via ops-warden / OpenBao — never invent secret vending
# What Good Output Looks Like
Same structure as SysMedic health reports when assessing:
1. Executive Summary
2. Health Status (Healthy / Watch / Degraded / Critical) + confidence
3. Findings (severity, evidence, why it matters, likely cause, next step)
4. Immediate Safe Actions
5. Escalation or Risk Notes
6. Suggested Commands (inspect first; change commands clearly labeled optional)
For **OS & security pass** and **load & workload review**, follow the Role protocols
under `roles/host-operator/protocols/`.
# Safety Rules
Never as a default:
- Unapproved kill/rm/reboot/drain
- Blind image or log deletion
- Storing secrets in git, vault markdown, or chat
- Expanding scope to hosts not listed in the engagement binding
# Related
- base craft: `agents/agent-sys-medic.md`
- protocols: `roles/host-operator/protocols/`, `agents/protocols/sys-medic/`
- architecture: `docs/forward-deployed-engagement-architecture.md`

View file

@ -0,0 +1,62 @@
---
agent: host-operator
engagement_id: "<set on init>"
project: "<engagement or client slug>"
last_updated: "<ISO date>"
session_count: 0
confidentiality: client_owned
---
# Host Operator Memory
## Engagement Charter
<!-- duty, change windows, escalation contacts, out-of-scope -->
## Project Context
<!-- Client, domain, why this engagement exists -->
## Host Profiles
<!-- hostname | role | typical load | services | last review -->
## OS & Patch State
<!-- distro | kernel | last update pass | deferred packages | reboot needed? -->
## Security Posture
<!-- listening services | firewall notes | cert expiry | known risks -->
## Load & Workload Envelope
<!-- CPU/mem/disk baselines | heavy jobs | saturation incidents -->
## Accumulated Findings
<!-- Patterns, recurring issues, key decisions -->
## What Worked
<!-- Approaches that produced good results -->
## Watch Points
<!-- Recurring risks, traps, or areas requiring extra care -->
## Recurring Findings
<!-- pattern · first seen · frequency -->
## Cleared Issues
<!-- what was done · when · outcome -->
## Open Threads
<!-- Things noticed but not yet acted on -->
## Session Log
<!-- YYYY-MM-DD · host(s) · key finding · outcome -->

View file

@ -0,0 +1,103 @@
---
agent: host-operator
slug: load-workload-review
title: Load and Workload Review
version: 0.1.0
last_updated: "2026-07-16"
---
# Load and Workload Review
## Purpose
Regular review of system load and identification of workloads that are demanding
or may overload the host. Establishes and updates the **load envelope** in memory.
## Scope
- Load average vs CPU count
- Memory pressure and swap
- Disk I/O and filesystem fill
- Top processes and (if k3s) top pods
- Job/cron/backup overlap risks
- Comparison to prior baseline envelope
## Prerequisites
- Observe-class shell access
- Tools: `uptime`, `nproc`, `free`, `vmstat`, `ps`, `df`, optionally `iostat`,
`kubectl`/`k3s kubectl`
---
## Procedure
### Step 1 — Instant load picture
```bash
uptime
nproc
free -h
swapon --show
df -h
```
Interpret load average relative to `nproc` (rule of thumb: sustained load ≫ cores → Watch/Degraded).
### Step 2 — Top consumers
```bash
ps aux --sort=-%cpu | head -15
ps aux --sort=-%mem | head -15
```
### Step 3 — Optional I/O and VM
```bash
vmstat 1 5
iostat -xz 1 3 2>/dev/null || true
```
### Step 4 — Kubernetes workloads (if present)
```bash
kubectl top nodes 2>/dev/null || true
kubectl top pods -A --sort-by=memory 2>/dev/null | head -25 || true
kubectl top pods -A --sort-by=cpu 2>/dev/null | head -25 || true
kubectl get pods -A --field-selector spec.nodeName=$(hostname) 2>/dev/null | head -40 || true
```
### Step 5 — Envelope update
In vault memory `## Load & Workload Envelope`, record:
| Field | Example |
|-------|---------|
| Typical load (1/5/15) | 0.4 / 0.5 / 0.6 on 4 cores |
| Peak seen | … |
| Heavy workloads | forgejo runner, backups, … |
| Saturation incidents | date · symptom · resolution |
| Headroom notes | disk 40% free; mem OK |
### Step 6 — Demand flags
Flag as findings when:
- Sustained load > cores without known batch job
- Memory available critically low or swap thrash
- Disk > 85% on critical mounts
- Single pod/process dominating resources without request/limit awareness
- Concurrent heavy jobs (backup + build + migrate)
## Output template
```markdown
# Load & Workload Review — <hostname><date>
## Summary
## Load vs capacity
## Top consumers
## Envelope delta (vs last review)
## Overload / demand risks
## Recommended next steps (safe first)
```

View file

@ -0,0 +1,116 @@
---
agent: host-operator
slug: os-security-pass
title: OS and Security Pass
version: 0.1.0
last_updated: "2026-07-16"
---
# OS and Security Pass
## Purpose
Weekly (or on-demand) review of OS currency and basic security posture on a
named Linux host. Produces deferred-package notes, reboot planning, and
security findings without applying privileged changes unless approved.
## Scope
- Package update availability and critical security updates
- Kernel vs running kernel (reboot-needed signal)
- Listening services and unexpected open ports
- Basic firewall / packet filter presence (if tools available)
- SSH and admin session leftovers (observe)
- TLS/cert expiry awareness where local files or cluster ingress are visible
- User accounts with recent login activity (observe)
## Prerequisites
- Observe-class shell access (or better)
- Tools as available: `uname`, package manager (`apt`/`dnf`/`apk`), `ss`/`netstat`,
`systemctl`, `journalctl`, `timedatectl`, `needrestart` (if present)
- **Do not** run upgrades or firewall changes without human approval record
---
## Procedure
### Step 1 — Identity and time
```bash
hostname
uname -a
cat /etc/os-release 2>/dev/null || true
timedatectl 2>/dev/null || date
uptime
```
### Step 2 — Package currency (read-only first)
Debian/Ubuntu example:
```bash
# Refresh metadata only if approved for network use; else report last cache age
apt-get -s upgrade 2>/dev/null | tail -20
# or
apt list --upgradable 2>/dev/null | head -40
```
Record:
- Count of upgradable packages (if known)
- Security-related package names if identifiable
- Whether reboot is likely required (`needrestart -b` or kernel package pending)
### Step 3 — Listening services
```bash
ss -tulpn 2>/dev/null || ss -tuln
```
Flag unexpected public listeners; compare to prior baseline.
### Step 4 — Auth and session hygiene
```bash
who
last -n 15 2>/dev/null || true
# Failed auth samples (careful with log volume)
journalctl -u ssh --since "7 days ago" -p err --no-pager 2>/dev/null | tail -30
```
### Step 5 — Local firewall signal
```bash
systemctl is-active ufw nftables firewalld 2>/dev/null || true
nft list ruleset 2>/dev/null | head -5 || iptables -L -n 2>/dev/null | head -20 || true
```
Note presence/absence; do not rewrite rules in this pass without approval.
### Step 6 — Cluster-adjacent security (if k3s)
```bash
# Node conditions only; no secret dumps
kubectl get node -o wide 2>/dev/null || k3s kubectl get node -o wide 2>/dev/null || true
```
### Step 7 — Report
Update vault:
- `## OS & Patch State`
- `## Security Posture`
- Findings with severity
- Explicit list of **proposed** privileged actions (upgrades, reboots) awaiting approval
## Output template
```markdown
# OS & Security Pass — <hostname><date>
## Summary
## OS currency
## Security findings
## Proposed privileged actions (awaiting approval)
## Deferred / accepted risk
```

View file

@ -0,0 +1,24 @@
# host-operator — Ramp-down checklist
**Phase:** `ramp_down`
**Exit:** all RD-* complete → set engagement phase to `closed`
| ID | Criterion | Evidence path |
|----|-----------|---------------|
| RD-01 | Open threads triaged | Memory `## Open Threads` resolved or transferred |
| RD-02 | Handoff pack written | `vault/handoff/README.md` + baselines export |
| RD-03 | Outstanding risks listed | `vault/handoff/risks.md` |
| RD-04 | Access revoked / certs not renewed | `access-plan.md` “revoked at …” |
| RD-05 | Schedule disabled | `schedule.yml` entries `enabled: false` |
| RD-06 | Client confirms vault custody | Note in `ENGAGEMENT.yaml` or handoff |
| RD-07 | Supplier workspace scrubbed | No client vault copies outside engagement tree policy |
## Procedure
1. Freeze new duties; finish in-flight session.
2. Triage open threads (human transfer or new engagement).
3. Write handoff: baseline summary, known risks, deferred patches, how we operate the host.
4. Disable schedules; revoke agent access paths.
5. Confirm vault remains under client custody policy (pilot: export if moving out of supplier tree).
6. Scrub any ad-hoc copies outside the engagement vault.
7. Charge ramp-down Kai package; finalise ledger; set phase `closed`.

View file

@ -0,0 +1,26 @@
# host-operator — Ramp-up checklist
**Phase:** `ramp_up`
**Exit:** all RU-* complete with evidence → set engagement phase to `operating`
| ID | Criterion | Evidence path |
|----|-----------|---------------|
| RU-01 | Access path verified | `access-plan.md` + note of successful observe session |
| RU-02 | Host baseline documented | `vault/baselines/<host>.md` |
| RU-03 | Coach / orientation brief filed | `reports/orientation.md` (or N/A if no prior memories) |
| RU-04 | First health review complete | `reports/YYYY-MM-DD-health-review.md` + session log line |
| RU-05 | Security snapshot initial | Memory `## Security Posture` non-empty |
| RU-06 | Load envelope initial | Memory `## Load & Workload Envelope` non-empty |
| RU-07 | Escalation contacts confirmed | Memory `## Engagement Charter` |
| RU-08 | Human approval path tested | Dry-run privileged proposal logged in `vault/session-log/` or session log |
## Procedure
1. Read bound agent definition and this checklist.
2. Verify access (warden/cert/ops-bridge) — **no secrets in vault**.
3. Run baseline capture (OS, disk, memory, load, top workloads, k3s if present).
4. Run first health + load review (protocols: load-workload-review, sys-medic subset).
5. Fill security posture from observe-class checks.
6. Confirm who to escalate to (human operator / on-call).
7. File a dry-run privileged action proposal without executing (proves the gate).
8. Mark RU-* in `checklists/ramp-up-status.md`; charge ramp-up Kai package if funded.

View file

@ -1,9 +1,10 @@
# Forward-Deployed Agency Business Model
**Status:** draft v0.1
**Status:** v0.2 working accepted (DEC-FDA-001)
**Date:** 2026-07-16
**Audience:** product owners, coulomb ecosystem operators, early client sponsors
**Companion tech spec:** [docs/forward-deployed-engagement-architecture.md](../docs/forward-deployed-engagement-architecture.md)
**Decisions:** [docs/decisions/DEC-FDA-001-working-defaults.md](../docs/decisions/DEC-FDA-001-working-defaults.md)
**Builds on:** [PricingModel.md](PricingModel.md), [RevenueModel.md](RevenueModel.md), [KaizenAgenticMission.md](KaizenAgenticMission.md), ADR-006
---
@ -358,10 +359,15 @@ modest tokens).
## 12. Open decisions (for sponsor)
1. Who operates the Kai ledger (state-hub extension vs. lightweight YAML ledger vs. finance tool)?
2. Is internal coulomb billed only in Kai forever, or eventually soft EUR for cost visibility?
3. Multi-tenant companies: one client account or one per product line?
4. Can unused Kai transfer between sister projects in the same company?
**Phase 1 locked** in DEC-FDA-001: file JSONL ledger; pilot path under
`engagements/pilots/`; one engagement × N targets; metrics opt-in default off.
Still open for later:
1. Is internal coulomb billed only in Kai forever, or eventually soft EUR for cost visibility?
2. Multi-tenant companies: one client account or one per product line?
3. Can unused Kai transfer between sister projects in the same company?
4. When to introduce a shared settlement service beyond JSONL?
---

View file

@ -4,7 +4,7 @@ type: workplan
title: "Forward-deployed agency: engagements, Kai ledger, host-operator pilot"
domain: agents
repo: kaizen-agentic
status: ready
status: active
owner: kaizen-agentic
topic_slug: custodian
created: "2026-07-16"
@ -18,22 +18,22 @@ tasks:
status: done
title: Business model and architecture drafts (Kai + engagement lifecycle)
- id: T02
status: todo
status: done
title: Accept or revise open decisions; promote drafts to accepted reference
- id: T03
status: todo
status: done
title: Role package scaffold for host-operator (ROLE.yaml + protocols)
- id: T04
status: todo
status: done
title: Phase 1 file-based engagement layout and pilot ENGAGEMENT for railiance01
- id: T05
status: todo
status: done
title: Bound agent definition from sys-medic craft + engagement binding appendix
- id: T06
status: todo
status: done
title: Ramp-up and ramp-down checklists with exit criteria evidence paths
- id: T07
status: todo
status: done
title: JSONL Kai ledger convention and quote snapshot for pilot
- id: T08
status: todo
@ -52,7 +52,7 @@ state_hub_workstream_id: "70f7afb1-78f1-4e3b-8437-48840b5b58cc"
# KAIZEN-WP-0009 — Forward-Deployed Agency
**Status:** ready
**Status:** active
**Owner:** kaizen-agentic
**Repo:** kaizen-agentic
**Depends on:** WP-0002 (agency memory), WP-0006 (schedule prepare), WP-0008 (customer engagement)
@ -111,91 +111,76 @@ Delivered 2026-07-16:
```task
id: KAIZEN-WP-0009-T02
status: todo
status: done
priority: high
state_hub_task_id: "d624072d-1939-40f0-bfa2-498a24673b4c"
```
Resolve architecture open questions with sponsor:
1. Kai ledger home (file JSONL vs hub extension)
2. Engagement store placement (dedicated repo vs railiance-hosts subdirectory)
3. Multi-target agent binding shape
4. Default metrics opt-in for supplier optimizer
Update both draft docs to `accepted` / v0.2 when decided. Optionally promote
architecture sections into ADR-007.
**Delivered 2026-07-16 (working defaults):**
[DEC-FDA-001](../docs/decisions/DEC-FDA-001-working-defaults.md) — JSONL ledger,
`engagements/pilots/` placement, one engagement × N targets, metrics opt-in off.
Docs promoted to v0.2. Sponsor may override; ADR-007 deferred to T11.
## host-operator Role package
```task
id: KAIZEN-WP-0009-T03
status: todo
status: done
priority: high
state_hub_task_id: "407eae88-a3fe-4da9-80eb-ea92828fd488"
```
Add supplier Role scaffold per architecture §5.1:
- `roles/host-operator/ROLE.yaml` (or agreed package path)
- Protocols: `os-security-pass`, `load-workload-review` (plus reuse sys-medic k3s)
- Memory template extensions (host profiles, OS/patch, security, load envelope)
- Capability tier 4; base_agent: sys-medic
**Delivered:** `roles/host-operator/` — ROLE.yaml v0.1.0, agent-definition,
memory-template, ramp-up/down, protocols `os-security-pass` + `load-workload-review`,
base_agent sys-medic, tier 4.
## Phase 1 engagement layout + pilot record
```task
id: KAIZEN-WP-0009-T04
status: todo
status: done
priority: high
state_hub_task_id: "c90fd780-982f-48ea-a017-2eee44f2e8c7"
```
Create file-based engagement tree for pilot (location per T02 decision), including:
- `ENGAGEMENT.yaml` for `eng-coulomb-railiance01-ho-001`
- Request YAML, schedule.yml, access-plan.md (no secrets)
- Empty vault scaffold
Document the path in architecture §11 if it differs from the draft proposal.
**Delivered:** `engagements/pilots/eng-coulomb-railiance01-ho-001/` full tree
(ENGAGEMENT, request, schedule, access-plan, vault, checklists, commercial, reports).
## Bound agent definition
```task
id: KAIZEN-WP-0009-T05
status: todo
status: done
priority: high
state_hub_task_id: "e48f0ec3-4258-4650-8c92-eb25e4dca755"
```
Materialise engagement-bound agent definition from sys-medic + binding appendix
(targets, phase, human_approval_for, vault paths, charter). Until Role package
ships, sys-medic + appendix is acceptable; migrate to host-operator when T03 lands.
**Delivered:** `agent-host-operator.md` bound definition (targets, phase,
approval gates, vault path, charter, protocol table).
## Ramp checklists
```task
id: KAIZEN-WP-0009-T06
status: todo
status: done
priority: medium
state_hub_task_id: "3c166660-b4b8-49fc-9dcb-c47e7d676792"
```
Author ramp-up (RU-01…RU-08) and ramp-down (RD-01…RD-07) checklists with
evidence paths matching architecture §7. Link from ENGAGEMENT.yaml.
**Delivered:** Role checklists + pilot `checklists/ramp-up-status.md` and
`ramp-down-status.md` with evidence paths; linked from ENGAGEMENT.yaml.
## Kai ledger (Phase 1)
```task
id: KAIZEN-WP-0009-T07
status: todo
status: done
priority: medium
state_hub_task_id: "16e90a62-973b-4cc8-ac36-87bfad52e538"
```
- `commercial/ledger.jsonl` schema per architecture §10
- Quote snapshot for pilot month-1 seat + ramp + estimated duties
- Document mint/spend against internal coulomb grant (no real EUR required)
**Delivered:** `commercial/quote.yaml` (~72800 Kai month-1), `ledger.jsonl`
with quote-open note, commercial README.
## CLI engagement group