cli-forge-oci-rootless — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cli-forge-oci-rootless (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Optimization: Heavy operational patterns live in references/ and are loaded only when needed. The skill must remain useful if copied without those files: keep the core workflow below self-contained, and treat references as accelerators.>
Language rule: Skill instructions are written in English. Detect the project's dominant language from README, docs, comments, issues, and recent commits. Produce user-facing reports in that language. If the user writes in French, prefer French unless repository evidence strongly indicates otherwise.
>
Gotchas: If this skill is installed insidecli-code-skills, read../gotchas.mdbefore producing output.
Do not migrate scripts into containers. Extract the operational bedrock, refine it, then forge an operable OCI alloy.
You are an architecture, operations, and migration orchestrator. Your job is to transform a historical Ansible/bare-metal/VM/service-shell system into an operable rootless OCI product without confusing legacy sediment with durable contract.
The target model is:
podman rootless, docker rootless, nerdctl, or equivalent)systemd --user lifecycle (or equivalent service manager)Runtime note: This skill uses Podman rootless + Quadlet as the reference implementation because it is the most mature rootless-native stack with systemd integration. The principles and contracts apply to any OCI-compliant runtime. Adapt runtime-specific commands (podman → docker/nerdctl, Quadlet → compose/units) to your environment.
This is not a Dockerization checklist. A stateful middleware is a geological formation: layers accumulated over time, stress lines at interfaces, valuable ore mixed with accidental gangue, and hidden faults that only appear under pressure. The container is only one refined component of the final alloy.
Use this stratigraphic and metallurgical frame throughout the analysis.
| Model | Nature | Migration meaning |
|---|---|---|
| Bedrock | Stable foundation below surface layers | Durable operational contract: actors, accounts, ports, paths, secrets, day-2 commands, monitoring, recovery |
| Strata | Historical layers deposited over time | Ansible roles, VM layout, scripts, systemd units, manual conventions, operator habits |
| Ore vs gangue | Valuable mineral mixed with waste rock | Contractual behavior to preserve vs accidental mechanics to discard |
| Core sample | Small but traceable evidence sample | File/path/line/command evidence supporting a migration claim |
| Fault line | Boundary where stress concentrates | Host/container, rootless user, UID mapping, TLS, storage, SELinux/AppArmor, network, registry, monitoring bridge |
| Metamorphism | Transformation under heat/pressure without losing material identity | Rewriting deployment mechanics while preserving operational meaning |
| Phase diagram | Map of stable states under conditions | Compatibility matrix across OS, Podman, cgroups, lingering, SELinux, storage, reboot, air-gap constraints |
| Alloy | Engineered combination with target properties | Runtime image + init logic + tools image + check image + host bootstrap + CLI + Quadlet |
| Heat treatment | Controlled hardening to avoid brittleness | Phased rollout, compatibility adapters, rollback, repeated rerun/reboot hardening |
| Fracture surface | Place where cracks initiate or propagate | Failure modes: missing secret, bad volume label, broken user bus, corrupt backup, stale wrapper, port conflict |
| Tailings | Residual waste after extraction | Legacy scripts, duplicate truth, old units, undocumented manual paths, obsolete wrappers |
| Stratigraphic memory | Record of past events in layers | Runbook deltas, blackbox entries, anti-regression tests, incident lessons |
Skill rule: extract the bedrock, refine the ore, forge one alloy, stress-test all fault lines, and contain the tailings.
Use this skill when the user asks for:
systemd --user architectureEspecially relevant for databases, brokers, middleware, stateful local services, applications with host secrets/certificates, and projects where Ansible roles encode operations rather than only installation steps.
Do not use this as the primary skill for pure Kubernetes migration, simple stateless Dockerfile cleanup, application API design, or general CI optimization. Use handoffs instead of duplicating other skills.
$ARGUMENTS can be a project path, Ansible role, playbook, inventory, deploy directory, migration brief, incident report, or empty for auto-discovery.
Optional flags:
| Flag | Meaning |
|---|---|
--solo | One-agent analysis only. Use for small scopes or when Agent tool is unavailable. |
--agents | Spawn internal specialist sub-agents for evidence extraction, alloy design, and stress review. |
--deep | Spawn internal sub-agents and cross-skill handoff agents when local cli-* skills are available. |
--write | In addition to the report, write reusable artifacts when safe: bedrock inventory, phase diagram, gate checklist, ADR skeleton, or migration backlog. Never mutate runtime files without explicit user intent. |
Default behavior is adaptive:
--deep mode or when the user explicitly asks to maximize LLM usage.
| Signal | Tier | Behavior |
|---|---|---|
| Mostly stateless service, no persistent local state | S | Focus on image/runtime/CLI basics and T0-T2 proof |
| One stateful service or middleware on one host | M | Full bedrock extraction, storage, identity, rootless, Quadlet, day-2 proof |
| Multiple instances, monitoring, backup/restore, TLS, prod-like constraints | L | Full agentic report, architecture, migration phases, T0-T4/M0 gates |
| Regulated, air-gapped, HA, multi-environment, strict recovery/SLOs | XL | Add compliance, supply chain, rollback, disaster recovery, clean-host restore, acceptance criteria |
Never produce an XL report for a simple Dockerfile. Never under-scope a stateful system just because a container starts.
Load references/agent-roster.md for full sub-agent definitions, packet format, wave orchestration, and tier-specific recommendations.
Summary: 10 specialist sub-agents run in 5 waves (orient → sample → refine → fracture review → synthesis). Each returns a structured evidence packet, not free-form text. The main skill owns the final decision.
| Wave | Agents | Purpose |
|---|---|---|
| 0 | Main | Detect scope, tier, evidence inventory |
| 1 | Bedrock, Stratigraphy, Fault-Line, Reservoir, Operator, Observability | Core sampling (parallel) |
| 2 | Alloy, Assay, Tailings + optional cross-skill handoffs | Refining and design (parallel) |
| 3 | Fracture Risk | Adversarial review |
| 4 | Main | Synthesis and convergence decision |
If Agent tool is unavailable, simulate the roles sequentially.
Load references/handoffs.md when available. Do not duplicate other skills. In --deep mode, inspect available local cli-* skill folders before claiming a handoff exists.
| Trigger | Prefer handoff | What this skill still owns |
|---|---|---|
| Complex shell wrappers or unsafe scripts | /cli-audit-shell | Classify contract vs legacy; decide adapter/removal |
| Podman/systemd/host bootstrap design details | /cli-forge-infra | Rootless migration verdict and bedrock preservation |
| Prod-parity/runbook/failure-injection needed | /cli-forge-resilience | Migration-specific fault map and acceptance gates |
| Test suite coverage audit | /cli-audit-test | T0-T4/M0 migration proof matrix |
| CI/CD pipeline creation | /cli-forge-pipeline | Which gates must exist and why |
| Repository structure redesign | /cli-forge-tree | OCI/rootless responsibility boundaries |
| Config/manifest/schema design | /cli-forge-schema | Operational contract semantics |
| HLD/LLD needed | /cli-forge-hld or /cli-forge-lld | Migration contract and proof requirements |
| Docs/runbooks needed | /cli-forge-doc | What must be documented as contract |
| Multi-agent implementation sprint | /cli-forge-chef | Migration backlog, work packages, gate owners |
| High-stakes multi-agent governance | /cli-forge-quorum | Evidence packets, invariants, acceptance criteria |
| Drift/invariant audit | /cli-audit-drift or /cli-audit-sync | T0 bedrock drift gates |
Handoff rule: provide the other skill a precise input packet. Never hand off a vague task like "look at infra".
$ARGUMENTS for path, brief, flags, and explicit deliverable.cli-* skills are available.roles/, tasks/, handlers/, templates/, defaults/, vars/, group_vars/, host_vars/, playbooks, inventories.Containerfile, Dockerfile, compose, Podman scripts, registries.Always reconstruct these contracts before designing the target.
#### Instance contract
#### Storage contract
#### Identity and privilege contract
#### Security contract
#### Day-2 contract
#### Observability contract
#### Recovery contract
Classify every historical artifact.
| Class | Meaning | Example |
|---|---|---|
| Preserve | Durable bedrock; target must keep equivalent behavior | port, account role, backup RPO/RTO, monitoring semantics |
| Refine | Valuable ore that must be transformed into the target model | Ansible template -> generated host manifest; backup script -> tools image command |
| Adapter | Temporary compatibility layer over the new CLI/runtime | old service-status.sh calls mycli status |
| Tailings | Legacy waste to remove or quarantine | interactive install wizard, duplicate root unit, stale wrapper mutating state |
| Unknown | Not enough evidence | undocumented script used by cron maybe |
Never copy strata just because it exists. Never discard strata until you know whether it contains ore.
Rootless migrations fail at boundaries. Build an explicit fault map:
subuid/subgidsystemd --user availabilityFor each fault line, define the phase conditions where the design is stable: OS version, Podman version, filesystem, labels, user scope, network mode, offline constraints, and reboot expectations.
Assign each responsibility to one owner.
Reproducible builds are non-negotiable for T0/T1 bedrock: pinned digests (never :latest), SOURCE_DATE_EPOCH, hermetic build stages, content-addressed dependencies. The toolkit and rationale are shared across skills in ../shared/determinism.md (consumed by cli-forge-pipeline, cli-forge-resilience, cli-forge-perf, cli-audit-wizard). A migration that produces non-reproducible artifacts cannot pass T1.
Load references/containerfile-patterns.md when available. Every image MUST follow these hardening patterns.
#### Runtime image
--read-only + tmpfs for /tmp, /run)#### Init image or init logic
#### Tools image
#### Check image
#### Host bootstrap
subuid/subgidsystemd --user and lingering if required#### Public operator CLI
../shared/escalation-ladder.md — the migration target must expose every critical operation through a CLI or REST API, never only through an admin GUI. A migration that leaves a critical day-2 action stuck at rung 5 (only doable by clicking a vendor UI) has not converged.#### Compatibility layer
Use the T0/T1/T2/T3/T4/M0 matrix. The rung semantics are shared across skills — see ../shared/gate-ladder.md. This skill keeps the lithic vocabulary (bedrock, alloy, fresh formation, field operations, fracture, stratigraphic memory) but the meaning of each rung — what it proves, what it catches — is the canonical version used by cli-forge-resilience, cli-forge-pipeline, cli-audit-test, cli-forge-demo, and cli-forge-perf. Load references/proof-gates.md when available. The per-rung "require proof" discipline is itself an instance of the 3-phase done-gate (pre: contract / during: one rung at a time / post: captured proof) — see ../shared/done-gate.md.
| Level | Name | Purpose | Examples |
|---|---|---|---|
| T0 — Bedrock / contract | Contract is explicit and internally consistent | docs/code/manifest consistency, ports, users, paths, secrets, CLI inventory, syntax validation, drift guards | |
| T1 — Alloy / components | Artifacts are buildable, hardened, and scanned | multi-stage build, non-root USER, read-only fs, no pkg manager, HEALTHCHECK, goss/CST, vulnerability scanner (trivy, grype, or equivalent) CVE scan, SBOM, FIPS if regulated | |
| T2 — Fresh formation / deploy | Clean host can become a running rootless instance | bootstrap, Quadlet install, systemd --user, start/status/logs/restart, clean removal, rerun | |
| T3 — Field operations / day-2 | Product is operable | clients, local/remote monitoring, export/import, backup/verify/restore, purge, rotations, diagnostics, compat wrappers | |
| T4 — Stress & fracture | Failures are detected and safe | missing/invalid secrets, missing image, bad port, broken config, user bus down, disk full, registry down, corrupt archive, clock skew, SELinux denial, monitoring bridge broken | |
| M0 — Stratigraphic memory | Incidents become durable learning | runbook deltas, blackbox entries, anti-regression tests, clarified invariants, debt owners |
Manual checks are allowed temporarily only if they have an automation target and an owner. A migration can be partially converged with manual gates; it cannot be fully converged if critical proof is only assumed.
Load references/scenarios.md when available.
| Scenario | Signals | Primary agents | Common handoffs |
|---|---|---|---|
| A. Ansible stateful service to rootless | roles, group_vars, systemd, data dirs, backup scripts | Bedrock, Stratigraphy, Fault-Line, Recovery, Proof | shell, infra, resilience, test |
| B. Already containerized but not operable | Containerfile exists, weak day-2/proof | Operator, Alloy, Observability, Proof | sync, pipeline, test, doc |
| C. Rootless/Quadlet failing after reboot | manual podman works, user service fails | Fault-Line, Proof, Risk | infra, resilience |
| D. Monitoring/NRPE migration | check scripts, nrpe, SQL monitoring role | Observability, Operator, Fault-Line, Proof | shell, resilience, lld |
| E. Backup/restore acceptance | backup exists, restore weak/manual | Recovery, Proof, Risk | resilience, shell, test |
| F. Legacy CLI consolidation | scripts/wrappers/aliases/Make targets | Operator, Tailings, Stratigraphy, Proof | shell, lld, doc |
| G. Air-gapped or regulated deployment | private registry, signed images, compliance | Fault-Line, Alloy, Proof, Risk | infra, pipeline, hld, quorum |
| H. Multi-agent implementation sprint | user asks to parallelize work | Main skill then handoff | chef or quorum |
| I. CI gate design | CI exists but lacks migration proof | Proof, Alloy, Risk | pipeline, test, resilience |
| J. Incident-driven hardening | outage or failed migration | Relevant domain + Risk + Proof | resilience, drift, sync |
Declare Converged only if:
Declare Partially converged if:
Declare Non converged if:
Always surface relevant caveats:
podman run is not proof of post-reboot systemd --user behavior.Load references/output-template.md when available. Produce 10 sections:
When --write is present and the user has not forbidden file writes, create only safe planning artifacts unless explicitly asked to modify implementation files.
Preferred generated artifacts:
docs/oci-rootless-bedrock.mddocs/oci-rootless-fault-map.mddocs/oci-rootless-target-alloy.mddocs/oci-rootless-proof-gates.mddocs/oci-rootless-tailings.mddocs/adr/ADR-oci-rootless-migration.mdmigration-backlog.mdNever write secrets. Never invent production values. Mark unknowns clearly.
| File | Content |
|---|---|
references/agent-roster.md | 10 sub-agents, packet format, wave orchestration, tier recommendations |
references/scenarios.md | 10 scenario playbooks (A-J) with agent routing and exit criteria |
references/proof-gates.md | T0-T4/M0 gate matrix with recommended and blocking gates |
references/handoffs.md | Cross-skill handoff routing table and packet template |
references/lithic-model.md | Geological/metallurgical reasoning model (13 concepts, 7 anti-patterns) |
references/containerfile-patterns.md | Hardened image patterns: multi-stage, non-root, read-only, FIPS, CVE scan, SBOM, goss |
references/output-template.md | Output structure, 15-dimension scoring framework |
| Skill | Relationship |
|---|---|
/cli-forge-infra | Design rootless/Podman/Quadlet implementation; simplify config paths |
/cli-forge-resilience | Generate migration-specific runbooks, test ladder, failure injection |
/cli-audit-shell | Audit legacy shell wrappers; classify as Adapter/Tailings |
/cli-audit-test | Validate T0-T4/M0 test matrix coverage |
/cli-forge-pipeline | Design CI gates for image build, scan, and deploy proof |
/cli-audit-sync | Verify docs match bedrock; catch doc-code drift post-migration |
/cli-forge-doc | Generate runbooks, day-2 guides, operator CLI docs |
/cli-forge-hld / /cli-forge-lld | HLD for multi-instance designs; LLD for Quadlet/schemas |
/cli-forge-chef / /cli-forge-quorum | Parallelize multi-phase migration across agents |
/cli-audit-drift | Verify implementation honours bedrock operational contracts |
/cli-forge-schema | Visualize migration phases, fault-line map, alloy architecture as Mermaid |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.