Skip to content

Host request lane: other PCs ask the GPU workstation for memory/RAG/model-hosting work through GitHub issues - #266

Merged
seathatflowsinourveins merged 2 commits into
mainfrom
claude/workstation-requests-20260925
Sep 25, 2026
Merged

seathatflowsinourveins merged 2 commits into
mainfrom
claude/workstation-requests-20260925

Conversation

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator

Scope

  • What this PR changes: adds a GitHub issue lane. Other PCs use it to ask a named host for work, and the named host tracks, claims and reports those requests. The GPU workstation nativestack-5975wx-20260925 owns end-to-end memory, RAG and model hosting/qualification, because the RTX 4090 and the Hugging Face sign-in are there. Other PCs file requests with the label host:workstation, and the workstation tracks them with scripts/host_requests.py.
  • Base commit: 3ff52117 (current origin/main)
  • Lane: lane:foundation. docs/lanes.md, AGENTS.md and the grand-dashboard state are deliberately left alone; a pointer from them is a later lane:shared change.
  • Owned paths touched:
    • adoption/host-roles.json
    • .github/ISSUE_TEMPLATE/workstation-request.yml
    • scripts/host_requests.py and tests/test_host_requests.py
    • adoption/templates/systemd/host-requests-workstation.{service,timer} (drafted, not installed)
    • recipes/host-request-lane.md, linked from recipes/README.md and listed in LINK_DOCS
    • docs/decisions/2026-09-25-host-request-lane.md

Design:

  • Roles. adoption/host-roles.json holds them. workstation owns memory-e2e, rag-e2e, model-hosting, model-qualification, gpu-runtime-qualification and independent-review. mac-coordinator owns macOS acceptance and coordination.
  • Allowed requesters. The physical peers are listed there. macos-m5pro-20260924 is marked superseded by mac-coordinator-64gb-20260925, citing Record host mac-coordinator-64gb-20260925: hardware profile and five use receipts #253.
  • Why requests are trusted only from the owner. The repository is public and every PC signs in as the same owner account, so the author cannot identify the host. The requesting host names itself in the form. A request can be acted on only when author_association == OWNER, user.type == User, performed_via_github_app is null, and the login equals the repository owner. An issue form applies its labels for anyone, so labels grant no trust.
  • State comes only from labels and closure. The states are new, request:claimed, request:blocked, done (closed completed) and declined (closed not_planned). Each request has one status comment, marked with a hidden tag and edited in place.
    • A claim refuses a request another session holds unless --takeover is given.
    • done requires a current claim.
    • Every write command has a --dry-run.
  • Issue text is data. Nothing runs, evaluates or forwards it to a model. status, poll and lanes withhold the title and host of untrusted items. Only --show-untrusted-text shows them, and it is meant for a human at a terminal.
  • poll writes a 0600 state file and prints one JSON line per event. It can optionally notify a loopback-only ntfy topic with a fixed-format line; no proxies or redirects are followed.
  • lanes reports lane-label hygiene over open PRs. Right now 6 open PRs have no lane label.
  • Execution stays with a coordinator session on the target host. The decision record gives the alternatives, with sources and conditions that would overturn the choice:
    • a self-hosted runner, which GitHub advises against for public repositories;
    • claude-code-action;
    • cloud routines or RemoteTrigger;
    • session-only cron;
    • Remote Control used as a queue;
    • Dagu as the poller, which remains a valid later swap;
    • automatic claude -p execution.

Evidence-class table

