From 502f8208e4120da96ddf4efc4d1293d56a423edc Mon Sep 17 00:00:00 2001 From: tegwick Date: Thu, 5 Nov 2026 23:12:10 +0100 Subject: [PATCH] Target railiance01 explicitly for founder inventory execution Assistant: codex Assistant-Model: gpt-6.1-sol Assistant-Session: 01a1abf1-7e95-7141-87c9-ee78332bf790 --- ...-05-vergabe-founder-inventory-attempt.json | 13 ++++ .../README.md | 22 ++++++- tools/vergabe_pilot_inventory_remote.py | 59 +++++++++++++++++++ .../RAPPS-WP-0014-vergabe-invited-pilot.md | 16 ++++- 4 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 docs/evidence/2026-11-05-vergabe-founder-inventory-attempt.json create mode 100644 tools/vergabe_pilot_inventory_remote.py diff --git a/docs/evidence/2026-11-05-vergabe-founder-inventory-attempt.json b/docs/evidence/2026-11-05-vergabe-founder-inventory-attempt.json new file mode 100644 index 0000000..8782629 --- /dev/null +++ b/docs/evidence/2026-11-05-vergabe-founder-inventory-attempt.json @@ -0,0 +1,13 @@ +{ + "schema": "railiance.vergabe-pilot-native-inventory.v1", + "observed_at": "2026-11-05T22:05:14.439011+00:00", + "evidence_kind": "user_reported_terminal_output", + "workplan": "RAPPS-WP-0014", + "task": "RAPPS-WP-0014-T03", + "runtime_mutations": false, + "native_inventory_complete": false, + "cluster_read": "unavailable_or_invalid_response", + "execution_host": "not_reported", + "cluster_identity_or_outage_established": false, + "followup": "Use the reviewed workstation transport to connect explicitly to railiance01; return the remote inventory JSON." +} diff --git a/docs/proposals/2026-11-05-vergabe-recovery-preflight/README.md b/docs/proposals/2026-11-05-vergabe-recovery-preflight/README.md index d87750a..bc10b3b 100644 --- a/docs/proposals/2026-11-05-vergabe-recovery-preflight/README.md +++ b/docs/proposals/2026-11-05-vergabe-recovery-preflight/README.md @@ -43,8 +43,26 @@ path was unavailable in the invoking terminal; its host was not reported. The founder does not need an executor installation to perform their own reviewed read-only check. -From a synced `railiance-apps` checkout in the founder's own terminal on -**railiance01**, run: +The subsequent direct invocation returned `cluster_read: +unavailable_or_invalid_response`, without establishing a cluster identity. Its +execution host is unconfirmed. Use the explicit remote transport to avoid +depending on the workstation's root PATH or kubeconfig. + +From the **workstation** `railiance-apps` checkout in the founder's own +interactive terminal, run: + +```bash +git pull --ff-only +python3 tools/vergabe_pilot_inventory_remote.py --run +``` + +The transport validates the unchanged inventory source SHA256, connects through +the existing `ssh railiance01` login with a TTY and runs the pinned source with +the node's existing sudo/kubeconfig context. Source travels as one shell-quoted +argument, preserving stdin for the sudo prompt. There is no remote checkout or +local root Kubernetes context requirement. Default mode omits SSH execution. + +When already in a synced checkout **on railiance01**, the equivalent command is: ```bash sudo env KUBECONFIG=/etc/rancher/k3s/k3s.yaml /usr/bin/python3 tools/vergabe_pilot_inventory.py diff --git a/tools/vergabe_pilot_inventory_remote.py b/tools/vergabe_pilot_inventory_remote.py new file mode 100644 index 0000000..1a2904c --- /dev/null +++ b/tools/vergabe_pilot_inventory_remote.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +"""Run the pinned read-only inventory through the founder's existing SSH login. + +Run from the workstation checkout in the founder's own interactive terminal. +Default only reviews the transport. --run connects to railiance01 explicitly; +SSH and sudo authenticate in that terminal. No administrative credential leaves +the node. The public source travels as a quoted argument, preserving stdin for +the sudo prompt and avoiding a remote checkout requirement. +""" + +import argparse +import hashlib +import json +import shlex +import subprocess +import sys +from pathlib import Path + +SOURCE_SHA256 = "b610059b5d7398138062de51edab3555b973cfbb61f02fa684184852805d7507" +SOURCE = Path(__file__).with_name("vergabe_pilot_inventory.py") + + +def remote_command(source): + if hashlib.sha256(source.encode()).hexdigest() != SOURCE_SHA256: + raise ValueError("inventory_source_pin_mismatch") + operation = [ + "sudo", "/usr/bin/env", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml", + "/usr/bin/python3", "-c", source, + ] + return ["ssh", "-t", "railiance01", shlex.join(operation)] + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--run", action="store_true") + args = parser.parse_args(argv) + command = remote_command(SOURCE.read_text()) + if not args.run: + print(json.dumps({"status": "prepared", "ssh_target": "railiance01", + "inventory_source_sha256": SOURCE_SHA256, + "runtime_mutations": False})) + return 0 + if not sys.stdin.isatty(): + raise ValueError("founder_interactive_terminal_required") + return subprocess.run(command, check=False).returncode + + +if __name__ == "__main__": + try: + raise SystemExit(main()) + except ValueError as error: + reason = str(error) + if reason not in {"inventory_source_pin_mismatch", "founder_interactive_terminal_required"}: + reason = "invalid_transport_input" + print(json.dumps({"status": "launcher_failed", "failure": reason})) + raise SystemExit(1) + except OSError: + print(json.dumps({"status": "launcher_failed", "failure": "source_or_ssh_unavailable"})) + raise SystemExit(1) diff --git a/workplans/RAPPS-WP-0014-vergabe-invited-pilot.md b/workplans/RAPPS-WP-0014-vergabe-invited-pilot.md index f138162..50b17a7 100644 --- a/workplans/RAPPS-WP-0014-vergabe-invited-pilot.md +++ b/workplans/RAPPS-WP-0014-vergabe-invited-pilot.md @@ -196,7 +196,7 @@ id: RAPPS-WP-0014-T03 status: wait needs_human: true decision_id: d06307e5-2737-461a-a2f4-a12c3b492a9a -intervention_note: "Two-account functional walkthrough through Zuschlag/Nachlese is user-confirmed with UI follow-up. Next: founder runs the reviewed read-only inventory on railiance01 using the existing supervisor-execution lane. Gexec launcher stopped before submission because its binary was missing in the invoking terminal; host is unconfirmed. Agent privileges stay unchanged. Populated restart/off-host recovery, isolated restore, rollback, access evidence and ownership remain open." +intervention_note: "Functional walkthrough is confirmed with UI follow-up. Latest founder inventory returned cluster_read unavailable_or_invalid_response; invoking host is unconfirmed, so no cluster fault is inferred. Next: run tools/vergabe_pilot_inventory_remote.py --run from the founder workstation terminal to target railiance01 explicitly. Agent privileges stay unchanged. Native inventory, populated recovery/access/rollback and ownership remain open." priority: high assignee: the-custodian blocking_reason: "Two-account functional walkthrough is confirmed with UI follow-up. Await attended native inventory, populated restart, coherent PostgreSQL/media/issue-state off-host recovery, isolated restored workflow, rollback/access evidence and operating ownership. September 25 proves database-only restore and restart." @@ -356,6 +356,20 @@ The unnecessary custom founder launcher is retired from current source; its earlier preparation and failed attempt remain historical evidence. The pinned inventory helper and original agent gexec action remain unchanged. +2026-11-05 direct inventory return: user-reported JSON at 22:05:14Z has +`native_inventory_complete: false` and `cluster_read: +unavailable_or_invalid_response`. Host identity is unconfirmed; this establishes +neither a valid node inventory nor a cluster outage. Receipt: +`docs/evidence/2026-11-05-vergabe-founder-inventory-attempt.json`. + +Prepared `tools/vergabe_pilot_inventory_remote.py` for the founder's workstation +terminal. It verifies the unchanged inventory source pin and connects explicitly +through SSH to railiance01, running that source as a quoted argument under the +node's existing sudo context. Stdin remains available for normal authentication; +no remote checkout, local admin kubeconfig or agent privilege grant is needed. +Default mode only reviews transport. The agent did not execute the founder's +SSH/sudo path. Native inventory and all operational recovery evidence remain open. + ## Validate synthetic sizing against the exact release and shared contention