Skip to content

fix: UAT-driven parity — role commands, info output, -H dispatch#101

Merged
maxholman merged 10 commits intomainfrom
fix/uat-parity
Mar 21, 2026
Merged

fix: UAT-driven parity — role commands, info output, -H dispatch#101
maxholman merged 10 commits intomainfrom
fix/uat-parity

Conversation

@maxholman
Copy link
Copy Markdown
Contributor

@maxholman maxholman commented Mar 20, 2026

Summary

Four commits driven by 5 UAT sessions. Establishes interface parity across REPL, CLI, MCP, REST, and OpenAPI.

Commits:

  1. fix: disambiguate "Role resolved" log line and route display — log shows local_role=entry peer_role=exit, route display uses via
  2. fix: show fixed role immediately in info, fix -H flag dispatch--role entry shows role: entry before peer connects; -H flag no longer routes to daemon mode
  3. refactor: rename hint_set → role across MCP, REST, and OpenAPI — single role tool/endpoint, level defaults to fixed, removed confusing connect=false from info
  4. refactor(cli): unify --prefer-role/--exclude-role/--role into --role — one flag with colon syntax: --role entry, --role prefer:entry, --role exclude:relay, --role auto

How to verify

  • Daemon: wallhack --role prefer:entry --listen :443
  • Control: wallhackctl role prefer entry / wallhackctl role auto
  • MCP: role(role="entry") / role(role="auto")
  • REST: PUT /role {"role":"entry"} / PUT /role {"role":"auto"}
  • wallhack -H /path info dispatches to control client
  • Logs: Role resolved: peer=X local_role=entry peer_role=exit

🤖 Generated with Claude Code

maxholman and others added 5 commits March 20, 2026 19:46
The log "Role resolved: name=X role=entry" was confusing because it
displayed the local node's resolved role next to the peer's name,
reading as if the peer's role was entry. Changed to
"Role resolved: peer=X local_role=entry" to prevent misreading.

Also: route display uses "via" instead of arrow, stale subcommand
reference removed from help text.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. When --role is set with Fixed hint, info now shows the configured
   role immediately instead of "indeterminate" until a peer connects.
   With a fixed hint there is no negotiation — the role is decided.

2. -H/--host flag no longer triggers daemon dispatch. The heuristic
   "first arg starts with dash = daemon mode" incorrectly routed
   wallhack -H /path route list to the daemon CLI instead of the
   control client.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Every UAT session flagged hint_set as confusing — "hints" is protocol
jargon. The REPL and CLI already use "role" (role entry, role prefer
exit, role auto). This aligns MCP and REST to match:

- MCP: hint_set → role, hint_set_auto → role_auto
- REST: PUT/DELETE /hints → PUT/DELETE /role
- OpenAPI: HintSetRequest → RoleSetRequest, operationIds updated
- level parameter now defaults to "fixed" (matches REPL: "role entry"
  means "role fixed entry")

Also: removed confusing connect=false/listen=false from info output
capabilities — the address fields already show this information.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
maxholman and others added 5 commits March 20, 2026 22:29
Three daemon startup flags consolidated into one:
  --role entry          (fixed, shorthand)
  --role prefer:entry   (soft preference)
  --role exclude:relay  (avoid)
  --role auto           (clear)

Colon syntax follows the level:role pattern (like RUST_LOG's
module=level). Bare role name defaults to fixed.

AGENTS.md updated with strict interface parity rule.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- ssh-leaked-key: SSH with ed25519 deploy key on gateway-perimeter
- ftp-loot: private key + README on FTP server anon root
- vuln-upload: Flask file upload + /exec on gateway-office :8080
- vuln-cron: writable /opt/tasks with 15s cron on gateway-datacenter
- Intranet page links to gateway upload portal
- API server leaks monitoring SSH creds and task runner location
- Pontoon config: allow_tools/allow_binaries per-VM restrictions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
vsftpd stdlib uses /ftp/ as anon root, not /srv/ftp/. Moved
ftp-loot configs to match. Also fixed key permissions (644).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- ssh-leaked-key: remove stale /etc/initrd/ copy, unlock deploy account,
  fix setgid on home dir
- vuln-upload: fix server.py path (/app/ not /etc/initrd/app/)
- attacker: add openssh-client package and /home/pontoon/.ssh dir
- corp-proxy: add wallhack layer for platinum side-path
- UAT report from session 2026-03-21-2

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@maxholman maxholman merged commit d3c92e0 into main Mar 21, 2026
6 checks passed
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