declare → gate → record
You Hold the Keys. The AI Does the Chores.
A supervised bridge for local agents to navigate bastions and WinRM targets—without ever touching a vault.
v0.2.0 · supervised use · Proprietary
start
local operator
$ Get-Service MonitoringAgent
typed here · nothing storedgate
the gate
BLOCKEDCONFIRMALLOWEDthis command: allowed · still recorded
hop 1
bastion1 :2222
ssh · key + password
hop 2
JumpServer01
winrm in tunnel
target
win-target02
exit 0
audit · one fsynced line per action{"action":"COMMAND_EXECUTE","target":"win-target02","result":"SUCCESS"}
Illustration of a declared route from the example inventory. Only the SSH leg is a verified path. WinRM through a bastion is unit-tested, and Windows jump host to Windows target is not yet proven; see which paths are.
Why
Every hop costs a login. None of it is recorded.
This is the careful version.
Declared, never discovered.
Every route is written in the inventory. The tool does not scan for paths, and it does not cross from one environment into another.
Catalogued, not improvised.
Operations have names, are bound to the hosts they may run on, and can be narrowed again for a single session.
Typed, never stored.
A person types the password at every hop. It is held in memory for the session, wiped on disconnect and scrubbed from output.
Gates
Five gates, not one flag.
Every command is judged before it leaves your machine.
- RouteThe host must have a declared route. Nothing is discovered.
- Catalogue bindingThe operation must be bound to that host.
- Session allow-list
--opslimits one session to named catalogue operations. Ad-hoc commands still meet the deny-list. - Permission gateGated operations need a person. An agent's
--confirmcarries no weight; without AgentLighthouse its request is refused. - Command deny-listCommand text is checked against two tiers, below.
Blocked outright. No flag overrides it.
Format-Volumemkfsdd of=/dev/sdarm -rf /Disable-PSRemotingRuns only after a person approves the rendered command. An agent's --confirm does not count.
Restart-ComputerStop-Servicemsiexec /xchmodapt installGoes straight through, and is still recorded.
Get-Servicedf -ktailhostnameThe command bench
Pick a command and watch it go through. An illustration of documented behaviour, not live traffic.
- commandpick one
- gate—
- hop 1bastion1
- hop 2JumpServer01
- targetwin-target02
- audit—
Nothing sent yet.
This is not a sandbox. It stops a plausible mistake from becoming an outage; sshd_config is still the real control.
Capabilities
What changes in a change window.
Zero-storage credentials
Prompted per hop, held in memory, wiped on disconnect. Keyboard-interactive and MFA prompts pass through to you.
In-process tunnels
The equivalent of ssh -L, opened inside the process, so there is no second terminal to manage.
WinRM, not RDP
Real output streams and real exit codes, including MSI 1603 and 3010.
The wrong-host guard
ac verify --expect-hostname checks that the machine you reached is the machine you meant.
Failure diagnosis
Nominated logs are collected, an exit-code hint is added, and --start-at resumes from the failed step.
An audit trail with identity
One fsynced JSON line per action, across 16 action types, each tied to an agent and session identity.
Session
The session window is a prompt.
It always names the machine your next command reaches.
$ uv run ac connect win-target02 hop 1 bastion1 operator@bastion1.example.net:2222 authenticated hop 2 JumpServer01 winrm, in-process tunnel authenticated deploy@win-target02 [win-target02] > hostname WIN-TARGET02 exit 0 via winrm deploy@win-target02 [win-target02] > Format-Volume -DriveLetter D COMMAND_BLOCKED deny-list tier: BLOCKED · recorded, not sent
Illustration with placeholder hosts; the output layout is simplified.
If the last leg fails but a bastion authenticated, the session is held at that hop instead of being thrown away. The prompt is marked FALLBACK, and :retry tries the final leg again at no credential cost.
Evidence
Proven where it says so.
And nowhere else.
- SSH through bastionsUnix targets, verified end to end on AIX.Verified
- Direct WinRMVerified against Windows Server 2022.Verified
- WinRM through an SSH bastionImplemented and unit-tested; prove it with
ac probe --deepand a read-only operation first.Unit-tested - Nested Windows to WindowsNot yet proven on real hardware.Not yet proven
Ready for supervised use on the SSH and direct-WinRM paths; the readiness assessment predates version 0.2.0. A live run found three defects the offline tests missed, and they were fixed.
optional · AgentLighthouse
Add a gate a flag cannot satisfy.
Optional: run access-control behind AgentLighthouse. A plain install is standalone and changes nothing. Opt in with access-control[lighthouse].
- out-of-band approval
- identity-bound policy
- signed, hash-chained receipts from AgentLighthouse
Limits
What it is not.
None of this is hidden in the docs.
- It cannot run unattended.A person opens every session and types every credential.
- Operations are not idempotent.It is procedural, like a runbook. After a failure, fix the cause and resume with
--start-at. - It is not a sandbox.The servers' own access controls remain the real boundary.
- The route graph and deny-list are advisory.They catch plausible mistakes; they do not stop a determined one.
- The audit trail is not tamper-evident.It is written by the audited process. Treat it as a record, not as proof.
- A handful of hosts, not a fleet.One person-opened session per host; a campaign drives up to 8 at once by default.
Try it
First session, step by step.
Nothing is installed on the servers.
$ git clone https://github.com/neural-nomad1709/access_control $ git clone https://github.com/neural-nomad1709/agentlighthouse AgentLighthouse # sibling checkout, required by uv sources $ cd access_control $ uv sync $ uv run ac doctor $ uv run ac routes $ uv run ac probe target1 --deep $ uv run ac connect target1 --ops install-package # passwords are prompted here, per hop $ uv run ac verify target1 --expect-hostname TARGET1 $ uv run ac preview target1 install-package -p package=agent.msi
Proprietary. The repository has no licence file; ask before use. Hostnames above are placeholders. AC_ALLOW_ENV_CREDENTIALS is a testing-only switch; leave it unset.