Align the lifecycle intent with the accepted engine blueprint.
INTENT.md now describes one enabling library over the store, manifested as a CLI or a single-stage service. SECRETS-WP-0016 is the implementation workplan. The accepted layer statute is still v0.8. Assistant: grok Assistant-Session: 01a1609f-72b8-7222-9dff-fae300115e42
This commit is contained in:
parent
39314c18b6
commit
9a8938be3e
3 changed files with 181 additions and 30 deletions
89
INTENT.md
89
INTENT.md
|
|
@ -25,19 +25,37 @@ declared_at: "2026-08-29"
|
||||||
> another repository is not a declaration; this file, in this repository's
|
> another repository is not a declaration; this file, in this repository's
|
||||||
> voice, is.
|
> voice, is.
|
||||||
>
|
>
|
||||||
> secrets-engine is a **deterministic API over OpenBao** for one modeled
|
> secrets-engine is a tool of automation for one capability: the cataloged
|
||||||
> concept: the cataloged credential lane and its lifecycle. The same
|
> credential lane and its lifecycle. It encapsulates that work in one
|
||||||
> authoritative inputs — catalog entry, access-engine decision record, and
|
> consistent interface. The same authoritative inputs — catalog entry,
|
||||||
> OpenBao state — must yield the same plan, apply, delivery, and lifecycle
|
> access-engine decision record, and OpenBao state — yield the same plan,
|
||||||
> result. That is why this repository is an Engine, not Staff, even though
|
> apply, delivery, and lifecycle result. That determinism is why this
|
||||||
> operators and agents invoke it at runtime.
|
> repository is an Engine, not Staff, even though operators and agents invoke
|
||||||
|
> it at runtime.
|
||||||
>
|
>
|
||||||
> **It is not a decision point.** `access-engine` (today `flex-auth`) renders
|
> This shape is gate-house ADR-015 and `ArchitectureBlueprint.md` §2.2,
|
||||||
> whether authority exists. gate-house authors the doctrine that may reach that
|
> accepted 2026-10-22. The same wording is assembled in proposed
|
||||||
> decision only as a request claim or a versioned policy rule. OpenBao is
|
> `security-layer-model_v0.9` §3.3. The accepted statute and companion remain
|
||||||
> Tooling: custody, policy enforcement, leases, and backend audit. This engine
|
> v0.8 until that successor is adopted. v0.8's PEP obligations still bind.
|
||||||
> materializes an already-rendered decision into scoped OpenBao work. A
|
>
|
||||||
> credential is an artifact of authority, never its source.
|
> **It enables the capability. It is not access control.** `access-engine`
|
||||||
|
> (today `flex-auth`) renders whether authority exists, including whether an
|
||||||
|
> operator may start or call an instance. gate-house authors the doctrine that
|
||||||
|
> may reach that decision only as a request claim or a versioned policy rule.
|
||||||
|
> OpenBao is Tooling: custody, policy enforcement, leases, and backend audit.
|
||||||
|
> This engine does not hold those records. Other engines may use OpenBao for
|
||||||
|
> other capabilities. This engine materializes an already-rendered decision
|
||||||
|
> into scoped OpenBao work. A credential is an artifact of authority, never
|
||||||
|
> its source. Holding the credential inside the process does not make this
|
||||||
|
> engine a gate on the store.
|
||||||
|
>
|
||||||
|
> **One library, three manifestations.** The library validates, explains, and
|
||||||
|
> plans without the store credential. The CLI is that library in a process. A
|
||||||
|
> service is the same process kept running for one stage. At start the process
|
||||||
|
> is injected with that stage's OpenBao credential. The credential enables the
|
||||||
|
> capability and is not returned to the operator. A use-privilege does not
|
||||||
|
> confer it. An operator who may delegate can assign the work to an operator
|
||||||
|
> who may use the instance. The assignment transfers neither privilege.
|
||||||
>
|
>
|
||||||
> **It is PEP-shaped.** Apply, provision, exec delivery, handoff, suspend,
|
> **It is PEP-shaped.** Apply, provision, exec delivery, handoff, suspend,
|
||||||
> deactivate, and destroy cause protected side effects, so the four PEP
|
> deactivate, and destroy cause protected side effects, so the four PEP
|
||||||
|
|
@ -67,9 +85,10 @@ declared_at: "2026-08-29"
|
||||||
|
|
||||||
## One-liner
|
## One-liner
|
||||||
|
|
||||||
**secrets-engine is the Lifecycle engine for approved credential work: a
|
**secrets-engine enables cataloged credential lifecycle: one deterministic
|
||||||
deterministic API that turns an access-engine decision into scoped OpenBao
|
library over OpenBao, manifested as a CLI or as a service for a single stage,
|
||||||
custody, delivery, and lifecycle actions across build, test, and production.**
|
with that stage's credential injected at start and never returned to the
|
||||||
|
operator.**
|
||||||
|
|
||||||
## Why This Exists
|
## Why This Exists
|
||||||
|
|
||||||
|
|
@ -92,7 +111,8 @@ produced avoidable friction:
|
||||||
responsibility of their own.
|
responsibility of their own.
|
||||||
|
|
||||||
This repository exists to capture that complexity once, behind a stable,
|
This repository exists to capture that complexity once, behind a stable,
|
||||||
deterministic, and auditable interface.
|
deterministic, and auditable interface that is more reliable and more
|
||||||
|
efficient than doing the same OpenBao work by hand.
|
||||||
|
|
||||||
## The Mission
|
## The Mission
|
||||||
|
|
||||||
|
|
@ -124,12 +144,15 @@ privileged production side effect, a successful approval-engine CAS consume
|
||||||
must precede the OpenBao call (`GH-DEC-2026-003`). Holding an ALLOW is not
|
must precede the OpenBao call (`GH-DEC-2026-003`). Holding an ALLOW is not
|
||||||
authority to act.
|
authority to act.
|
||||||
|
|
||||||
### 2. OpenBao is Tooling; this engine is the API over it
|
### 2. OpenBao is Tooling; this engine enables one capability over it
|
||||||
|
|
||||||
OpenBao remains the vault, policy, lease, and audit backend. secrets-engine
|
OpenBao remains the vault, policy, lease, and audit backend. Several engines
|
||||||
owns the catalog, validation, delivery, scoped capability handoff, lifecycle
|
may use that store. secrets-engine enables the catalog, validation, delivery,
|
||||||
operations, and the operator/agent/Staff interface to those operations. Staff
|
scoped capability handoff, and lifecycle operations, and it is the
|
||||||
must not hold a direct OpenBao client for work this engine is meant to expose.
|
operator/agent/Staff interface for that capability. It does not own custody,
|
||||||
|
it is not the store's only client, and it does not decide who may use an
|
||||||
|
instance. Staff does this capability through the engine rather than by hand.
|
||||||
|
Another engine's different capability over OpenBao is outside this intent.
|
||||||
|
|
||||||
### 3. Stage-aware privilege
|
### 3. Stage-aware privilege
|
||||||
|
|
||||||
|
|
@ -189,14 +212,15 @@ treat silence from `access-engine` as permission.
|
||||||
secrets-engine is:
|
secrets-engine is:
|
||||||
|
|
||||||
- the Lifecycle engine for cataloged credential lanes;
|
- the Lifecycle engine for cataloged credential lanes;
|
||||||
- a CLI today and a service API for operators, agents, CI, and Staff
|
- one library for that capability;
|
||||||
repositories that must not speak OpenBao;
|
- a CLI, and for one stage that must stay up, a service, both manifestations
|
||||||
- a typed catalog of KV secret lanes, auth-capability lanes, grants, delivery
|
of that library and both injected with that stage's credential at start;
|
||||||
|
- a typed catalog of KV lanes, auth-capability lanes, grants, delivery
|
||||||
modes, and stage policies;
|
modes, and stage policies;
|
||||||
- an OpenBao policy/auth-role applier with strict local validation;
|
- an OpenBao policy/auth-role applier with strict local validation;
|
||||||
- an exec-time secret delivery and scoped capability handoff helper;
|
- an exec-time delivery and scoped capability handoff helper;
|
||||||
- a PEP at every protected side effect, with a published unreachable-engine
|
- a PEP at every protected side effect, with a published unreachable-engine
|
||||||
stance;
|
stance, consuming access-engine's decision rather than rendering one;
|
||||||
- the credential interaction surface that ops-warden routes to after a
|
- the credential interaction surface that ops-warden routes to after a
|
||||||
decision.
|
decision.
|
||||||
|
|
||||||
|
|
@ -204,9 +228,11 @@ secrets-engine is:
|
||||||
|
|
||||||
secrets-engine is not:
|
secrets-engine is not:
|
||||||
|
|
||||||
- a replacement for OpenBao, or the owner of custody;
|
- a replacement for OpenBao, the owner of custody, or the only client of that store;
|
||||||
|
- access control for OpenBao, or a decider of who may start or call an instance;
|
||||||
- an identity provider or MFA system;
|
- an identity provider or MFA system;
|
||||||
- an authorization decision engine, an approval store, or a maturity engine;
|
- an authorization decision engine, an approval store, or a maturity engine;
|
||||||
|
- a second implementation that appears only when the library is manifested as a service;
|
||||||
- an application-specific secret store;
|
- an application-specific secret store;
|
||||||
- a place to persist raw secret values outside OpenBao;
|
- a place to persist raw secret values outside OpenBao;
|
||||||
- a prompt-time secret injection mechanism for LLMs;
|
- a prompt-time secret injection mechanism for LLMs;
|
||||||
|
|
@ -220,7 +246,7 @@ secrets-engine is not:
|
||||||
|
|
||||||
| Concern | Primary owner | secrets-engine responsibility |
|
| Concern | Primary owner | secrets-engine responsibility |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| Secret custody, leases, backend audit | OpenBao (Tooling) / railiance-platform | Lifecycle API over least-privilege roles and validated paths. |
|
| Secret custody, leases, backend audit | OpenBao (Tooling) / railiance-platform | Enable the lifecycle capability over least-privilege roles and validated paths. Other engines may use the same store for other capabilities. |
|
||||||
| Authorization decisions | access-engine (`flex-auth`) | Consume a decision record; never render or cache one. |
|
| Authorization decisions | access-engine (`flex-auth`) | Consume a decision record; never render or cache one. |
|
||||||
| Approval object | approval-engine | Consume an approval as an input claim; never store or mutate it. |
|
| Approval object | approval-engine | Consume an approval as an input claim; never store or mutate it. |
|
||||||
| Security doctrine | gate-house | Apply doctrine only as it arrives on the decision or in a versioned policy package. |
|
| Security doctrine | gate-house | Apply doctrine only as it arrives on the decision or in a versioned policy package. |
|
||||||
|
|
@ -248,8 +274,11 @@ The repository should evolve through these phases:
|
||||||
evidence classified and emitted to audit-core; proposed SSH-CA and secret-use
|
evidence classified and emitted to audit-core; proposed SSH-CA and secret-use
|
||||||
surfaces accepted or declined in this repository's own contract, not only in
|
surfaces accepted or declined in this repository's own contract, not only in
|
||||||
other repositories' gap registers.
|
other repositories' gap registers.
|
||||||
6. **Service mode:** expose a deterministic API that ops-warden, agents, CI, and
|
6. **Manifestations:** the library stays free of the store credential. The CLI
|
||||||
future UI surfaces can use without knowing OpenBao internals.
|
and a kept-running service are that same library in a process injected for
|
||||||
|
one stage. The service is not a second product. Operators, agents, CI, and
|
||||||
|
future UI surfaces call it without knowing OpenBao internals and without
|
||||||
|
receiving the injected credential.
|
||||||
|
|
||||||
## Guiding Question
|
## Guiding Question
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
| workplan | SECRETS-WP-0013 | proposed | — | workplans/SECRETS-WP-0013-task-scoped-openbao-execution.md |
|
| workplan | SECRETS-WP-0013 | proposed | — | workplans/SECRETS-WP-0013-task-scoped-openbao-execution.md |
|
||||||
| workplan | SECRETS-WP-0014 | active | — | workplans/SECRETS-WP-0014-pdp-transport-and-responder-authentication.md |
|
| workplan | SECRETS-WP-0014 | active | — | workplans/SECRETS-WP-0014-pdp-transport-and-responder-authentication.md |
|
||||||
| workplan | SECRETS-WP-0015 | active | — | workplans/SECRETS-WP-0015-original-keycape-recovery-selector.md |
|
| workplan | SECRETS-WP-0015 | active | — | workplans/SECRETS-WP-0015-original-keycape-recovery-selector.md |
|
||||||
|
| workplan | SECRETS-WP-0016 | ready | — | workplans/SECRETS-WP-0016-engine-manifestations.md |
|
||||||
| task | SECRETS-WP-ADHOC-2026-08-21-T01 | done | — | workplans/ADHOC-2026-08-21.md |
|
| task | SECRETS-WP-ADHOC-2026-08-21-T01 | done | — | workplans/ADHOC-2026-08-21.md |
|
||||||
| task | SECRETS-WP-ADHOC-2026-08-23-T01 | done | — | workplans/ADHOC-2026-08-23.md |
|
| task | SECRETS-WP-ADHOC-2026-08-23-T01 | done | — | workplans/ADHOC-2026-08-23.md |
|
||||||
| task | SECRETS-WP-0001-T01 | done | — | workplans/SECRETS-WP-0001-statehub-bootstrap.md |
|
| task | SECRETS-WP-0001-T01 | done | — | workplans/SECRETS-WP-0001-statehub-bootstrap.md |
|
||||||
|
|
@ -97,6 +98,11 @@
|
||||||
| task | SECRETS-WP-0015-T03 | done | — | workplans/SECRETS-WP-0015-original-keycape-recovery-selector.md |
|
| task | SECRETS-WP-0015-T03 | done | — | workplans/SECRETS-WP-0015-original-keycape-recovery-selector.md |
|
||||||
| task | SECRETS-WP-0015-T04 | wait | — | workplans/SECRETS-WP-0015-original-keycape-recovery-selector.md |
|
| task | SECRETS-WP-0015-T04 | wait | — | workplans/SECRETS-WP-0015-original-keycape-recovery-selector.md |
|
||||||
| task | SECRETS-WP-0015-T05 | done | — | workplans/SECRETS-WP-0015-original-keycape-recovery-selector.md |
|
| task | SECRETS-WP-0015-T05 | done | — | workplans/SECRETS-WP-0015-original-keycape-recovery-selector.md |
|
||||||
|
| task | SECRETS-WP-0016-T01 | todo | — | workplans/SECRETS-WP-0016-engine-manifestations.md |
|
||||||
|
| task | SECRETS-WP-0016-T02 | todo | — | workplans/SECRETS-WP-0016-engine-manifestations.md |
|
||||||
|
| task | SECRETS-WP-0016-T03 | todo | — | workplans/SECRETS-WP-0016-engine-manifestations.md |
|
||||||
|
| task | SECRETS-WP-0016-T04 | todo | — | workplans/SECRETS-WP-0016-engine-manifestations.md |
|
||||||
|
| task | SECRETS-WP-0016-T05 | todo | — | workplans/SECRETS-WP-0016-engine-manifestations.md |
|
||||||
| intake | SECRETS-IN-0001 | closed | — | intakes/intakes.md |
|
| intake | SECRETS-IN-0001 | closed | — | intakes/intakes.md |
|
||||||
| intake | SECRETS-IN-0002 | closed | — | intakes/intakes.md |
|
| intake | SECRETS-IN-0002 | closed | — | intakes/intakes.md |
|
||||||
| intake | SECRETS-IN-0003 | closed | — | intakes/intakes.md |
|
| intake | SECRETS-IN-0003 | closed | — | intakes/intakes.md |
|
||||||
|
|
|
||||||
116
workplans/SECRETS-WP-0016-engine-manifestations.md
Normal file
116
workplans/SECRETS-WP-0016-engine-manifestations.md
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
---
|
||||||
|
id: SECRETS-WP-0016
|
||||||
|
type: workplan
|
||||||
|
title: "Manifest the lifecycle engine as one library, a CLI, and a single-stage service"
|
||||||
|
domain: infotech
|
||||||
|
repo: secrets-engine
|
||||||
|
status: ready
|
||||||
|
owner: secrets-engine
|
||||||
|
topic_slug: custodian
|
||||||
|
created: "2026-10-22"
|
||||||
|
updated: "2026-10-22"
|
||||||
|
flavor: implementation
|
||||||
|
depends_on: []
|
||||||
|
related: [SECRETS-WP-0008, SECRETS-WP-0014]
|
||||||
|
---
|
||||||
|
|
||||||
|
Implements the engine shape in `INTENT.md` after gate-house ADR-015
|
||||||
|
(accepted 2026-10-22) and `ArchitectureBlueprint.md` §2.2.
|
||||||
|
|
||||||
|
Reviewed against the tree on 2026-10-22. `secrets_engine.plan.build_plan`
|
||||||
|
already renders a plan without an OpenBao client. `secrets_engine.cli` is the
|
||||||
|
process. `SCOPE.md` records that service delivery is absent, and that a
|
||||||
|
service API or daemon is not implemented. `service-jwt` can log in and cannot
|
||||||
|
yet carry engine actions. Accepted security-layer-model v0.8 still governs
|
||||||
|
PEP behavior. Proposed v0.9 §3.3 carries the same engine wording and does not
|
||||||
|
yet govern.
|
||||||
|
|
||||||
|
This workplan does not add a release-unit declaration, does not deploy a
|
||||||
|
workload, and does not make this engine the only client of OpenBao or a
|
||||||
|
decider of who may use it.
|
||||||
|
|
||||||
|
## Lock the library boundary
|
||||||
|
|
||||||
|
```task
|
||||||
|
id: SECRETS-WP-0016-T01
|
||||||
|
status: todo
|
||||||
|
priority: high
|
||||||
|
```
|
||||||
|
|
||||||
|
`build_plan` and the catalog validation it depends on stay free of the OpenBao
|
||||||
|
client. Add a test that calls the shipped `build_plan` for a fixture lane and
|
||||||
|
asserts no OpenBao client is constructed. If a plan path constructs one, move
|
||||||
|
that call to the process that applies the plan.
|
||||||
|
|
||||||
|
Done when that test passes against `src/secrets_engine/plan.py` and the apply
|
||||||
|
path still performs the OpenBao calls.
|
||||||
|
|
||||||
|
## Inject one stage credential at process start
|
||||||
|
|
||||||
|
```task
|
||||||
|
id: SECRETS-WP-0016-T02
|
||||||
|
status: todo
|
||||||
|
priority: high
|
||||||
|
depends_on: [SECRETS-WP-0016-T01]
|
||||||
|
```
|
||||||
|
|
||||||
|
The CLI process binds to exactly one stage, `build`, `test`, or `production`.
|
||||||
|
That stage's OpenBao credential is supplied to the process at start and is not
|
||||||
|
printed, returned, or written to Git, State Hub, logs, or the workplan. A
|
||||||
|
second stage credential present in the same process is a startup failure.
|
||||||
|
|
||||||
|
Done when a test starts the shipped CLI entry against fixture configuration,
|
||||||
|
shows one stage bound, shows the credential value absent from stdout and
|
||||||
|
stderr, and shows startup failure when two stage credentials are present.
|
||||||
|
|
||||||
|
## Manifest the same library as a single-stage service
|
||||||
|
|
||||||
|
```task
|
||||||
|
id: SECRETS-WP-0016-T03
|
||||||
|
status: todo
|
||||||
|
priority: medium
|
||||||
|
depends_on: [SECRETS-WP-0016-T02]
|
||||||
|
```
|
||||||
|
|
||||||
|
Add a service manifestation of the same library and the same one-stage
|
||||||
|
injection. It is a kept-running process, not a second implementation and not a
|
||||||
|
Deployment. It does not accept another stage's credential.
|
||||||
|
|
||||||
|
Done when an in-process test starts that manifestation for one stage and a
|
||||||
|
lifecycle call goes through the shipped library functions used by the CLI.
|
||||||
|
|
||||||
|
## Consume use, do not decide it
|
||||||
|
|
||||||
|
```task
|
||||||
|
id: SECRETS-WP-0016-T04
|
||||||
|
status: todo
|
||||||
|
priority: medium
|
||||||
|
depends_on: [SECRETS-WP-0016-T03]
|
||||||
|
```
|
||||||
|
|
||||||
|
Permission to start or call an instance is an access-engine decision. This
|
||||||
|
repository documents the claim it will consume and does not invent a local
|
||||||
|
allow-list. A caller-supplied flag or config key must not authorize apply or
|
||||||
|
the service. Protected side effects keep the existing rule: a decision record
|
||||||
|
or the published unreachable-engine stance. v0.8 PEP obligations stay.
|
||||||
|
|
||||||
|
Done when a test shows a local allow flag does not authorize a protected call,
|
||||||
|
and the claim shape is written in `docs/` without storing a credential.
|
||||||
|
|
||||||
|
## Record the manifestations in SCOPE
|
||||||
|
|
||||||
|
```task
|
||||||
|
id: SECRETS-WP-0016-T05
|
||||||
|
status: todo
|
||||||
|
priority: low
|
||||||
|
depends_on: [SECRETS-WP-0016-T03, SECRETS-WP-0016-T04]
|
||||||
|
```
|
||||||
|
|
||||||
|
Update `SCOPE.md` so it describes the library, the one-stage CLI, and the
|
||||||
|
service manifestation that the code then contains. State that other engines
|
||||||
|
may use OpenBao for other capabilities. Remove the claim that service delivery
|
||||||
|
is absent only for the manifestation this workplan adds. Leave exec-time
|
||||||
|
delivery as the default for a one-task caller.
|
||||||
|
|
||||||
|
Done when `SCOPE.md` matches the shipped commands and tests, and does not
|
||||||
|
describe a cluster Deployment this workplan did not add.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue