Skip to content

docs: specify per-service runtime monitors - #406

Open
clvsh wants to merge 4 commits into
mainfrom
docs/monitor-proposal
Open

clvsh wants to merge 4 commits into
mainfrom
docs/monitor-proposal

Conversation

@clvsh

@clvsh clvsh commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

PV keeps runtimes alive across daemon restarts, but the daemon cannot retain an exit result or finish an accepted stop after its own process dies. This design gives each runtime a stable monitor while keeping readiness and restart policy in the daemon.

The approved design keeps one result in monitor memory, writes output directly to append files, and accepts the diagnostic loss window of copy-and-truncate rotation. Review made startup publication, instance ownership, clean Postgres shutdown, and explicit result consumption part of the contract. macOS non-parent exit observation alone does not meet the retention requirement.

The plan uses five PRs. A standalone shutdown fix comes first. Monitor core, production integration, and obsolete-code removal form the three-PR stack linked with gh stack. Integration must remain safe if final removal is delayed.

Validation: checked the revised spec and plan for conflicting requirements and whitespace. Runtime tests are not required for this documentation-only PR; each implementation stage has its own acceptance checks.

Summary by CodeRabbit

  • Documentation
    • Added an approved macOS design and implementation plan for per-service monitors, covering runtime ownership, recovery, shutdown, and cleanup.
    • Documented testing requirements, cutover and rollback procedures, and platform boundaries: monitor supervision is limited to macOS.
    • The monitor implementation is not included in this change.

One monitor process per supervised runtime becomes the runtime's
parent for its whole life, and the daemon talks to monitors instead of
runtime PIDs. The proposal records the decisions already made: the
containerd-style split of mechanics in the monitor and policy in the
daemon, exit status kept until acknowledged, pushed events plus state
pulled on reconnect, start and delete commands, one state directory per
runtime with a short socket path, and a frozen version-and-stop core
that restarts a runtime on a protocol mismatch. Three decisions remain
open: how long a runtime outlives its daemon, where the monitor code
lives, and the state directory name.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-08T18:14:10.247050Z eb7db41 New commits
🔒 Security Review ✅ Completed 2026-10-08T03:32:52.839233Z 98bdfa5 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: QUIET
  • Plan: Advanced
  • Run ID: f9d91870-2895-4ef1-a6c7-3d4410d20bc0
📥 Commits

Reviewing files that changed from the base of the PR and between d5bc48c and eb7db41.

📒 Files selected for processing (1)
  • docs/superpowers/plans/2026-10-08-per-service-monitor.md

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.


📝 Walkthrough

Walkthrough

The pull request adds an accepted macOS design for per-runtime monitors and a five-PR implementation plan. The documents specify monitor lifecycle, control and recovery, production integration, testing, cutover, and rollback. They do not implement the design.

Changes

Per-service monitor design and plan

Layer / File(s) Summary
Monitor scope and startup
docs/superpowers/specs/2026-10-08-per-service-monitor-design.md, docs/superpowers/plans/2026-10-08-per-service-monitor.md
The design assigns monitors to Gateway, PHP worker, and Managed Resource runtimes. It specifies startup through an exec gate and separates daemon stop policy from monitor stop execution.
Control, exit results, and recovery
docs/superpowers/specs/2026-10-08-per-service-monitor-design.md, docs/superpowers/plans/2026-10-08-per-service-monitor.md
The documents specify authenticated control, cleanup verification, in-memory exit-result retention, instance-specific release, and identity checks for recovery and replacement.
Lifecycle and runtime operations
docs/superpowers/specs/2026-10-08-per-service-monitor-design.md, docs/superpowers/plans/2026-10-08-per-service-monitor.md
The documents define lifecycle cleanup, configuration and Caddy verification, log rotation, production integration, legacy cutover, and removal of legacy runtime adoption.
Implementation stages and validation
docs/superpowers/plans/2026-10-08-per-service-monitor.md, docs/superpowers/specs/2026-10-08-per-service-monitor-design.md
The plan sets out five implementation PRs, scenario coverage, platform limits, review status, and cutover and rollback procedures.

Priority: ⬇️ Low

Estimated code review effort: 1 (Trivial) | ~5 minutes

Change: Other

Merge Risk: ⚪ Minimal · up to eb7db

This change publishes a monitor design and implementation plan without changing runtime behavior. The reviewed text defines recovery cleanup and keeps Linux unsupported, so no outstanding documented risk blocks merging.

Security Architecture Review

Security architecture risk: ⚪ Minimal · up to eb7db

No introduced or worsened security risk was identified. The design requires instance-specific identity, verified cleanup, and separate Caddy peer checks. This PR changes documentation, not production runtime behavior.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The future control authority is scoped to local PV-managed runtime instances and their recovery records, with separate authority checks for Caddy administration. This PR introduces no executing monitor, new caller, or privilege grant. The documented scope does not establish protection against arbitrary escaped descendants or an attacker already controlling the user's account.

Trust Boundaries and Controls

  • observed — The existing Unix Caddy request path checks the socket peer's PID and process group before HTTP transmission when the ownership verifier returns an expected PID. Convenience APIs use a no-op verifier and can skip that check; this behavior predates the PR. The accepted integration contract explicitly requires fresh authenticated monitor state, current OS identity, and independent Caddy peer verification before any admin HTTP bytes are sent.
  • observed — Recovery must distinguish a dead monitor from a live unresponsive one. Missing, changed, previous-boot, or otherwise unproven identity cannot authorize signaling. Stale release or cleanup must not affect a replacement, and uncertainty preserves records and blocks replacement.

Resilience and Maintainability Implications

  • observed — Failure containment is explicitly fail-closed: forced or abnormal Postgres leader exit does not prove backend cleanup, so recovery records and capable binaries remain and destructive operations are blocked. External lifecycle admission excludes state recreation during disable or uninstall, while daemon death must be verified before final cleanup.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: documenting the design for per-service runtime monitors.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@codspeed

codspeed Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 7 untouched benchmarks


Comparing docs/monitor-proposal (eb7db41) with main (b62b1a0)

Open in CodSpeed

DESIGN.md describes what PV does and what's been decided, and agents
treat it as settled. The proposal still has open decisions, so it lives
in docs/superpowers/specs like other designs; DESIGN.md changes when
the monitor is built.
@clvsh clvsh changed the title docs(design): propose a per-service monitor docs: propose a per-service monitor Oct 8, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ Two crash-recovery gaps to clarify in the proposal; no executable behavior changes in this PR.

Reviewed changes Reviewed the complete monitor proposal against current supervision, descendant cleanup, daemon lifecycle, and fixture ownership behavior; tests were skipped because this PR changes documentation only.

  • Runtime ownership and lifecycle: Proposes one persistent monitor per runtime, daemon-owned policy, retained exit status, and state recovery on reconnect.
  • Protocol and cleanup: Defines directory discovery, UID-checked sockets, frozen version/stop operations, protocol-mismatch replacement, and crashed-monitor deletion.
  • Operations and rollout: Covers log rotation, disable/uninstall, owner-disconnection behavior, three open decisions, manual cutover, and future Linux containment; the latest commit moves the proposal to a standalone spec and leaves DESIGN.md unchanged.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using gpt-6.1-sol | 𝕏

Comment thread docs/superpowers/specs/2026-10-08-per-service-monitor-design.md Outdated
Comment thread docs/superpowers/specs/2026-10-08-per-service-monitor-design.md Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 98bdfa50eb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread DESIGN.md Outdated
### Lifecycle

1. **Start.** The daemon runs `pv monitor start` with the runtime's command, arguments, private environment, log path, and stop policy. The command starts the long-lived monitor in a new session, so it survives the daemon's LaunchAgent restarts as runtimes do today. It returns only once the monitor's socket is listening, and prints `{version, address}` or an error, so the daemon gets a clear success or failure without polling for a socket.
2. **Run.** The monitor starts the runtime in its own process group, with the runtime's stdout and stderr connected to the monitor through pipes.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve runtime behavior when the monitor crashes

When a monitor crashes while its runtime is still active, the monitor's pipe read ends close, so the runtime's next stdout/stderr write can receive SIGPIPE or EPIPE; depending on the runtime, that can terminate it or disable logging. This contradicts the later claim that monitor failure merely leaves a parentless runtime for pv monitor delete to recover. Either intentionally fate-share the runtime with the monitor or use a logging arrangement that remains valid after monitor death.