Claim Evidence class Command
Parsing, trust, state derivation, poll diff, atomic 0600 write, notify refusal and transport, lane hygiene, dry-run argv, claim ownership, done requires a claim, withheld untrusted text synthetic tests/test_host_requests.py: 82 tests with the docs-consistency module on 3.12 and 3.13. A mutation check killed 26 of 26 mutants.
status and lanes return well-formed JSON against the live repository (0 requests; 14 open PRs, 6 with no lane label) local_integration (read-only) /usr/bin/python3 scripts/host_requests.py status --role workstation --json; … lanes --json
The drafted units are valid systemd local_integration systemd-analyze --user verify on scratch copies; a negative control exits 1
The form matches the issue-forms schema synthetic (community SchemaStore schema, not GitHub's validator) 0 errors; a negative mutant gives 2
The whole lane (labels, a real request, claim, run, done) not yet run After merge: ensure-labels, install the timer from the live clone, then one real request from a Mac

Local commands run

$ /usr/bin/python3 -m unittest tests.test_host_requests tests.test_adoption_docs_consistency     # Ran 82, OK (skipped=1)
$ uv run … -m unittest tests.test_host_requests tests.test_adoption_docs_consistency tests.test_validate tests.test_evidence_manifest   # Ran 144, OK (skipped=2)
$ uv run … scripts/validate.py                 # passed (5511 hashed files)
$ uv run … scripts/build_ecosystem.py --check; new_host_grand_list.py --check; component_matrix.py --check   # passed
$ /usr/bin/python3 scripts/host_requests.py lanes --json    # open_pull_requests 14, pull_requests_missing_lane 6, host_labelled 0
$ /usr/bin/python3 scripts/host_requests.py claim 1 --role workstation --session x --dry-run   # printed gh argv, made no GitHub call

Before the rebase onto 3ff52117, the full suite passed on both interpreters: 5346 OK.

Decision record

docs/decisions/2026-09-25-host-request-lane.md

Review

  • Round 1 was an independent Opus reviewer. It returned needs_changes: 1 medium finding (claim takeover) and 6 low ones (untrusted text shown by status, YAML # truncating a description, the pending HF row, compose ticking the confirmations itself, done from blocked, and verification gaps).
  • Repair and re-check: the Opus repair round hit the weekly limit, so the repair and its re-check ran on Sonnet. All 7 findings are resolved, and the re-check verdict is ready.
  • Codex cross-family review is unavailable until 2026-09-30.
  • Residual: GitHub offers no compare-and-swap, so two claims issued at the same instant can both pass. The recipe documents this, and the procedure is to check status before running GPU work.

Host evidence

None yet. After merge I will create the labels, install and enable host-requests-workstation.timer from the live clone, and record the end-to-end run as evidence.

Checklist

  • No workflow changes (the .github/ISSUE_TEMPLATE form is not a workflow). [x] No secrets. [x] No paid surface. [x] Peer files preserved.

🤖 Generated with Claude Code

Scout and others added 2 commits September 25, 2026 13:36
… roles)

Other PCs ask a named host for work through GitHub issues; the GPU
workstation nativestack-5975wx-20260925 tracks, claims and reports them.
The tracker never executes, evaluates or forwards issue text to a model;
execution stays coordinator-run by a Claude session on the target host.

- adoption/host-roles.json: roles (workstation, mac-coordinator) and the
  requesting peers; every host_id is a native_proven hardware profile
  (test-enforced); macos-m5pro-20260924 is superseded by
  mac-coordinator-64gb-20260925 (PR #253 body).
- .github/ISSUE_TEMPLATE/workstation-request.yml: issue form with stable
  field ids and the host:workstation label (no config.yml).
- scripts/host_requests.py: stdlib gh-api tracker with roles, parse,
  compose, status, poll and lanes. Only claim, block, done, decline and
  ensure-labels write, and each takes --dry-run, which makes no GitHub
  call. Trust is the owner's own authorship only (OWNER, User, no GitHub
  App, repository owner); labels, titles and bodies never grant it.
- tests/test_host_requests.py: 39 no-network tests with a fake gh runner.
- adoption/templates/systemd/host-requests-workstation.{service,timer}:
  drafted oneshot poll on a monotonic 10-minute timer; not installed.
- recipes/host-request-lane.md (recipes/README.md row, LINK_DOCS entry)
  and docs/decisions/2026-09-25-host-request-lane.md.
- manifests/evidence.json: recipes/README.md re-registered with
  register_file (hot-file protocol).

Evidence class: a drafted lane (local_integration, synthetic,
source_review). No label, issue, claim, timer or notice was created on
GitHub or on any host.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ELD gap

A second independent review of the round-1 fix found seven residual findings.
All seven are resolved:

- scripts/host_requests.py: claim on a currently-claimed request now refuses
  (exit 3) a session that differs from the one the status comment names,
  unless --takeover is given; the same session re-claims idempotently
  (previously any session could silently overwrite another's claim).
- scripts/host_requests.py, recipes/host-request-lane.md: status and lanes
  already replaced an untrusted item's title/requesting-host with
  "<untrusted: withheld>"; this round adds the missing status
  --show-untrusted-text flag (documented for a human reader only) as the one
  way to see the raw text, in text and JSON output alike.
- scripts/host_requests.py: done now requires the request to be currently
  claimed (ACTIONS["done"]["from"] dropped "blocked"). block is reachable
  straight from new, so being blocked was not, by itself, evidence that any
  session had claimed and done the work.
- tests/test_host_requests.py: NoticeTransportTests posts to a loopback
  http.server with http_proxy/HTTP_PROXY set and a 302 responder, asserting
  the notice reaches only the topic and the redirect is not followed.
- .github/ISSUE_TEMPLATE/workstation-request.yml, recipes: the Related
  description stays quoted (round 1); the YAML cross-check test now compares
  description/placeholder text too, and the credential-row note and
  compose --confirm gating from round 1 are otherwise unchanged.
- docs/decisions/2026-09-25-host-request-lane.md: appended a dated,
  counts-only acceptance record for both fix rounds (test counts, a 26/26
  mutation check, systemd-analyze --user verify, SchemaStore re-validation).

Evidence class: local_integration and synthetic (see the decision record).
No label, issue, claim, timer or notice was created on GitHub or any host;
status/lanes were read read-only against the real repository for this check.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Sep 25, 2026
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@seathatflowsinourveins
seathatflowsinourveins merged commit ae30f94 into main Sep 25, 2026
23 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the claude/workstation-requests-20260925 branch September 25, 2026 18:32
seathatflowsinourveins added a commit that referenced this pull request Sep 25, 2026
… request lane (#298)

Two foundation gates. token-stack-subagent-e2e points at #296's receipt: 16 of
16 tools used in Sonnet workflow subagents with passing checks, RTK +56527
for the run-only worktree, Headroom +183904 lifetime, Codex workers blocked
until 2026-09-30. host-request-lane points at the #266 recipe: the workstation
poll timer runs every 10 min, 0 workstation requests, 2 mac-coordinator
requests open (#274, #276). Values use the dashboard token alphabet.

Co-authored-by: Scout <scout@local>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant