Measured network provenance in state: loopback and own-host traffic judged like exfiltration (curl localhost, ssh raw-ovh)
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 48/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- docker, docker-compose, typescript
Research direction
Start in index.ts and trace the gate's classification path before the battery is asked, including how command URLs, SSH configuration, /etc/hosts, and Docker port or network state are available. Define the measured localPorts, knownHosts, and dockerNetworks state, then trace the sends_local_data_outbound and contacts_remote_endpoint criteria. Done means those criteria can distinguish local or user-owned destinations without treating destructive SSH command bodies as safe.
Written by the indexing model from the issue text.
Description
Problem
curl http://localhost:8000/… and ssh raw-ovh … are the two most common network false-asks in the decisions log (declared scope contradicts command (network)), and the Jev port has no fix for either: the model still has to guess intent from the command text.
Log, 2026-09-09 to 2026-09-17 (197 blocks carry this class):
curl -s http://localhost:8000/…,curl -s http://localhost:3111/health,curl -s -b jar http://localhost:8000/my-garage/— loopback probes of the user's own dev server (the local WordPress running underdocker composein this repo). This machine talking to itself over loopback is a local read; the model readscurl http://…and sees an outbound network write.ssh raw-ovh 'wp db query "SELECT …"',ssh raw-ovh 'ls /tmp',ssh raw-ovh 'mysql --version'— the user's own named deploy host carrying read-only inspection.raw-ovhis the user's own production box in this environment, but the model has no way to know this.
Measured weight: this class is ~6% of all blocks in the window and cannot be fixed by prompt editing — the state carries no network provenance for a called host, so every command that happens to use a remote-looking URL gets judged by vibes.
Proposal
Give the state a measured network-tier field the gate produces at classification time, before the battery is asked. Keep it dumb and local-only: the gate does not need to classify the reachable internet, it needs to name the destinations the command talks to and what kind they are.
Fields to derive in index.ts, keyed off the command's own textual URLs/hosts plus process context:
localPorts— ports on loopback (127.0.0.1/localhost/::1).knownHosts— hosts the user's own SSH config,/etc/hosts, and running-docker-port state name (this catchesraw-ovh, which lives in SSH config).dockerNetworks— when the command targets a compose service (docker compose exec db …) or docker-published port, whether that service resolves inside the local Docker network.
The criteria for sends_local_data_outbound and contacts_remote_endpoint can then say what to do with these: loopback to a process the user owns (the local dev server, a local API) is the machine reading itself; an SSH alias resolving from the user's own config to the user's own host is the user's own machine, not an exfiltration target. Both of those criteria sentences already gesture at it ("the service that issued it", "the destination that has no business holding it") but have no field to point at.
Trust constraint, same as omp-classifier#63: these are measured by the gate, not reported by the caller. The gate reads SSH config, /etc/hosts, and docker port from the same machine the command will run on. That's what makes the "this is your own host" sentence something the battery can rely on.
Non-goal
Not asking to trust raw-ovh as safe generally: the criteria change still treats ssh <user-alias> <destructive-cmd> as destructive on its command body, not its hostname. Interest is in the host tier, not blanket allow of ssh.
Related
- Measured false-asks this would fix: all
curl http://localhost:…in the log (docker compose-managed WordPress dev server), allssh raw-ovh '<read-only>'in the log,docker compose ps|logs|execagainst the local dev stack. - Same measured friction family as omp-classifier#63 and #64: the three together cover the top-4 named block classes in the log window 09-09 to 09-17.
- Dominant language
- TypeScript
- Stars
- 0
- Forks
- 1
- Avg merge
- 1h 20m
- Merged PRs (30d)
- 32
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from STRML/omp-classifier
-
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
STRML/omp-classifier#81 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
STRML/omp-classifier#80 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
STRML/omp-classifier#78 ·
-
Difficulty 5/5 Over a week Newbie friendliness 30/100
STRML/omp-classifier#84 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 72/100
STRML/omp-classifier#82 ·
All issues in STRML/omp-classifier
Similar issues
-
Browser Waiting for: Product Owner
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
getsentry/sentry-javascript#24577 · 1 comment ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
agilepathway/label-checker#640 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
copse-dev/agent-pane#2953 ·
-
agentic-workflows
Difficulty 1/5 Under an hour Newbie friendliness 85/100
githubnext/rig#534 ·
-
automation missing-model model-sync provider:pioneer
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
anomalyco/models.dev#7701 ·