Useful? React with 👍 / 👎.

Comment thread DESIGN.md Outdated

- One extra process per runtime.
- The frozen core has to be right the first time.
- A monitor runs the code it started with until its runtime restarts. After two self-updates its release may have been pruned from `~/.pv/bin/releases/`. That is harmless because a monitor never re-runs its own binary, and cleanup uses the current `pv monitor delete`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Freeze the cleanup state format across monitor versions

This is not harmless when a monitor survives enough same-protocol updates for its originating release to be pruned and then crashes: the current pv monitor delete must parse that old monitor's state file to identify the runtime, but the proposal freezes only the socket framing, version, and stop while allowing everything else to change freely. Freeze or explicitly version the on-disk cleanup schema with compatible readers, or retain a binary capable of reading it; otherwise cleanup and uninstall can leave the runtime orphaned.

Useful? React with 👍 / 👎.

Comment thread DESIGN.md Outdated

1. **Start.** The daemon runs `pv monitor start` with the runtime's command, arguments, private environment, log path, and stop policy. The command starts the long-lived monitor in a new session, so it survives the daemon's LaunchAgent restarts as runtimes do today. It returns only once the monitor's socket is listening, and prints `{version, address}` or an error, so the daemon gets a clear success or failure without polling for a socket.
2. **Run.** The monitor starts the runtime in its own process group, with the runtime's stdout and stderr connected to the monitor through pipes.
3. **Exit.** As the parent, the monitor learns the runtime's exact exit status the moment it exits. It reports the runtime stopped only once the runtime's whole process group is gone. Because the monitor reaps the runtime itself, a group that still answers `EPERM` can only mean another member is still exiting, which removes the ambiguity behind #394. The monitor pushes an `exited` event to a connected daemon and keeps the exit status until the daemon acknowledges it, then removes its state directory and exits. A crash during a daemon restart or update is therefore never lost.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Commit exit state before acknowledging it

If the daemon sends the acknowledgment and crashes before durably recording the exit status and restart bookkeeping, the monitor removes its state directory and the next daemon has no way to recover the promised exact exit information. The protocol needs to require a durable commit before acknowledgment, with idempotent redelivery when an acknowledgment is lost, for the stated never-lost guarantee to hold.

Useful? React with 👍 / 👎.

Comment thread DESIGN.md Outdated

1. **Start.** The daemon runs `pv monitor start` with the runtime's command, arguments, private environment, log path, and stop policy. The command starts the long-lived monitor in a new session, so it survives the daemon's LaunchAgent restarts as runtimes do today. It returns only once the monitor's socket is listening, and prints `{version, address}` or an error, so the daemon gets a clear success or failure without polling for a socket.
2. **Run.** The monitor starts the runtime in its own process group, with the runtime's stdout and stderr connected to the monitor through pipes.
3. **Exit.** As the parent, the monitor learns the runtime's exact exit status the moment it exits. It reports the runtime stopped only once the runtime's whole process group is gone. Because the monitor reaps the runtime itself, a group that still answers `EPERM` can only mean another member is still exiting, which removes the ambiguity behind #394. The monitor pushes an `exited` event to a connected daemon and keeps the exit status until the daemon acknowledges it, then removes its state directory and exits. A crash during a daemon restart or update is therefore never lost.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Do not infer process-group ownership from EPERM

After the monitor reaps the group leader, EPERM is not proof that an owned group member is merely exiting: the numeric PID/PGID may have been reused by a process group the monitor cannot signal. The existing supervisor deliberately treats EPERM as insufficient to identify the owned group, so the monitor still needs a containment or identity mechanism for remaining group members rather than using reaping alone to remove that ambiguity.

Useful? React with 👍 / 👎.

Comment thread DESIGN.md Outdated

### Cutover

There is no backward compatibility (decided 2026-09-29). The first release with monitors does not adopt runtimes started from pid files. Stop the old runtimes once by hand on each machine before updating, and the new daemon starts every runtime under a monitor. Roll it out on one machine first and on the second a few days later.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Quiesce the old daemon during monitor cutover

