Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ to evaluate it.

## [0.3.2] - 2026-07-26

0.3.2 was never tagged on its own: it shipped inside the v0.4.0 release
commit, so its link points at the pull request that carried it.

The control channel gate now reminds instead of refusing. A gate that returns
a dead end teaches the operator to work around it; a gate that states the
residual risk and records consent keeps the decision visible.
Expand Down Expand Up @@ -198,6 +201,6 @@ together.
produced and reviewed, but nothing applied them.

[Unreleased]: https://github.com/Con-Benksl/NetOps/compare/v0.4.0...HEAD
[0.4.0]: https://github.com/Con-Benksl/NetOps/compare/v0.3.2...v0.4.0
[0.3.2]: https://github.com/Con-Benksl/NetOps/compare/v0.3.1...v0.3.2
[0.4.0]: https://github.com/Con-Benksl/NetOps/compare/v0.3.1...v0.4.0
[0.3.2]: https://github.com/Con-Benksl/NetOps/pull/2
[0.3.1]: https://github.com/Con-Benksl/NetOps/releases/tag/v0.3.1
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Before any action that can restart a proxy, take over TUN, or change DNS, routes

1. **Risk resolved** (`decision: allow`). The target is proven independent of the agent's current path, or a complete automatic rollback contract covers every declared target. Proceed under normal authorisation: show impact, backup, verification, and rollback, then get an explicit yes.
2. **Risk unresolved on a remote target** (`decision: warn`, `can_apply_with_acknowledgment: true`). The gate does not refuse. It presents a risk card: what breaks, the recovery path, the residual risks, and the safer alternatives. The change proceeds only after the user explicitly accepts the residual risk for that specific operation, via `--accept-residual-risk`, and the accepted risks are written into the receipt as `acknowledged_risks`.
3. **Local control plane** (`execution_mode: manual-local-control-plane`, `can_apply_with_acknowledgment: false`). Switching local TUN, the system proxy, an active proxy process, DNS, routes, or the firewall stays outside the remote executor no matter what the user consents to, because consent cannot keep a socket open. The user performs that one switch; the agent confirms it is still online and then continues the remote work itself.
3. **Local control plane** (`execution_mode: manual-local-control-plane`, `can_apply_with_acknowledgment: false`). Switching local TUN, the system proxy, an active proxy process, DNS, routes, or the firewall stays outside the remote executor no matter what the user consents to, because consent cannot keep a socket open. By default the user performs that one switch. If the user explicitly asks the agent to perform it and accepts the disconnection risk after seeing the recovery card, the agent may execute it locally, one action at a time; either way the agent confirms it is still online and then continues the remote work itself.

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 Point to the canonical safety contract instead

Replace this newly added local-delegation procedure with a pointer to the canonical reference rather than repeating the exception here and again in the execution-mode table. The repository requires control-channel and informed-consent rules to live only in references/control-channel-safety.md; duplicating the exact authorization and sequencing requirements in the README allows a future safety update to leave this user-facing copy stale.

AGENTS.md reference: AGENTS.md:L18-L22

Useful? React with 👍 / 👎.


Consent is per operation and is recorded. It is not a mode you can leave switched on.

Expand Down Expand Up @@ -182,7 +182,7 @@ Once installed, every example below also works with the bare `netopsctl` entry p
| --- | --- |
| `direct-ssh-or-plan` | The target is proven off the agent's path; direct SSH or the exact plan executor may proceed after authorisation |
| `exact-plan` | A shared path with a complete rollback contract; only the exact plan executor, with the timer armed before the first write |
| `manual-local-control-plane` | Touches the local TUN, system proxy, DNS, routes, or firewall; the user performs that switch, consent cannot delegate it |
| `manual-local-control-plane` | Touches the local TUN, system proxy, DNS, routes, or firewall; consent cannot hand it to the remote executor. The user performs the switch by default, or the agent does it locally one action at a time on explicit request |
| `read-only` | Path facts are still missing; establish them before changing anything |

## What it inspects
Expand Down Expand Up @@ -306,7 +306,7 @@ python3 scripts/check_install_tree.py .
python3 scripts/release_check.py .
```

That suite is 412 tests as of 0.4.0, covering the scanner, redaction, fleet and change contracts, the control channel gate, monitor privacy, serialisation safety, release integrity, and reproducible builds.
That suite is 414 tests as of 0.4.0, covering the scanner, redaction, fleet and change contracts, the control channel gate, monitor privacy, serialisation safety, release integrity, and reproducible builds.

Release artefacts must clear a double build gate. Install the pinned build tooling, then pass an explicit Unix timestamp and an output directory that does not yet exist:

Expand Down