Stopping the old runtimes by hand before updating leaves the old KeepAlive daemon active, and its health/reconciliation loop is explicitly responsible for restarting desired runtimes that stop. It can therefore recreate a runtime before or during pv update, after which the new daemon starts a monitor-owned replacement that collides on ports or the same data directory. The cutover must atomically disable or quiesce the old daemon and stop its runtimes as part of activation rather than relying on manual process kills.

Useful? React with 👍 / 👎.

Comment thread DESIGN.md Outdated
### Lifecycle

1. **Start.** The daemon runs `pv monitor start` with the runtime's command, arguments, private environment, log path, and stop policy. The command starts the long-lived monitor in a new session, so it survives the daemon's LaunchAgent restarts as runtimes do today. It returns only once the monitor's socket is listening, and prints `{version, address}` or an error, so the daemon gets a clear success or failure without polling for a socket.
2. **Run.** The monitor starts the runtime in its own process group, with the runtime's stdout and stderr connected to the monitor through pipes.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Publish runtime identity before the runtime can escape

The proposal starts the runtime before defining any crash-safe publication handshake for its PID and start identity. If the monitor dies after spawning the child but before atomically publishing a complete state record, directory scanning cannot discover or verify that live orphan and pv monitor delete cannot clean it up. Gate the child before exec or resume until its durable identity record exists, and only then report startup success.

Useful? React with 👍 / 👎.

Comment thread DESIGN.md Outdated
→ {"op":"version"}
← {"protocol":1,"pv":"0.3.0","runtime":"postgres:18"}
→ {"op":"stop"}
← {"stopped":true,"exit_code":0}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Represent signal termination in the frozen stop response

The response permanently models termination as an integer exit_code, but the frozen stop operation escalates to SIGKILL when its grace period expires. A Unix process terminated by a signal has no exit code, so this schema cannot report the promised exact status without inventing a lossy shell-style value. Define a signal-aware or optional status representation before freezing the protocol.

Useful? React with 👍 / 👎.

Comment thread DESIGN.md Outdated

### What it replaces

Once monitors run every runtime, PV no longer writes pid files or runtime metadata, adopts runtimes by checking their identity, or keeps the supervisor's script-identity fallback. `pv monitor delete` keeps the only identity check on macOS. The 30-second health tick stays for readiness probes, while crash detection becomes immediate through `exited` events.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve durable reconciliation state for live monitors

Removing runtime metadata also removes the durable command, arguments, private-environment/config fingerprints, replacement marker, and applied/desired/staged Caddy fingerprints currently used during adoption and reload recovery. The proposed state record contains none of these, so after a daemon restart a same-protocol monitor can be retained despite running a stale artifact or environment, and an unresolved POST /load can lose the marker that prevents an unsafe second load. Preserve a non-secret launch-spec fingerprint and the config transaction state in durable monitor or authoritative database state before removing runtime metadata.

Useful? React with 👍 / 👎.

Comment thread DESIGN.md Outdated

1. **Start.** The daemon runs `pv monitor start` with the runtime's command, arguments, private environment, log path, and stop policy. The command starts the long-lived monitor in a new session, so it survives the daemon's LaunchAgent restarts as runtimes do today. It returns only once the monitor's socket is listening, and prints `{version, address}` or an error, so the daemon gets a clear success or failure without polling for a socket.
2. **Run.** The monitor starts the runtime in its own process group, with the runtime's stdout and stderr connected to the monitor through pipes.
3. **Exit.** As the parent, the monitor learns the runtime's exact exit status the moment it exits. It reports the runtime stopped only once the runtime's whole process group is gone. Because the monitor reaps the runtime itself, a group that still answers `EPERM` can only mean another member is still exiting, which removes the ambiguity behind #394. The monitor pushes an `exited` event to a connected daemon and keeps the exit status until the daemon acknowledges it, then removes its state directory and exits. A crash during a daemon restart or update is therefore never lost.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Wait for old monitor cleanup before reusing its ID

The monitor removes its state directory only after the daemon acknowledges the exit, but the daemon may immediately restart a desired runtime after sending that acknowledgment. Because the replacement uses the same deterministic <id>, it can create its socket and state before the old monitor executes its removal, allowing the old monitor to delete the replacement's live directory. Make cleanup completion part of the stop/ack handshake, wait for the old monitor to exit before reuse, or use generation-specific directories.

Useful? React with 👍 / 👎.

Comment thread DESIGN.md Outdated

### Commands that stop every runtime

`pv daemon:disable` and `pv uninstall` stop every runtime by asking each monitor found under `~/.pv/run/m/` to stop it. This also closes a gap: Daemon Lifecycle says `pv daemon:disable` stops PV-managed processes first, but today it only unloads the LaunchAgent, without asking the daemon to stop any runtime.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Fence monitor creation before stop-all scans

pv daemon:disable is still specified to stop children before stopping the daemon, so an active reconciliation can create another monitor after the command takes its directory snapshot. The command can then unload the LaunchAgent while the missed monitor and runtime remain alive indefinitely under the recommended production owner-loss policy. Enter a quiescing state that rejects new starts and drains active mutation work before enumerating monitors, then verify the directory set is empty before completing shutdown.

Useful? React with 👍 / 👎.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Note

Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.

🟡 Other comments (1)
docs/superpowers/specs/2026-10-08-per-service-monitor-design.md (1)

97-97: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Define Linux cleanup when cgroups are unavailable.

Line 56 defines Linux recovery as killing the runtime cgroup, while Line 97 makes cgroup placement optional. If the monitor crashes before cleanup, descendants that left the process group may be re-parented to init and survive. Either mark Linux hosts without cgroups as unsupported or define a safe fallback that can identify and terminate those descendants.


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: QUIET
  • Plan: Advanced
  • Run ID: 2e632a9e-b8d4-48b4-b753-6e3feb6050fe
📥 Commits

Reviewing files that changed from the base of the PR and between b62b1a0 and f8ecaf2.

📒 Files selected for processing (1)
  • docs/superpowers/specs/2026-10-08-per-service-monitor-design.md

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.


**Everything else is versioned.** The daemon uses the other requests only when the monitor reports the daemon's own protocol version: `state`, `signal` (a signal sent to the runtime or to its process group), the `exited` event, acknowledging an exit, and log settings. These can change freely between versions.

**A version mismatch restarts that runtime once.** If a monitor reports a different protocol version, the daemon sends the frozen `stop`, then starts a new monitor and runtime with its own version. Self-updates that don't change the protocol keep runtimes running, as today.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Define cleanup for the frozen stop path.

When a protocol mismatch triggers frozen stop, specify that the daemon removes the old state directory after the process group exits, before starting the replacement monitor for the same <id>. The current lifecycle only defines directory removal after an exited acknowledgment, while frozen stop does not define that cleanup. A stale directory can prevent recovery.

@clvsh clvsh changed the title docs: propose a per-service monitor docs: specify per-service runtime monitors Oct 8, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes Reviewed d5bc48c against the prior Pullfrog review at f8ecaf2f, with the complete current spec and plan as context.

  • Clarified monitor ownership and policy: Defined indefinite production lifetime, daemon-selected stop parameters, monitor-completed escalation, and fallback cleanup after spontaneous leader exit.
  • Separated exit reporting from cleanup: Required prompt leader-exit state, non-reaping observation, explicit instance-scoped release, database commit before daemon consumption, and conservative recovery when ownership or Postgres cleanup cannot be proven.
  • Specified startup and replacement safety: Added the exec gate, published birth/boot identities, transferred subject reservation, authenticated monitor peers, and controller-owned record removal after verified process death.
  • Revised logging and configuration contracts: Selected direct append files with bounded copy-and-truncate rotation and accepted diagnostic loss, while preserving instance-bound configuration proof and separate Caddy admin peer verification.
  • Added lifecycle and rollout requirements: Defined the shutdown fix, external admission-lock scopes, five-PR dependency structure, updater-enforced cutover, rollback/recovery constraints, and process-level acceptance matrix.

Whitespace validation passed. Runtime tests were skipped because this PR changes documentation only; the plan assigns behavioral verification to the implementation PRs.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant