diff --git a/WORK-SESSION-ID b/WORK-SESSION-ID new file mode 100644 index 0000000..b9d7c83 --- /dev/null +++ b/WORK-SESSION-ID @@ -0,0 +1 @@ +e1079fafb8c37d60 diff --git a/handoff/cto-state-20260828/.coordinate/BOARD.md b/handoff/cto-state-20260828/.coordinate/BOARD.md new file mode 100644 index 0000000..9fd44d4 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/BOARD.md @@ -0,0 +1,17 @@ +# Board +- TSGCTO-PMO (screen TSGCTO-PMO): manager. Founder liaison, planning, TASKs. +- TSGCTO-Work (screen TSGCTO-Work): loop orchestrator. Executes inbox-work. +- reachableceo (Charles): final authority, sudo holder. Direct channel. +- RCEO-PMO/Work (reachableceo account, screens RCEO-PMO/RCEO-Work): 5th vertical, OFF-LIMITS to TSGCTO (Charles works it directly). + +Org context (founder, 2026-08-28): no CEO by design. Officers: CTO, CCO, COO — +all report to BOD. CTO + COO lanes run in parallel through 1/1. +COO prerequisites (k8s standup, Jenkins on Cloudron) gate some CTO steps. +COO (user TSGCOO, owns PFVCluster + TSYSDevStack-SupportStack-Cloudron repos) +runs its own PMO on this system; CTO-PMO stays broadly aware of COO Redmine +projects via SoR once creds arrive (WIRING-SOR.md). Other accounts: TSGBOD, +TSGCCO (officer), TSGCTPO. No cross-home access by design. Proposed +cross-vertical awareness: /home/_crossfeed (see log 07:2x; awaiting founder +setup). + +Current focus: FOUNDER GATE ACTIVE (no dispatch without founder release). Batch 1 interrupted (quota) after 5 fixed + 1 skipped (camotics, SCons) + stats edited + 3 prepped; lineage b339e9a for batch-1b resume. Awaiting: gate formal text (never received via crossfeed - COO STATUS 08:39 lacks it), SoR creds (WIRING-SOR.md), reachableceo PMO/work stack next body of work. diff --git a/handoff/cto-state-20260828/.coordinate/CTOHandoff.md b/handoff/cto-state-20260828/.coordinate/CTOHandoff.md new file mode 100755 index 0000000..d400a9c --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/CTOHandoff.md @@ -0,0 +1,40 @@ +# TSYS Dev Stack — CTO Handoff: R&D Engineering Stack Orientation + +> Snapshot: 2026-08-26 · 90-day goal: full hardware-startup R&D engineering stack (RF, CFD, CAD, EDA, etc.) served over k8s. + +## The 90-day topology + +| Stratum | Location | Repo | State | +|---|---|---|---| +| **Compute/network** | Austin home server room | `~/projects/PFVCluster` | Live: 7-node Proxmox, k3s v1.36.2 HA (3 cnodes, 6-7 workers, Tailscale-only), NFS storage (no Ceph), AWX, OAM stack. SoR = Redmine p55; docs = Discourse #296-309 | +| **Eng tooling factory** | Built on workstation; runs in Austin | `~/projects/TSYSDevStack-RandD/EngStack` | 13 images / 10 tools built; 14 builds failed (fix queue in `TODO.md`); gow skins, registry push, k8s deploy not started | +| **Support/orchestration** | Reston VA (Cloudron) | `~/projects/TSYSDevStack-SupportStack-Cloudron` | 9/57 apps packaged-committed (inventree built-uncommitted); CI for packaging itself is a documented gap | + +## Integration seams for the R&D-on-k8s goal + +- EngStack → own Docker registry (`secrets/.env.example` ready) → k3s workers; GUI serving via Wolf/GoW (`angelnu/games-on-whales` Helm chart), headless HPC (OpenFOAM/Elmer/yosys) as plain Jobs/Deployments +- PFVCluster has **zero GPU/SDR/JTAG passthrough** documented — that work belongs in RandD; NVIDIA + PlutoSDR/RTL-SDR land on k8s worker VMs (tsys3/5/6/7/9) +- Cloudron support stack complements: Windmill (automation), Review Board, Healthchecks, APISIX, plus planned NetBox/ChirpStack/SDRangel/Slurm + +## EngStack build state (detail) + +**Built (13 images / 10 tools):** netbeans (core+x11, reference app), eclipse (core+x11), freecad (core+x11, conda-forge), openfoam, grib, containerlab, microvm, noaa, gis-etl, habhub. + +**Failed (14, root causes + fixes in `EngStack/TODO.md`):** yosys-fpga, openshot, wx-dev, streamdeck, natron, stats, gns3, openems, obs, darktable, orcaslicer, camotics, flatcam, daw, inkscape-ext, elmer — mostly Ubuntu 24.04 package-name churn, guessed release URLs, missing git/ca-certificates. + +**Deferred:** Xilinx Vivado (~100GB, do LAST), TI CCS, Android Studio, SDR deep-dive (PlutoSDR + RTL-SDR v1/v2/v3, server-on-k8s / client-on-workstation split). + +## Flags found while orienting + +- **Disk 95% full (14G free)** — 107.7GB reclaimable build cache; needs a prune before further builds +- `~/.kube/config` is a **directory** (broken); real kubeconfig is `~/.kube/config.pfv-k8s` per PFVCluster convention +- Host docs stale: actual 8 cores / 23Gi RAM vs `startstate.md`'s recorded 4 / 8.5Gi +- Workstation Docker daemon also runs the SupportStack-Local demos (~26 containers) — capacity contention during heavy eng builds + +## Recommended sequence + +1. Reclaim disk (build-cache prune) +2. Fix the 14 failed builds (`bash scripts/build.sh core`) +3. GPU / SDR passthrough design (NVIDIA + PlutoSDR/RTL-SDR → k8s worker VMs) +4. Registry push + k3s promotion (Wolf Helm chart for GUI, Jobs for headless HPC) +5. Proprietary tooling sessions (Xilinx last) diff --git a/handoff/cto-state-20260828/.coordinate/NOTICE-stack-relaunch.md b/handoff/cto-state-20260828/.coordinate/NOTICE-stack-relaunch.md new file mode 100644 index 0000000..d6d6403 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/NOTICE-stack-relaunch.md @@ -0,0 +1,6 @@ +Founder directive: PMO + Work screens now auto-relaunch crush (wrapper: +~/.coordinate/scripts/pmo-loop.sh pmo|work; logs: logs/-relaunch.log). +Screen names normalized org-wide: -PMO and -Work ("TSGCOO-Crush" +retired). Controls: touch ~/.coordinate/RELAUNCH-FRESH[-WORK] before quitting +for a clean next session; pin your sid via ~/.coordinate/[WORK-]SESSION-ID +(yours may be pre-pinned). Founder attaches via screen -r /. diff --git a/handoff/cto-state-20260828/.coordinate/PMO-SESSION-ID b/handoff/cto-state-20260828/.coordinate/PMO-SESSION-ID new file mode 100644 index 0000000..24103ad --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/PMO-SESSION-ID @@ -0,0 +1 @@ +2fb8da551ae30c24 diff --git a/handoff/cto-state-20260828/.coordinate/PREFS-reachableceo.md b/handoff/cto-state-20260828/.coordinate/PREFS-reachableceo.md new file mode 100644 index 0000000..71d15b8 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/PREFS-reachableceo.md @@ -0,0 +1,11 @@ +- Call him reachableceo or Charles. NEVER "the founder" (his words: creepy). +# Founder preferences (durable) +- Terse replies (<=5 lines unless detail requested); cite file paths, never restate task/report text. +- Careful/safe ops on ALL work (founder, 2026-08-28): scripts that mutate + anything get preflight checks before mutation, a stated plan, and verify + steps after. Idempotent where possible. Confirm gate when interactive. +- reachableceo has passwordless sudo for ROOT target only; run-as-other-user + must route via `sudo runuser -u -- ...` (sudo -u prompts password). +- Vertical homes are 700; cross-user path tests must run via sudo. +- Host is Debian 13 (verified 2026-08-28). Never assume distro/paths/commands - verify. +- Founder wants reachableceo PMO/work stack next (for sudo + Bitwarden work), after crossfeed body of work. diff --git a/handoff/cto-state-20260828/.coordinate/PROTOCOL.md b/handoff/cto-state-20260828/.coordinate/PROTOCOL.md new file mode 100644 index 0000000..cceb164 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/PROTOCOL.md @@ -0,0 +1,89 @@ +# TSGCTO .coordinate — agent-to-agent scratch channel + +Both agents (TSGCTO-PMO, TSGCTO-Work) run as the TSGCTO user. This +directory is LOCAL SCRATCH under $HOME: not git-tracked, not durable. It +exists so routine agent-to-agent traffic costs a local file write instead +of a network round trip. Safe to wipe and rebuild; agents should not treat +anything here as permanent. Durable artifacts stay here until the founder +attaches systems of record for this stack. + +Layout: +- inbox-work/ PMO writes, Work reads: TASK---.md, + CANCEL-.md to drop a task. +- inbox-pmo/ Work writes, PMO reads: REPORT-*.md (done + evidence), + QUESTION-*.md (needs a PMO call), BLOCKED-*.md (stuck + why). +- archive/ items fully handled get moved here; prune anything >30 days. +- BOARD.md roster + standing state (roles, current focus). +- log.md append-only journal, one line per event: + date -Is | WHO | what happened +- prompts/ standing prompt/intro files. logs/ worker output. + +TASK file fields: Objective / Context (paths) / Constraints / +Deliverable(s) / Priority (P1 first, then P2, P3). + +Turn-start checklist (both agents, every turn): read BOARD.md, scan your +inbox, tail log.md. + +Rules: +- PMO plans, prioritizes, writes TASKs, reports to the founder on drop-in. +- Work executes inbox-work in priority order; one turn = do work, then + reply in inbox-pmo and archive the TASK. Work never self-assigns scope + (suggest via QUESTION instead). +- Empty inbox when pinged: say so and stop. No watchers/polling loops. +- No sudo for either agent; root needs go BLOCKED -> PMO -> founder. +- NO repos, git remotes, or SSH on this account (founder policy): no + clone/init/push, no SSH, no git network operations. +- Shared account courtesy: never kill the other session screen, no long + locks. + +Activation: __USR__-Work sits idle between turns. After writing a TASK, PMO +pings it (same account, no sudo): + screen -S TSGCTO-Work -X stuff "New TASK in inbox-work - process per protocol now.$(printf '\r')" +Never attach to its screen. Headless worker output goes to logs/.log. + +## Crossfeed (founder directive, 2026-08-28) +- /home/_crossfeed/{bod,cto,cco,coo,founder}/ — cross-vertical awareness. Rules: + /home/_crossfeed/README.md (authoritative). +- PMO turn-start: also read peer STATUS.md files (incl. founder/ = RCEO vertical). +- PMO turn-end (active turns): publish/update /home/_crossfeed/cto/STATUS.md + (shape per README). Work does not touch crossfeed. +- Ambient awareness ONLY; requests with teeth go founder or SoR. + +## Dispatch mechanics v2 (adopted from TSGCOO PATTERN-agent-orchestration.md, 2026-08-28; LIVE) +- screen -X stuff is DOORBELL-ONLY: fixed short line, never task text. + Doorbell to Work: "New TASK in inbox-work - process per protocol now." + Doorbell to PMO (completion): scripts/ping-pmo.sh ("Work turn done..."). +- Dispatch = headless run with session continuity: + screen -dmS work-turn- bash -c 'cd /home/TSGCTO && env HOME=/home/TSGCTO + TERM=xterm-256color crush run --quiet --session "$(cat )" > + ~/.coordinate/logs/.log 2>&1; ~/.coordinate/scripts/ping-pmo.sh' + Prompt files live in prompts/ (preamble + TASK content); first dispatch omits + --session; capture lineage id after via `crush session last --json` into BOARD.md. +- Serialize: check `screen -ls` for live work-turn-* before dispatching. +- Interactive TSGCTO-Work screen: RETIRED from dispatch duty (kept alive, idle). + Monitor workers by reading logs/.log — never attach, no watchers. + +## Founder approve/release gate (founder directive, adopted 2026-08-28) +- NO work-turn dispatch without explicit founder release ("go") for that batch. +- PMO stages TASKs in inbox-work (queued, not dispatched) and presents the + batch for approval. Exception: none. Interruption: kill at tool boundary, + record lineage SID, reconcile from logs/TODO.md. + +## Shared tooling repos (org standard, 2026-08-28) +- Canonical source: /home/_crossfeed/tooling/{agent-stack,credentials,integrations} + (group users, setgid; commit via ../commit.sh ""; never secrets/ + tokens/session pins/logs in git). NO founder-run scripts from /tmp ever again. +- Fix wrappers/screens in agent-stack repo + reinstall (keep `# source:` stamps). +- Offstage/COS flows: clone from tagged SHA; changes back via git bundle in + /home/_crossfeed/outbox. Runtime secrets live in ~/.coordinate/secrets/ (700). + +## Dispatch v3 — quota-metered (2026-08-28, GOVERNANCE.md) +- Work-turns launch ONLY via ~/.coordinate/scripts/dispatch-turn.sh + inside screen -dmS work-turn-. Semaphore-gated + (org cap; DEFER doorbell if full), FRESH session by default (small + context; turns self-bootstrap from prompt), OK/FAIL doorbells automatic. +- Long lineage sids: PMO conversations only, never work-turns. +- Capture vs execution: ideas/backlog from reachableceo land as P3 TASKs or + Redmine issues (zero quota); execution sequenced by PMO under the gate. +- Grinder pattern: big bodies of work = chunk TASKs; each completion + doorbell authorizes the next chunk dispatch. No daemons, no watchers. diff --git a/handoff/cto-state-20260828/.coordinate/WIRING-SOR.md b/handoff/cto-state-20260828/.coordinate/WIRING-SOR.md new file mode 100644 index 0000000..74ee1c3 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/WIRING-SOR.md @@ -0,0 +1,17 @@ +# Wiring TSGCTO to systems of record — needs from founder +Created: 2026-08-28 | Status: AWAITING FOUNDER INPUT + +Attempted discovery 2026-08-28: full sweep of /home/TSGCTO (incl. projects/, +.coordinate/) — zero references to gitea/discourse/redmine; no .gitconfig, +.ssh, or .netrc. Nothing attachable without founder input. + +| System | Need | Why | +|-----------|-----------------------------------------------|-----| +| Gitea | instance URL, API token, target repo names | code + PRs; policy blocked until founder attaches remotes/creds | +| Redmine | instance URL, API key, project identifier(s) | issue/task tracking for this stack | +| Discourse | instance URL, API key, category for reports | readable status/narrative to founder | + +Proposed once creds arrive: +- Store creds at ~/.config/tsgcto/ (0600), NOT in .coordinate (scratch). +- PMO writes TASKs mirroring Redmine issues; Work reports back; PMO posts + status digests to Discourse; repos cloned into ~/projects under gitea remotes. diff --git a/handoff/cto-state-20260828/.coordinate/WORK-SESSION-ID b/handoff/cto-state-20260828/.coordinate/WORK-SESSION-ID new file mode 100644 index 0000000..532bd1d --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/WORK-SESSION-ID @@ -0,0 +1 @@ +ed024325eccc12fd diff --git a/handoff/cto-state-20260828/.coordinate/archive/NOTICE-crossfeed-founder.md b/handoff/cto-state-20260828/.coordinate/archive/NOTICE-crossfeed-founder.md new file mode 100644 index 0000000..8b376ce --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/NOTICE-crossfeed-founder.md @@ -0,0 +1,3 @@ +Founder directive: a fifth crossfeed dir is LIVE: /home/_crossfeed/founder +(owner reachableceo). Add it to your turn-start peer reads; the founder PMO publishes +STATUS.md there. Same ambient-only rules. Archive this notice after reading. diff --git a/handoff/cto-state-20260828/.coordinate/archive/NOTICE-crossfeed-inbox.md b/handoff/cto-state-20260828/.coordinate/archive/NOTICE-crossfeed-inbox.md new file mode 100644 index 0000000..14b7cd8 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/NOTICE-crossfeed-inbox.md @@ -0,0 +1,4 @@ +Founder directive: cross-vertical awareness channel is LIVE at /home/_crossfeed. +Read /home/_crossfeed/README.md and adopt it into your protocol checklist: +publish STATUS.md (your dir only) at end of each active turn; read peer dirs +at turn start. Publish your first STATUS.md now. Then archive this notice. diff --git a/handoff/cto-state-20260828/.coordinate/archive/NOTICE-crossfeed.md b/handoff/cto-state-20260828/.coordinate/archive/NOTICE-crossfeed.md new file mode 100644 index 0000000..14b7cd8 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/NOTICE-crossfeed.md @@ -0,0 +1,4 @@ +Founder directive: cross-vertical awareness channel is LIVE at /home/_crossfeed. +Read /home/_crossfeed/README.md and adopt it into your protocol checklist: +publish STATUS.md (your dir only) at end of each active turn; read peer dirs +at turn start. Publish your first STATUS.md now. Then archive this notice. diff --git a/handoff/cto-state-20260828/.coordinate/archive/NOTICE-stack-relaunch.md b/handoff/cto-state-20260828/.coordinate/archive/NOTICE-stack-relaunch.md new file mode 100644 index 0000000..d6d6403 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/NOTICE-stack-relaunch.md @@ -0,0 +1,6 @@ +Founder directive: PMO + Work screens now auto-relaunch crush (wrapper: +~/.coordinate/scripts/pmo-loop.sh pmo|work; logs: logs/-relaunch.log). +Screen names normalized org-wide: -PMO and -Work ("TSGCOO-Crush" +retired). Controls: touch ~/.coordinate/RELAUNCH-FRESH[-WORK] before quitting +for a clean next session; pin your sid via ~/.coordinate/[WORK-]SESSION-ID +(yours may be pre-pinned). Founder attaches via screen -r /. diff --git a/handoff/cto-state-20260828/.coordinate/archive/QUESTION-20260828-disk-next-steps.md b/handoff/cto-state-20260828/.coordinate/archive/QUESTION-20260828-disk-next-steps.md new file mode 100644 index 0000000..c043f7a --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/QUESTION-20260828-disk-next-steps.md @@ -0,0 +1,25 @@ +# QUESTION: next disk-reclaim step (post TASK-20260828-0722) + +Dangling build-cache prune done (+39G free, / at 80%), but free space is +53G/274G = 19.3%, still below the 20% bar. Measured remaining reclaimable +(docker system df, post-prune): + +1) Unused build cache (biggest win) + Build Cache now 66.43GB total, only 121.8MB dangling. Most of the 66GB + is unused-but-referenced cache. Proposal: + docker builder prune -a --filter until=168h -f (cache idle >7d only) + Estimated: tens of GB (4 active builders keep recent layers; older + entries dominate: hundreds of entries 2-4 weeks old). + Risk: slower next builds for EngStack (cache rebuild), no runtime impact. + +2) Dangling images (TASK said do NOT touch yet) + Images: 44.71GB reclaimable (dangling only, tagged images untouched). + docker image prune -f + Risk: none to running stacks (26 containers unaffected); loses untagged + intermediate images. + +3) Smaller: stopped containers 296.1MB, unused volumes 1.139GB. Not worth + it vs risk of nuking SupportStack-Local demo state; recommend skip. + +Recommendation: option 1 first (build cache is stale, not runtime state), +then option 2 if still <20%. Need PMO decision; not proceeding autonomously. diff --git a/handoff/cto-state-20260828/.coordinate/archive/REPORT-20260828-0722-engstack-disk-reclaim.md b/handoff/cto-state-20260828/.coordinate/archive/REPORT-20260828-0722-engstack-disk-reclaim.md new file mode 100644 index 0000000..36a47d7 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/REPORT-20260828-0722-engstack-disk-reclaim.md @@ -0,0 +1,41 @@ +# REPORT: TASK-20260828-0722-engstack-disk-reclaim (P1) + +Status: DONE (dangling build cache pruned; follow-up QUESTION filed, see below). + +Command run: docker builder prune -f (dangling only; no -a, no system/image/ +volume prune; no containers touched) + +## df -h / +Before: + /dev/sda1 274G 247G 14G 95% / +After: + /dev/sda1 274G 208G 53G 80% / + +Disk space freed: +39G available (14G -> 53G). + +## docker system df +Before: + Images 128 32 108.2GB 44.71GB (41%) reclaimable + Containers 36 26 638.3MB 296.1MB (46%) reclaimable + Local Volumes 31 25 1.491GB 1.139GB (76%) reclaimable + Build Cache 868 4 109GB 42.7GB reclaimable +After: + Images 128 32 108.2GB 44.71GB (41%) reclaimable + Containers 36 26 638.3MB 296.1MB (46%) reclaimable + Local Volumes 31 25 1.491GB 1.139GB (76%) reclaimable + Build Cache 500 4 66.43GB 121.8MB reclaimable + +Bytes reclaimed (docker-reported): 42.58GB build cache (868 -> 500 entries). +Note: build-cache delta 109GB -> 66.43GB = 42.6GB; df avail delta ~39G +(overlays share layers with tagged images, so df gain < cache delta). + +## Safety checks +- Running containers before: 26; after: 26. None stopped/removed. +- Images/volumes/containers untouched (counts identical). + +## Constraint check +Free space after = 53G / 274G = 19.3% < 20% threshold. +Per TASK constraint, next-step proposal filed as QUESTION (not executed): +inbox-pmo/QUESTION-20260828-disk-next-steps.md + +Task archived to archive/TASK-20260828-0722-engstack-disk-reclaim.md diff --git a/handoff/cto-state-20260828/.coordinate/archive/REPORT-20260828-0737-disk-reclaim-stale-cache.md b/handoff/cto-state-20260828/.coordinate/archive/REPORT-20260828-0737-disk-reclaim-stale-cache.md new file mode 100644 index 0000000..3d928cf --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/REPORT-20260828-0737-disk-reclaim-stale-cache.md @@ -0,0 +1,42 @@ +# REPORT: TASK-20260828-0737-disk-reclaim-stale-cache (P1) + +Status: DONE. Approved command executed exactly as specified: + docker builder prune -a --filter until=168h -f +No image/volume/system/container prunes run. + +## df -h / +Before: /dev/sda1 274G 208G 53G 80% / +After: /dev/sda1 274G 202G 59G 78% / +Disk space freed: +6G available (53G -> 59G). + +## docker system df +Before: + Images 128 32 108.2GB 44.71GB (41%) reclaimable + Containers 36 26 638.3MB 296.1MB (46%) reclaimable + Local Volumes 31 25 1.491GB 1.139GB (76%) reclaimable + Build Cache 500 4 66.43GB 121.8MB reclaimable +After: + Images 128 32 108.2GB 44.71GB (41%) reclaimable + Containers 36 26 638.3MB 296.1MB (46%) reclaimable + Local Volumes 31 25 1.491GB 1.139GB (76%) reclaimable + Build Cache 391 4 57.65GB 43.69GB reclaimable + +Bytes reclaimed (docker-reported): 8.786GB (109 entries, all idle 8+ days; +df gain smaller due to layer sharing with tagged images). + +## Safety checks +- Running containers before: 26; after: 26. None stopped/removed. +- Images/volumes/container counts identical. + +## Outcome vs threshold +Free space now 59G/274G = 21.5% >= 20% bar from step 1. No follow-up +QUESTION filed. + +## FYI (measured, no action taken) +Remaining Build Cache 57.65GB, of which 43.69GB is unused-but-recent (<7d, +kept by the until=168h filter); it becomes prunable as it ages, or via +`docker builder prune -a -f` at cost of cold rebuilds. Deferred option 2 +(dangling images, 44.71GB) still on the table per PMO decision. Combined +ceiling if both ever approved: ~88GB. + +Task archived to archive/TASK-20260828-0737-disk-reclaim-stale-cache.md diff --git a/handoff/cto-state-20260828/.coordinate/archive/REPORT-ready.md b/handoff/cto-state-20260828/.coordinate/archive/REPORT-ready.md new file mode 100644 index 0000000..fe0b8f1 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/REPORT-ready.md @@ -0,0 +1,6 @@ +REPORT (TSGCTO-Work, 2026-08-28) + +TSGCTO-Work online, awaiting first TASK. + +Checklist: BOARD.md read, PROTOCOL.md adopted, inbox-work scanned (empty), +log.md tailed. Scope limits acknowledged (no repos/git network/SSH, no sudo). diff --git a/handoff/cto-state-20260828/.coordinate/archive/SPIKE-crush-server.md b/handoff/cto-state-20260828/.coordinate/archive/SPIKE-crush-server.md new file mode 100644 index 0000000..485bc3d --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/SPIKE-crush-server.md @@ -0,0 +1,72 @@ +# SPIKE: `crush server` (v0.87.0) as screen+TUI replacement — RESEARCH + +Date: 2026-08-28 | By: TSGCTO-Work | Turn: crush-spike | Status: DONE + +## a) Surface (`crush server --help`) +- Flags: `-c/--cwd`, `-D/--data-dir`, `-d/--debug`, `-H/--host` (TCP **or** unix socket). +- Default socket: `unix:///tmp/crush-.sock` → here `/tmp/crush-1005.sock` (uid 1005 confirmed). +- Protocol: Go `net/http` mux speaking **HTTP/1.1 + gRPC** (binary contains + `application/grpc`; unknown paths return Go's plain `404 page not found`). + **Not REST** — probed `/healthz /health /v1/sessions /grpc.health.v1.Health/Check` + and connect-style paths: all 404. It exposes the crush client RPC API only. + +## b) Test instance (scratch `--data-dir` /tmp/crush-spike-data, socket /tmp/crush-spike.sock) +What it exposes / does: +- Serves the client API: `crush -H unix://... run|session ...` all work through it. +- Persists sessions to **SQLite** `crush.db` + `logs/crush.log` inside `--data-dir`. +- No dashboard, no REST, no health endpoint. stdout log empty even with `-d`. +- Socket created **0755 in world-writable /tmp** (any local uid can connect). + +## c) Non-interactive client via `-H unix://...` +**Yes, fully.** Evidence: +- `crush -H unix://... --data-dir run "Reply with exactly: SPIKE-OK"` + → replied `SPIKE-OK`, exit 0; real model turn (glm-5.2/zai, 11k tok) recorded. +- `session last --json`, `session list/new/delete/rename/show` all functional. +- Caveat: client must pass a matching `--data-dir`; with a mismatched dir, + `session last` fails `unable to open database file` → **the DB is file-accessed + client-side too**, the server is not the sole db gatekeeper. + +## d) Server-side session liveness (no per-client pty)? +**No.** Decisive evidence: +- Mid-turn (agent running `sleep 20` via shell tool), the tool process was a + **child of the CLIENT** process; the server had **zero child processes** at + every check. +- Agent loop (`app.RunNonInteractive`, `sessionAgent.Run` per data-dir log) + executes in the client binary. `crush run` needs no pty (good), but turn + liveness is tied to the client process. +- Killing the client kills the work; the server adopts nothing. There is no + daemonized/attached-session mode in `session --help` (CRUD only: + list/new/last/show/rename/delete). + +## e) Verdict +**NOT production-viable TODAY as the agent process layer replacing screens.** +It is a shared gateway/db service (central socket, shared data dir), not a +session host. We would still need a process supervisor for every turn — which +is exactly what screens provide today. Adopting it adds risk without removing +the supervision requirement. + +Risks if adopted: +- **Auth: none observed.** 0755 socket at predictable `/tmp/crush-.sock`; + no token/handshake seen; any local user/process can drive our agent+creds. + TCP mode would be strictly worse. +- **SPOF:** one server crash takes out every connected client mid-turn. +- **Resource/locking:** single SQLite `crush.db`; we already hit "unable to + open database file" on a dir mismatch — concurrent multi-client writers on + one db is a contention risk. +- **Multi-user on one host:** per-uid default sockets help, but /tmp sockets + are enumerable/spoofable; no isolation beyond file perms. Also cwd-sensitive + behavior (skills walk hit `permission denied` when run from /tmp). +- Unresolved: where provider auth resolved from during the scratch-dir test + (likely inherited env) — do not assume the server centralizes credentials. + +## Migration sketch +Not viable → no migration. Partial adoption (gateway-only for shared egress) +rejected for now: auth-less /tmp socket + SPOF + no supervision offload. +**Keep dispatch v2 (screen + `crush run --session`) as the process layer.** +Revisit triggers: (1) crush ships server-side/daemonized session hosting, +(2) socket auth + socket dir outside /tmp, (3) health endpoint for supervision. + +## Cleanup confirmation +Test server killed (verified), `/tmp/crush-spike-{data,logs}.sock` removed +(`ls /tmp/crush-spike*` → No such file). Production screens/sessions/wrappers +untouched; all probes timeout-wrapped; real data dir never pointed at. diff --git a/handoff/cto-state-20260828/.coordinate/archive/TASK-20260828-0722-engstack-disk-reclaim.md b/handoff/cto-state-20260828/.coordinate/archive/TASK-20260828-0722-engstack-disk-reclaim.md new file mode 100644 index 0000000..b4224e7 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/TASK-20260828-0722-engstack-disk-reclaim.md @@ -0,0 +1,21 @@ +# TASK: EngStack disk reclaim (handoff sequence step 1) + +Objective: Free disk on this workstation (/ is 95%, 14G free) by pruning +DANGLING Docker build cache only. Handoff doc: ~/.coordinate/CTOHandoff.md. + +Context: +- /home/TSGCTO/projects/TSYSDevStack-RandD/EngStack (build scripts, TODO.md) +- docker system df today: Build Cache 109GB total, 42.7GB reclaimable; + Images 108.2GB, 44.71GB reclaimable (do NOT touch yet) + +Constraints: +- NEVER stop/remove running containers (26 SupportStack-Local demos live). +- Allowed: docker builder prune -f (dangling cache only). No -a, no + system prune, no image prune, no volume prune. +- If free space still <20% after, write QUESTION-*.md proposing next + step with measured numbers; do not proceed autonomously. + +Deliverable(s): REPORT-*.md in inbox-pmo with df -h / before+after, +docker system df before+after, bytes reclaimed. + +Priority: P1 diff --git a/handoff/cto-state-20260828/.coordinate/archive/TASK-20260828-0737-disk-reclaim-stale-cache.md b/handoff/cto-state-20260828/.coordinate/archive/TASK-20260828-0737-disk-reclaim-stale-cache.md new file mode 100644 index 0000000..93faa9e --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/TASK-20260828-0737-disk-reclaim-stale-cache.md @@ -0,0 +1,16 @@ +# TASK: Disk reclaim step 2 — stale build cache (answers QUESTION-20260828-disk-next-steps) + +Objective: APPROVED option 1 only: docker builder prune -a --filter until=168h -f +(prune build-cache entries unused >7d). + +Decision rationale: stale cache is not runtime state; 26 live containers +untouched. Option 2 (dangling images, 44.7GB) is DELIBERATELY DEFERRED: +untagged intermediates may aid debugging the 14 failed EngStack builds. +Small stuff (stopped containers/volumes) skipped per your own rec. + +Constraints: no image/volume/system/container prunes. Same safety checks as +TASK-20260828-0722 (container count before/after). + +Deliverable(s): REPORT-*.md with df -h / + docker system df before/after. + +Priority: P1 diff --git a/handoff/cto-state-20260828/.coordinate/archive/TASK-20260828-0753-engstack-fix-batch1.md b/handoff/cto-state-20260828/.coordinate/archive/TASK-20260828-0753-engstack-fix-batch1.md new file mode 100644 index 0000000..41efda5 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/archive/TASK-20260828-0753-engstack-fix-batch1.md @@ -0,0 +1,27 @@ +# TASK: EngStack fix queue — batch 1 (EASY section) + +Objective: Clear EASY-fix items from the fix queue in +~/projects/TSYSDevStack-RandD/EngStack/TODO.md, in this order: +flatcam, camotics, daw, gns3, streamdeck, inkscape-ext, stats, natron, +wx-dev, yosys-fpga. Work as many as the turn cleanly allows; stop and +report rather than rushing the last one. + +Context: +- Repo: ~/projects/TSYSDevStack-RandD/EngStack (build: bash scripts/build.sh core) +- TODO.md "Failed builds — fix queue" section has per-tool root causes + fixes + probe commands. + +Constraints: +- Follow TODO.md fix notes; VERIFY tags/URLs before editing Dockerfiles + (curl -fsSL -o /dev/null -w '%{http_code}'); probe package names in + a throwaway container (commands in TODO.md) — never guess (host is Debian + 13; containers are ubuntu:24.04 / debian:trixie per Dockerfile). +- One tool at a time; full build after each edit; do not touch MEDIUM items + (batch 2) or the SDR section. +- No image/volume/system prunes of any kind. 26 running containers untouchable. +- If a fix note itself proves wrong: 2 attempts max, then skip and record. + +Deliverable(s): REPORT-*.md in inbox-pmo: per-tool FIXED (image tag) / +SKIPPED (why), TODO.md checkboxes ticked for fixed tools, log line appended, +remaining queue summary. + +Priority: P1 diff --git a/handoff/cto-state-20260828/.coordinate/inbox-work/TASK-20260828-1505-engstack-fix-batch1b.md b/handoff/cto-state-20260828/.coordinate/inbox-work/TASK-20260828-1505-engstack-fix-batch1b.md new file mode 100644 index 0000000..d342584 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/inbox-work/TASK-20260828-1505-engstack-fix-batch1b.md @@ -0,0 +1,24 @@ +# TASK: EngStack fix queue — batch 1b (resume; QUEUED behind founder gate) + +Objective: Reconcile batch 1 (interrupted mid-turn) then finish EASY queue. +1) Verify/tick TODO.md checkboxes for: flatcam, daw, gns3, streamdeck, + inkscape-ext (built+smoke-tested pre-interrupt; docker images exist). +2) stats: dockerfile edited pre-hang — build + smoke test now. +3) natron (2.5.0 asset Natron-2.5.0-Linux-x86_64-no-installer.tar.xz), wx-dev + (v4.2.1 + CA-cert fix), yosys-fpga (v-prefixed tags, boost 1.83, verify + verilator tag): edits were prepped but NOT confirmed applied — re-verify, + apply, build. Evidence trail: logs/engstack-fix1.log. +4) camotics stays SKIPPED (SCons+cbang+V8 redesign — batch 2). + +Context: ~/projects/TSYSDevStack-RandD/EngStack; TODO.md fix queue; +logs/engstack-fix1.log (batch-1 narrative with per-tool findings). + +Constraints: same as batch 1 (verify-before-edit; probe, never guess; no +prunes; 26 containers untouchable; 2 attempts max then skip+record). +Dispatch note (PMO): founder gate ARMED — Work executes ONLY after founder +releases. Resume lineage if desired: --session b339e9a0e2d29d8e. + +Deliverable(s): REPORT-*.md per protocol: per-tool status, TODO.md ticked, +remaining queue summary. + +Priority: P1 diff --git a/handoff/cto-state-20260828/.coordinate/log.md b/handoff/cto-state-20260828/.coordinate/log.md new file mode 100644 index 0000000..4b48140 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/log.md @@ -0,0 +1,34 @@ +2026-08-28T07:02:01-05:00 | founder-channel | .coordinate created +2026-08-28T07:02:32-05:00 | TSGCTO-PMO | intro read (INTRO-PMO.md); PROTOCOL.md adopted; checklist run (inbox empty); BOARD current-focus set; online as PMO +2026-08-28T07:02:45-05:00 | TSGCTO-Work | intro read (INTRO-WORK.md); PROTOCOL.md adopted; checklist run (inbox-work empty); online as Work, REPORT-ready posted +2026-08-28T07:14:56-05:00 | TSGCTO-PMO | wrote /tmp/tsgcto-move-projects.sh for founder (moves football, CHipBench, TSYSDevStack-RandD to /home/TSGCTO/projects, chowns TSGCTO) +2026-08-28T07:16:53-05:00 | TSGCTO-PMO | founder ran move script: football, ChipBench, TSYSDevStack-RandD now in /home/TSGCTO/projects; final ls in script failed only due to /home/TSGCTO being 750 from reachableceo view; verified + chowned OK from TSGCTO side +2026-08-28T07:17:26-05:00 | TSGCTO-PMO | removed /tmp/tsgcto-move-projects.sh (migration done, script no longer needed) +2026-08-28T07:18:46-05:00 | TSGCTO-PMO | founder wants gitea/discourse/redmine wired; swept home dir, found no URLs/creds; wrote needs list to .coordinate/WIRING-SOR.md, awaiting founder input +2026-08-28T07:22:56-05:00 | TSGCTO-PMO | ingested CTOHandoff.md (copied to .coordinate); verified disk 95%/26 containers/42.7GB dangling cache; wrote TASK-20260828-0722-engstack-disk-reclaim (P1); BOARD updated +2026-08-28T07:24:32-05:00 | TSGCTO-PMO | founder: CTO/COO parallel lanes thru 1/1, COO prerequisites (k8s, Jenkins@Cloudron) gate CTO steps; COO=TSGCOO user owns PFVCluster+SupportStack-Cloudron; COO PMO runs on-system; BOARD org context added; Work online (REPORT-ready.md) +2026-08-28T07:26:48-05:00 | TSGCTO-Work | TASK engstack-disk-reclaim done: builder prune -f reclaimed 42.58GB cache, / 95%->80% (14G->53G free), 26 containers intact; free 19.3%<20% so QUESTION-disk-next-steps filed; TASK archived +2026-08-28T07:27:25-05:00 | TSGCTO-PMO | founder: no CEO by design; officers CTO/CCO/COO report to BOD; BOARD org context corrected; crossfeed proposal stands (dirs: bod/cto/cco/coo), BOD=subscriber not transport +2026-08-28T07:30:02-05:00 | TSGCTO-PMO | wrote /tmp/tsg-crossfeed-setup.sh for founder: creates /home/_crossfeed{bod,cto,cco,coo} + README, drops NOTICE into each vertical .coordinate + inbox-pmo, pings *-PMO screens; parser dry-tested on own user +2026-08-28T07:34:03-05:00 | TSGCTO-PMO | crossfeed script rewritten preflight/execute/verify + confirm gate (syntax OK); sudo -u password bug fixed via sudo runuser; -d traversal bug fixed via sudo test; founder pref: preflight-before-mutation on all ops -> PREFS-founder.md +2026-08-28T07:36:56-05:00 | TSGCTO-PMO | crossfeed script: added sbin PATH (runuser exists at /sbin) + su fallback via as_user; Debian13 noted; disk reclaim step1 DONE by Work (+39G, 95->80pct, containers safe); dispatching step2 TASK (stale builder cache >7d) per QUESTION decision +2026-08-28T07:38:40-05:00 | TSGCTO-Work | TASK disk-reclaim-stale-cache done: builder prune -a --filter until=168h reclaimed 8.786GB, / 80%->78% (53G->59G free, 21.5% >= 20% bar), 26 containers intact; REPORT posted, TASK archived +2026-08-28T07:39:08-05:00 | TSGCTO-PMO | crossfeed ADOPTED (PROTOCOL.md appended); first STATUS.md published to /home/_crossfeed/cto/; notices archived; Work step2 report verified+archived (disk sequence COMPLETE: / at 78%, 21.5% free) +2026-08-28T07:50:29-05:00 | TSGCTO-PMO | read COO PATTERN-agent-orchestration.md via crossfeed; ADOPTED doorbell-only stuff rule (PROTOCOL.md); dispatch v2 (headless --session + completion ping + serialization) staged awaiting founder go; peer statuses read (BOD/CCO idle, COO deep in #465 radios) +2026-08-28T07:50:43-05:00 | TSGCTO-PMO | adopted COO dispatch v2 doorbell rule (confirmed founder worked with COO on PATTERN doc); awaiting founder go: dispatch v2 migration + EngStack build-fix TASK batch +2026-08-28T07:53:20-05:00 | TSGCTO-PMO | founder GO: dispatch v2 LIVE (ping-pmo.sh helper, PROTOCOL updated, old Work screen retired-from-dispatch); TASK-20260828-0753 engstack fix batch1 (EASY) dispatched headless as work-turn-engstack-fix1; completion doorbell will wake PMO; lineage SID capture on completion +2026-08-28T09:04:41-05:00 | TSGCTO-PMO | work-turn-engstack-fix1 was HUNG (log silent 22min) - killed per founder quota stop: 5 fixed (flatcam,daw,gns3,streamdeck,inkscape-ext), 1 skipped (camotics, SCons rebuild needed), stats edit landed pre-hang, natron/wx-dev/yosys prepped-not-built; TODO checkboxes unticked (bookkeeping pending); lineage SID b339e9a recorded for batch-1b resume +2026-08-28T09:05:25-05:00 | TSGCTO-PMO | founder gate SELF-ADOPTED (direct founder directive, not COO relay): no work-turn dispatch without explicit founder release; TASKs staged queued-only +2026-08-28T09:50:17-05:00 | TSGCTO-PMO | wrote /tmp/tsg-pmo-autorelaunch.sh: pmo-loop.sh wrapper (auto-relaunch, RELAUNCH-FRESH one-shot, PMO-SESSION-ID pin, 60s backoff) for all 4 verticals; recreates *-PMO screens under wrapper w/ preflight+confirm +2026-08-28T09:54:18-05:00 | TSGCTO-PMO | stack relaunch script staged (/tmp/tsg-stack-relaunch.sh): wrappers pmo+work, canonical -PMO/-Work names (TSGCOO-Crush retired), session auto-pin heuristic, multiuser+acl, notices; CTO pins pre-set (2fb8da551ae30c24/ed024325eccc12fd); combined COO-PMO resume prompt at /tmp/COO-PMO-RESUME.md (RCEO wiring + /tmp sweep to _crossfeed/archive) +2026-08-28T10:54:58-05:00 | TSGCTO-PMO | reachableceo pref: call him reachableceo/Charles, NEVER "the founder" (creepy). Existing boot units found: tsg-agent-stacks.service -> /home/reachableceo/launch-all-tsg-stacks.sh (unreadable, legacy pattern, would undo wrappers+names on reboot); reachableceo-agent-stack.service -> /usr/local/sbin/launch-rceo-stack.sh (canonical RCEO-PMO/RCEO-Work, respawn+intro-inject, boot-safe). COS: no discoverable account on this host (TSGCTPO home orphaned uid 1004, no passwd match) - asked Charles for account/host +2026-08-28T10:59:45-05:00 | TSGCTO-PMO | COS pkg fixed up per reachableceo: v2 tgz in outbox (wrapper auto-relaunch, pins, firstboot-only injection); NOTE-from-CTO-cos-v2.md left for COO; deltas logged +2026-08-28T11:04:42-05:00 | TSGCTO-PMO | pre-relaunch checkpoint: crossfeed STATUS rewritten; all state on disk (BOARD/PROTOCOL/PREFS/pins/log/prompts); session will resume via pin 2fb8da551ae30c24 after wrapper respawn +2026-08-28T11:06:16-05:00 | TSGCTO-PMO | relaunch script bug fixed (preflight used shell builtin via runuser exec; wrapped in bash -c; wrapper PATH hardened) +2026-08-28T11:57:17-05:00 | TSGCTO-PMO | REORIENTED to tooling-canonical world: ingested founder/ STATUS+NOTICE + tooling READMEs + relaunch-v2 (v1 kill bug root-caused: root-side quit hit wrong socket dir); installed wrapper verified == canonical; safe.directory set for 3 repos; PROTOCOL amended (no /tmp scripts, commit.sh, bundles); SoR unblock path = founder channel per credentials README +2026-08-28T12:02:42-05:00 | TSGCTO-PMO | relaunch v2.1 committed to agent-stack (70cb27e): RCEO hard-guard, pin repair (original PMO-intro/INTRO-WORK sid), reorient doorbell post-respawn; RCEO off-limits per reachableceo; authorized to operate TSGCTO/COO/CCO/BOD stacks +2026-08-28T15:05:14-05:00 | TSGCTO-PMO | reorient checklist done post-v2.1 relaunch (15:04, PINNED resume ok): notices archived, founder/ dir adopted into PROTOCOL+BOARD, roster updated (reachableceo/Charles; RCEO off-limits), batch-1 TASK archived, batch-1b TASK staged QUEUED behind gate; peers: BOD oriented+canonical, CCO STATUS stale (doorbelled by v2.1, should publish), COO pin-repair outcome TBD in their next STATUS +2026-08-28T15:16:31-05:00 | TSGCTO-PMO | quota infra committed (155c6d7): semaphore+metrics+supervisor+dispatch-turn+GOVERNANCE; dispatcher rc bug fixed+re-dispatched crush-spike (running ungated until installer run); offstage kit tarred to outbox w/ NOTE; PROTOCOL dispatch v3 added +2026-08-28T15:20:12-05:00 | TSGCTO-Work | SPIKE crush-server done: gateway/db service only, no server-side session hosting, auth-less /tmp socket -> NOT a screen replacement; report in inbox-pmo/SPIKE-crush-server.md; test server killed + scratch removed +2026-08-28T15:20:36-05:00 | TSGCTO-PMO | crush-spike VERDICT (Work): server = client-API gateway + sqlite store, turns execute CLIENT-side (no server-side hosting), auth-less /tmp socket, SPOF -> NOT viable as screen replacement; KEEP dispatch v2/v3 (self-healing screens); revisit triggers logged in archive/SPIKE-crush-server.md +2026-08-28T15:53:55-05:00 | TSGCTO-PMO | PRODUCTION on ultix-streaming: quota infra live (metrics 2775, semaphore gated 0/2, supervisor timer ticking, alerts all-quiet, dispatchers org-wide, relaunch v2.3 done); metrics harvester fixed to session-show (7e1ddd2), ledger reset for clean first real tick; REMAINING for 22:00: offstage kit install (outbox) + first tick verification + peer STATUS confirmation diff --git a/handoff/cto-state-20260828/.coordinate/logs/crush-spike.log b/handoff/cto-state-20260828/.coordinate/logs/crush-spike.log new file mode 100644 index 0000000..4e4a7c9 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/logs/crush-spike.log @@ -0,0 +1,3 @@ +2026-08-28T15:14:41-05:00 no semaphore slot after 300s - not launched +2026-08-28T15:15:41-05:00 semaphore gate unavailable - proceeding UNGATED (install metrics dirs) +Checklist done. Batch-1b TASK is gated/queued — not my scope. Starting the `crush server` spike.UID 1005 matches the default socket name; no live server. Starting test instance on scratch socket.Server is live on scratch socket. Probing protocol and client attach.HTTP/1.1 with Go's default 404 mux. Hunting route paths.Client `run` over the socket works. Identifying the gRPC service surface.Session persisted server-side in scratch dir. Now testing process ownership + survival across client disconnect.pgrep matched my own turn process — re-checking against real server PID 2579443.Key finding: tool processes (`sleep 20`) parent to the **client**, not the server. Testing client-disconnect behavior.Server hit its 90s timeout mid-test. Restarting with longer window for a clean disconnect test.Session turn completed client-side before my kill (TERM was ignored). Checking debug log + session subcommands for any server-side execution feature.Local evidence sufficient. Quick doc check for authoritative server description.Evidence complete. Cleaning up test instance and scratch dirs.Cleanup verified (remaining matches are my own turn's dispatch screen — untouched). Writing report.Spike done: `crush server` is only a gateway/db service (tool exec + agent loop stay client-side; auth-less 0755 /tmp socket) → NOT a screen replacement today; findings + verdict in inbox-pmo/SPIKE-crush-server.md, test instance killed and scratch cleaned. diff --git a/handoff/cto-state-20260828/.coordinate/logs/engstack-fix1.log b/handoff/cto-state-20260828/.coordinate/logs/engstack-fix1.log new file mode 100644 index 0000000..e38076a --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/logs/engstack-fix1.log @@ -0,0 +1 @@ +Flatcam: verify the `Beta` branch exists, then add `git` to apt install.Branch `Beta` 404s. Checking repo branches:Repo itself is gone. Checking alternatives — canonical FlatCAM 8.99 beta lives on Bitbucket:GitHub repo is dead; canonical 8.99 beta lives on Bitbucket (jpcgt/flatcam). Verifying the `Beta` branch there:`Beta` branch confirmed at Bitbucket. Applying fix (add `git`, switch clone URL):While flatcam builds, prepping camotics:Camotics: tag is `v1.2.0` (not `release/1.2.0`), and `libbotan-2-dev` exists on 24.04. Checking flatcam build, then editing camotics:flatcam:core built. Smoke test + camotics edit:Camotics building. Prepping daw:`jackd2` confirmed. Editing daw (build queued after camotics):GNS3 findings: dynamips tag is `v0.2.23` (v-prefix), ubridge `0.9.92` doesn't exist (0.9.x line ends at `v0.9.19`), `iouyap` confirmed missing, `vpcs` OK. Editing:camotics clone failed: no `ca-certificates` in builder (ubuntu:24.04 + `--no-install-recommends`). Attempt 2:Prepping streamdeck while camotics builds:Probing the actual streamdeck pip failure in a throwaway trixie container:Real root cause: streamdeck-ui versions cap below 3.1.0 on Python 3.13. Checking PyPI:PyPI caps at 2.0.15 with `Requires-Python <3.12` — TODO's Pillow diagnosis is wrong; trixie's Python 3.13 can't satisfy it. Checking the GitHub 3.1.0 release referenced by the Dockerfile:streamdeck-ui: no GitHub releases, PyPI caps at 2.0.15 requiring Python <3.12 (upstream abandoned 2023). TODO note is wrong. Checking camotics, then trying streamdeck attempt 1:Clone works now, but no CMakeLists.txt at repo root for v1.2.0. Inspecting the tag's tree:v1.2.0 uses SConstruct (SCons), not CMake. Checking if v1.3.0 has CMakeLists.txt:No CMake in any CAMotics release — project builds with SCons. Checking README build instructions:CAMotics needs a full SCons+cbang+V8 two-stage build — the cmake recipe is fundamentally wrong. 2 attempts spent → SKIPPED (recorded). Moving on: daw build.Prepping inkscape-ext while daw builds:inkstitch v3.3.0 asset confirmed: `inkstitch-3.3.0-linux-x86_64.tar.xz`. Editing inkscape-ext:daw:core ✓. Building gns3:Prepping stats + natron + wx-dev + yosys-fpga while gns3 builds:Natron: no 2.6.0 — latest is 2.5.0 with asset `Natron-2.5.0-Linux-x86_64-no-installer.tar.xz`. RStudio: current is 2026.08.2-200 with a unified deb for Debian 13. Verifying exact URL:Probing RStudio deb URL candidates:Extracting the direct RStudio deb URL via agentic fetch:URL valid (binary response = 200). Updating stats dockerfile; checking gns3:Same CA-cert gap in gns3 builder. Fixing and rebuilding:Streamdeck attempt 1 probe — force-install on trixie py3.13:Pillow wheel build fails on 3.13 as expected. Attempt 2: switch to ubuntu:22.04 (py3.10). Probing packages:Packages OK. Full pip validation on jammy before committing attempt 2:evdev needs to compile (sdist). Validating with build deps present:Install succeeds on jammy with build deps. Editing streamdeck dockerfile:gns3:core ✓. Smoke test + streamdeck build:Prepping wx-dev + yosys-fpga:wx-dev: `v4.2.1` exists — real issue is again missing `ca-certificates` in builder. yosys: tags are `v`-prefixed (latest v0.68). Probing trixie boost version for yosys runtime:Trixie boost 1.83 ✓ for yosys. streamdeck: jammy's pip lacks `--break-system-packages` — removing flag:wx-dev + yosys edits; verifying verilator tag too:streamdeck:core ✓. Smoke test + inkscape-ext build:Expected headless warning only — works. Building inkscape-ext:Runtime stage needs `xz-utils`. Fixing:Extract works; `rm` fails since COPY'd file is root-owned under USER eng. Dropping the rm:inkscape-ext:core ✓. Smoke test + stats build: \ No newline at end of file diff --git a/handoff/cto-state-20260828/.coordinate/logs/pmo-relaunch.log b/handoff/cto-state-20260828/.coordinate/logs/pmo-relaunch.log new file mode 100644 index 0000000..39d0c7a --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/logs/pmo-relaunch.log @@ -0,0 +1,4 @@ +2026-08-28T11:13:13-05:00 relaunch PINNED 2fb8da551ae30c24 +2026-08-28T11:29:41-05:00 relaunch PINNED 2fb8da551ae30c24 +2026-08-28T11:45:07-05:00 relaunch PINNED 2fb8da551ae30c24 +2026-08-28T15:04:06-05:00 relaunch PINNED 2fb8da551ae30c24 diff --git a/handoff/cto-state-20260828/.coordinate/logs/work-relaunch.log b/handoff/cto-state-20260828/.coordinate/logs/work-relaunch.log new file mode 100644 index 0000000..46e5579 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/logs/work-relaunch.log @@ -0,0 +1,4 @@ +2026-08-28T11:13:13-05:00 relaunch PINNED ed024325eccc12fd +2026-08-28T11:29:41-05:00 relaunch PINNED ed024325eccc12fd +2026-08-28T11:45:07-05:00 relaunch PINNED ed024325eccc12fd +2026-08-28T15:04:06-05:00 relaunch PINNED ed024325eccc12fd diff --git a/handoff/cto-state-20260828/.coordinate/prompts/INTRO-PMO.md b/handoff/cto-state-20260828/.coordinate/prompts/INTRO-PMO.md new file mode 100644 index 0000000..4c5a1aa --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/prompts/INTRO-PMO.md @@ -0,0 +1,49 @@ +INTRODUCTION / ORGANIZATION UPDATE (from founder, 2026-08-28) + +You are TSGCTO-PMO — the manager of the TSGCTO stack. You now have a +direct report: TSGCTO-Work (screen session named TSGCTO-Work), a +separate crush instance running as the same TSGCTO user in /home/TSGCTO. +I (the founder, reachableceo) interact with you day-to-day; I talk to +TSGCTO-Work only occasionally. You drive it; it does not drive you. + +COORDINATION CHANNEL: ~/.coordinate is your local, non-git scratch channel +with TSGCTO-Work — routine agent-to-agent coordination costs a local file +write, not a network round trip. Read ~/.coordinate/PROTOCOL.md and follow +it exactly: you write TASK files to inbox-work/, consume REPORT/QUESTION/ +BLOCKED from inbox-pmo/, maintain BOARD.md and log.md. + +CAPABILITIES (headless workers + sub-agents): +- You run as TSGCTO (HOME=/home/TSGCTO, NO sudo by design; root needs go + to the founder). You MAY spawn headless task workers without sudo: + env HOME=/home/TSGCTO TERM=xterm-256color screen -dmS bash -c \ + 'cd /home/TSGCTO && crush run --quiet "$(cat /path/to/prompt.md)"' \ + > /home/TSGCTO/.coordinate/logs/.log 2>&1 + Monitor workers by READING that log file — never attach to their screens, + never leave watchers/polling loops running; check on your next turn. +- Use crush sub-agent tooling instead of long sequential exploration. + +SCOPE LIMITS (founder policy): NO repositories, git remotes, or SSH +credentials are attached to this account by design. Do not clone/init/push +repos or attempt SSH or git network operations — that work is reserved for +other stacks and founder direction. Durable artifacts stay in +~/.coordinate until the founder attaches systems of record; flag any TASK +that needs them. + +TOKEN DISCIPLINE: terse by default (<=5 line replies to me unless asked +for detail); never restate task/report text in replies — cite file paths; +batch file reads; never paste large files into conversation; write +findings to ~/.coordinate files and reference them. + +ABOUT TSGCTO-Work: it is a headless loop orchestrator — expect one-line +chat replies from it; its substantive output lands in inbox-pmo REPORT +files. You (PMO) are where the founder lives day-to-day, so you own +readable status and narrative. + +RULES: You plan, prioritize, write TASKs; TSGCTO-Work executes. Start +every turn with the PROTOCOL.md checklist (BOARD.md, your inbox, log.md +tail). You hold NO sudo. No watchers/polling loops. If +~/.coordinate/PROTOCOL.md is ever missing, tell the founder; do not +improvise a replacement layout. + +NOW: read PROTOCOL.md, append your intro line to log.md, set BOARD.md +current-focus, then greet the founder in 5 lines max. Then wait. diff --git a/handoff/cto-state-20260828/.coordinate/prompts/INTRO-WORK.md b/handoff/cto-state-20260828/.coordinate/prompts/INTRO-WORK.md new file mode 100644 index 0000000..ea8484c --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/prompts/INTRO-WORK.md @@ -0,0 +1,42 @@ +INTRODUCTION (from founder, 2026-08-28) + +You are TSGCTO-Work (screen session TSGCTO-Work) — the LOOP ORCHESTRATOR +of the TSGCTO stack, running 99% headless. Humans almost never talk to you +directly. TSGCTO-PMO (a separate crush instance, same TSGCTO user) is +your manager and drives you via ~/.coordinate TASK files and screen pings; +the founder (reachableceo) is final authority and drops in only rarely. + +OUTPUT MODEL: your chat replies are MINIMAL (one-liners). Your real output +is VERBOSE and lives in ~/.coordinate REPORT files until the founder +attaches systems of record. Never dump detail into chat that belongs in a +file. + +YOUR LOOP — on every ping or message, before anything else: +1. Read ~/.coordinate/BOARD.md, scan inbox-work/ for TASK files (P1 first; + CANCEL drops a task), tail log.md. +2. Execute TASKs. Dispatch parallelizable subtasks as headless workers: + env HOME=/home/TSGCTO TERM=xterm-256color screen -dmS bash -c \ + 'cd /home/TSGCTO && crush run --quiet "$(cat /path/to/prompt.md)"' \ + > /home/TSGCTO/.coordinate/logs/.log 2>&1 + Monitor by reading that log; verify worker output before reporting done. +3. Reply via inbox-pmo/ (REPORT with evidence: file paths / QUESTION / + BLOCKED), archive the TASK, append one line to log.md. + +COORDINATION CHANNEL: ~/.coordinate is local non-git scratch between you +and the PMO. Read ~/.coordinate/PROTOCOL.md and follow it. + +SCOPE LIMITS (founder policy): NO repositories, git remotes, or SSH +credentials are attached to this account by design. Do not clone/init/push +repos or attempt SSH or git network operations. If a TASK requires them, +reply BLOCKED with the reason. + +RULES: You never self-assign scope — work arrives via inbox-work/ (suggest +ideas via QUESTION). Empty inbox when pinged = one line saying so, stop. +No watchers/polling loops. You hold NO sudo — root needs go BLOCKED to the +PMO. Shared account with TSGCTO-PMO: never kill its screen, no long +locks. If ~/.coordinate/PROTOCOL.md is missing, say so and wait — do not +recreate. + +NOW: read PROTOCOL.md, append your intro line to log.md, post +inbox-pmo/REPORT-ready.md ("TSGCTO-Work online, awaiting first TASK"). +Reply in chat with one line only. Then wait for pings. diff --git a/handoff/cto-state-20260828/.coordinate/prompts/WORK-TURN-crush-spike.md b/handoff/cto-state-20260828/.coordinate/prompts/WORK-TURN-crush-spike.md new file mode 100644 index 0000000..f32bb7d --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/prompts/WORK-TURN-crush-spike.md @@ -0,0 +1,17 @@ +You are TSGCTO-Work executing a headless RESEARCH turn for the TSGCTO vertical. +1) Read ~/.coordinate/PROTOCOL.md (dispatch/checklist sections) + BOARD.md. +2) TASK: spike `crush server` (crush v0.87) as a possible replacement for + screen+TUI orchestration. Answer, with evidence: + a) `crush server --help` — flags, socket path, protocol (gRPC? HTTP? REST?). + b) Start it briefly on a TEST socket (`--data-dir` pointed at a scratch + dir under /tmp — NOT your real data dir), list what it exposes; kill it. + c) Can a client `-H unix://...` attach/run sessions non-interactively? + d) Does it keep sessions alive server-side (no per-client pty)? + e) Verdict: is it production-viable TODAY for replacing screens as the + agent process layer? Risks (auth, resource use, single point of + failure, multi-user story on one host)? +3) CONSTRAINTS: read-only toward production state (no changes to real + sessions/screens/wrapper installs); test server instance must be killed + and scratch dir removed before you finish; timeout-wrap everything. +4) Output: ~/.coordinate/inbox-pmo/SPIKE-crush-server.md with findings + + verdict + a migration sketch if viable. One-line chat reply only. diff --git a/handoff/cto-state-20260828/.coordinate/prompts/WORK-TURN-engstack-fix1.md b/handoff/cto-state-20260828/.coordinate/prompts/WORK-TURN-engstack-fix1.md new file mode 100644 index 0000000..f61ddde --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/prompts/WORK-TURN-engstack-fix1.md @@ -0,0 +1,33 @@ +You are TSGCTO-Work executing a headless dispatch turn (dispatch v2) for the TSGCTO vertical. +1) Read ~/.coordinate/PROTOCOL.md and ~/.coordinate/BOARD.md fully; tail ~/.coordinate/log.md. +2) Execute the TASK below per protocol (respect constraints; REPORT to ~/.coordinate/inbox-pmo/; archive the TASK; append log line). +3) Headless turn: when done, file the REPORT and exit. No watchers, no loops. + +--- TASK --- +# TASK: EngStack fix queue — batch 1 (EASY section) + +Objective: Clear EASY-fix items from the fix queue in +~/projects/TSYSDevStack-RandD/EngStack/TODO.md, in this order: +flatcam, camotics, daw, gns3, streamdeck, inkscape-ext, stats, natron, +wx-dev, yosys-fpga. Work as many as the turn cleanly allows; stop and +report rather than rushing the last one. + +Context: +- Repo: ~/projects/TSYSDevStack-RandD/EngStack (build: bash scripts/build.sh core) +- TODO.md "Failed builds — fix queue" section has per-tool root causes + fixes + probe commands. + +Constraints: +- Follow TODO.md fix notes; VERIFY tags/URLs before editing Dockerfiles + (curl -fsSL -o /dev/null -w '%{http_code}'); probe package names in + a throwaway container (commands in TODO.md) — never guess (host is Debian + 13; containers are ubuntu:24.04 / debian:trixie per Dockerfile). +- One tool at a time; full build after each edit; do not touch MEDIUM items + (batch 2) or the SDR section. +- No image/volume/system prunes of any kind. 26 running containers untouchable. +- If a fix note itself proves wrong: 2 attempts max, then skip and record. + +Deliverable(s): REPORT-*.md in inbox-pmo: per-tool FIXED (image tag) / +SKIPPED (why), TODO.md checkboxes ticked for fixed tools, log line appended, +remaining queue summary. + +Priority: P1 diff --git a/handoff/cto-state-20260828/.coordinate/scripts/dispatch-turn.sh b/handoff/cto-state-20260828/.coordinate/scripts/dispatch-turn.sh new file mode 100755 index 0000000..63cfe2e --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/scripts/dispatch-turn.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# source: /home/_crossfeed/tooling/agent-stack @ HEAD +# dispatch-turn.sh — headless work-turn launcher. +# Semaphore-gated (org concurrency cap), FRESH session by default (small +# context = quota-friendly; the turn self-bootstraps from the prompt file), +# success/fail doorbell to the vertical PMO screen. PMO usage: +# screen -dmS work-turn- \ +# ~/.coordinate/scripts/dispatch-turn.sh +set -uo pipefail + +SLUG=${1:?slug}; PROMPT=${2:?prompt-file} +TOOLING=${TOOLING:-/home/_crossfeed/tooling} +SEMI="$TOOLING/agent-stack/semaphore.sh" +LOG="$HOME/.coordinate/logs/$SLUG.log" +TAG="$USER-$SLUG" +WAIT=${WAIT_SECS:-300} + +[ -f "$PROMPT" ] || { echo "no prompt file: $PROMPT" >&2; exit 1; } + +semirc=0 +bash "$SEMI" try "$TAG" "$WAIT" >/dev/null 2>&1 || semirc=$? +if [ "$semirc" = 99 ]; then + echo "$(date -Is) semaphore gate unavailable - proceeding UNGATED (install metrics dirs)" >> "$LOG" +elif [ "$semirc" != 0 ]; then + echo "$(date -Is) semaphore rc=$semirc after ${WAIT}s budget - not launched" >> "$LOG" + screen -S "${USER}-PMO" -X stuff "$(printf 'Work turn DEFERRED (concurrency cap) - rerun later: %s.\r' "$SLUG")" || true + exit 3 +fi +GATED=1; [ "$semirc" = 0 ] || GATED=0 + +cd "$HOME" +rc=0 +env HOME="$HOME" TERM=xterm-256color \ + crush run --quiet "$(cat "$PROMPT")" >> "$LOG" 2>&1 || rc=$? + +bash "$SEMI" release "$TAG" >/dev/null 2>&1 || true + +if [ "$rc" = 0 ]; then + screen -S "${USER}-PMO" -X stuff "$(printf 'Work turn done OK - read inbox-pmo + logs/%s.\r' "$SLUG")" || true +else + screen -S "${USER}-PMO" -X stuff "$(printf 'Work turn FAILED (rc=%s) - read logs/%s.\r' "$rc" "$SLUG")" || true +fi +exit "$rc" diff --git a/handoff/cto-state-20260828/.coordinate/scripts/ping-pmo.sh b/handoff/cto-state-20260828/.coordinate/scripts/ping-pmo.sh new file mode 100755 index 0000000..d772961 --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/scripts/ping-pmo.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +screen -S TSGCTO-PMO -X stuff "$(printf 'Work turn done - read inbox-pmo + log.\r')" diff --git a/handoff/cto-state-20260828/.coordinate/scripts/pmo-loop.sh b/handoff/cto-state-20260828/.coordinate/scripts/pmo-loop.sh new file mode 100755 index 0000000..c69ea8e --- /dev/null +++ b/handoff/cto-state-20260828/.coordinate/scripts/pmo-loop.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# pmo-loop.sh [pmo|work] — keep a crush session alive inside its screen. +ROLE="${1:-pmo}" +case "$ROLE" in + pmo) FRESH="$HOME/.coordinate/RELAUNCH-FRESH"; PIN="$HOME/.coordinate/PMO-SESSION-ID" ;; + work) FRESH="$HOME/.coordinate/RELAUNCH-FRESH-WORK"; PIN="$HOME/.coordinate/WORK-SESSION-ID" ;; + *) echo "usage: $0 [pmo|work]" >&2; exit 1 ;; +esac +LOG="$HOME/.coordinate/logs/${ROLE}-relaunch.log" +LEDGER=/home/_crossfeed/metrics/launches.jsonl +ledger() { printf '%s\n' "$1" >> "$LEDGER" 2>/dev/null || true; } +cd "$HOME" +export TERM="${TERM:-xterm-256color}" +export PATH="$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:$PATH" +while true; do + started=$(date +%s) + mode=continue + if [ -f "$FRESH" ]; then + rm -f "$FRESH" + mode=fresh + echo "$(date -Is) relaunch FRESH" >> "$LOG" + crush --yolo + elif [ -s "$PIN" ]; then + sid=$(cat "$PIN") + mode=pinned:$sid + echo "$(date -Is) relaunch PINNED $sid" >> "$LOG" + crush --yolo --session "$sid" + else + echo "$(date -Is) relaunch CONTINUE" >> "$LOG" + crush --yolo --continue + fi + rc=$? + rt=$(( $(date +%s) - started )) + ledger "{\"ts\":\"$(date -Is)\",\"user\":\"$USER\",\"role\":\"$ROLE\",\"mode\":\"$mode\",\"rc\":$rc,\"runtime_s\":$rt}" + if [ "$rt" -lt 60 ]; then + echo "$(date -Is) short run (${rt}s rc=$rc) - backoff 60s" >> "$LOG" + sleep 60 + else + sleep 2 + fi +done diff --git a/log.md b/log.md index 91a0221..169a866 100644 --- a/log.md +++ b/log.md @@ -78,3 +78,4 @@ 2026-08-29T05:06:13-05:00 | PMO | WRAP for crush update: snapshot #6 written (STATE-SNAPSHOT-20260829-0530.md); chain self-sufficient (q9 on 5.2 -> flash gates); heartbeat 1h; relaunch screen as RCEO-PMO 2026-08-29T05:18:52-05:00 | PMO | MAX PLAN: quota reset; default model back to glm-5.2; pdf turn dispatched parallel (q13); snapshot amended 2026-08-29T05:20:40-05:00 | PMO | language policy tiered: rust ok / python avoid-but-ok in supply chain / node last-resort + consult Charles (workers must stop-and-ask) +2026-08-29T05:24:29-05:00 | PMO | tickets 490-499 fleshed (objective/background/scope/acceptance/status structure); mopac-pmo repo live on Gitea, 7 atomic commits pushed; commit+push-as-we-go now standing practice diff --git a/logs/q-pdf.log b/logs/q-pdf.log index 209160c..e59ab4a 100644 --- a/logs/q-pdf.log +++ b/logs/q-pdf.log @@ -4,4 +4,4 @@ Failed to override models: large model: model "glm-5.2" found in multiple providers: litellm and zai. Please specify provider using 'provider/model' format. -I have the family patterns. Setting up the task list and starting. \ No newline at end of file +I have the family patterns. Setting up the task list and starting.Typst stdin→stdout works. Testing image resolution with stdin input: \ No newline at end of file diff --git a/logs/q-quota.log b/logs/q-quota.log index 22bf80c..41aa7d6 100644 --- a/logs/q-quota.log +++ b/logs/q-quota.log @@ -5,4 +5,4 @@ Tickets confirmed. Now researching the z.ai usage API surface. Agent processing failed: failed to start agent processing stream: failed to fetch URL: Post "https://sourcegraph.com/.api/graphql": context deadline exceeded (Client.Timeout exceeded while awaiting headers). -Codebase understood. Now researching the z.ai usage endpoint.Documented findings: coding plan has 5-hour + weekly credit buckets; **peak hours = Mon–Fri 14:00–18:00 SGT ≈ 01:00–05:00 CST** (Charles's guess confirmed). No documented usage REST endpoint — probing for the undocumented one with a real key.Gateway responds under `/api/coding/*` but no public usage route. One final probe batch, plus checking LiteLLM's own documented spend API (master key in container env):Research complete. Now checking dev workflow, git state, and test conventions before writing code.All context gathered. Checking the TOML subset parser's number handling before writing the config surface:Writing the implementation now — config surface first:Now the `[quota]` + `[resources]` config structs:Now the `internal/quota` package — snapshot + parser:Estimator + schedule:Resource monitor (ticket 491):Shared state — minimal stdlib RESP client:Usage poller:The decision gate:Loop integration — the gate wiring:Now wire the gate into the Conductor struct and daemon flow:Now the daemon: gate consultation before dispatch, usage recording after turn, startup status line. Also state.go extensions:Now add usage aggregation to `loopState`:Now the CLI `harness quota` subcommand:Adding an exported usage accessor in the loop package, then the CLI:Now the CLI subcommand in main.go:Now the test suite — quota package first:Resources + fake-redis tests:Config load test + loop integration tests:Extend the fakeRedmine fixture with per-issue classes: \ No newline at end of file +Codebase understood. Now researching the z.ai usage endpoint.Documented findings: coding plan has 5-hour + weekly credit buckets; **peak hours = Mon–Fri 14:00–18:00 SGT ≈ 01:00–05:00 CST** (Charles's guess confirmed). No documented usage REST endpoint — probing for the undocumented one with a real key.Gateway responds under `/api/coding/*` but no public usage route. One final probe batch, plus checking LiteLLM's own documented spend API (master key in container env):Research complete. Now checking dev workflow, git state, and test conventions before writing code.All context gathered. Checking the TOML subset parser's number handling before writing the config surface:Writing the implementation now — config surface first:Now the `[quota]` + `[resources]` config structs:Now the `internal/quota` package — snapshot + parser:Estimator + schedule:Resource monitor (ticket 491):Shared state — minimal stdlib RESP client:Usage poller:The decision gate:Loop integration — the gate wiring:Now wire the gate into the Conductor struct and daemon flow:Now the daemon: gate consultation before dispatch, usage recording after turn, startup status line. Also state.go extensions:Now add usage aggregation to `loopState`:Now the CLI `harness quota` subcommand:Adding an exported usage accessor in the loop package, then the CLI:Now the CLI subcommand in main.go:Now the test suite — quota package first:Resources + fake-redis tests:Config load test + loop integration tests:Extend the fakeRedmine fixture with per-issue classes:First build pass to catch compile errors: \ No newline at end of file diff --git a/prompts/INTRO-PMO.md b/prompts/INTRO-PMO.md new file mode 100644 index 0000000..c98cc50 --- /dev/null +++ b/prompts/INTRO-PMO.md @@ -0,0 +1,27 @@ +INTRODUCTION (from founder, 2026-08-28) + +You are reachableceo-PMO — manager of this stack. Direct report: +reachableceo-Work (screen RCEO-Work), a crush instance as the same user. +The founder (reachableceo) interacts with you day-to-day and observes Work +READ-ONLY; all founder writes happen here with you. + +Read ~/.coordinate/PROTOCOL.md and follow it exactly: TASK files to +inbox-work/, consume REPORT/QUESTION/BLOCKED from inbox-pmo/, maintain +BOARD.md + log.md. Dispatch = headless crush-run wrappers (PROTOCOL); +never dispatch without the FOUNDER GATE. Monitor headless turns by reading +logs/, never by attaching. + +CAPABILITIES: no sudo (root needs go to the founder). Headless workers: + env HOME=/home/reachableceo TERM=xterm-256color screen -dmS bash -c \ + 'crush run --quiet "$(cat /path/to/prompt.md)"' \ + > /home/reachableceo/.coordinate/logs/.log 2>&1 +Use crush sub-agent tooling instead of long sequential exploration. + +YOUR MISSION: <<>> +YOUR SYSTEMS OF RECORD: <<>> + +TOKEN DISCIPLINE: terse (<=5 line replies); cite file paths; batch reads; +never paste large files; findings go to ~/.coordinate files. + +NOW: read PROTOCOL.md, append intro line to log.md, set BOARD.md +current-focus, greet the founder in 5 lines max. Then wait. diff --git a/prompts/INTRO-WORK.md b/prompts/INTRO-WORK.md new file mode 100644 index 0000000..6807330 --- /dev/null +++ b/prompts/INTRO-WORK.md @@ -0,0 +1,25 @@ +INTRODUCTION (from founder, 2026-08-28) + +You are reachableceo-Work (screen RCEO-Work) — executor of this stack, +running ~99% headless. Humans rarely talk to you directly. reachableceo-PMO is +your manager: turns arrive ONLY as headless crush-run TASK files from +PMO (~/.coordinate/inbox-work/). Founder (reachableceo) is final authority, +read-only observer. + +YOUR LOOP — every turn, before anything else: +1. PROTOCOL checklist: BOARD.md, inbox-work/ (P1 first; CANCEL drops), + log.md tail. +2. Execute TASKs; obey Constraints; deliver Deliverables. Parallelizable + subtasks may go to headless workers (logs/.log; verify before + reporting done). +3. File REPORT/QUESTION/BLOCKED in inbox-pmo/, archive the TASK, append + log line. Chat replies are one-liners; substance goes in files. + +RULES: never self-assign scope (QUESTION instead). Empty inbox when pinged += one line, stop. No watchers/polling loops. No sudo — root needs go +BLOCKED to PMO. Never kill the other session's screens. If PROTOCOL.md is +missing, say so and wait — do not recreate. + +NOW: read PROTOCOL.md, append your online line to log.md, post +inbox-pmo/REPORT-ready.md ("reachableceo-Work online, awaiting first TASK"). +One chat line only. Then wait. diff --git a/tooling-draft/README.md b/tooling-draft/README.md new file mode 100644 index 0000000..b175dad --- /dev/null +++ b/tooling-draft/README.md @@ -0,0 +1,30 @@ +# tooling — shared meta/support repos (all five verticals) + +Single source of truth for org agent-stack + support tooling. Created +2026-08-28 after the /tmp-relaunch regression (stale wrapper copy dropped +--yolo; duplicate screens). Rule: **no founder-run script from /tmp ever +again** — installers live here, stamped by git SHA. + +## Layout (one repo per domain) +- agent-stack/ PMO/Work stack kit: pmo-loop.sh (canonical wrapper), + tsg-stack-relaunch-v2.sh, founder-full-reset.sh, + screenrc-multiuser. Cloned to offstage/COS later. +- integrations/ discourse/redmine/gitea helpers (landing zone). +- credentials/ credential-manager TOOL code only. NEVER secrets. + +## Write model +- All vertical accounts (TSGBOD TSGCCO TSGCTO TSGCOO reachableceo) are in + group `users`; dirs are setgid 2775 and git uses core.sharedRepository=group. +- Commit as your local uid: `../commit.sh ""` (sets umask 002). +- Never commit secrets, tokens, session pins, or logs. + +## Push/promotion model (no remotes) +- Verticals commit in place. reachableceo-PMO integrates, reviews `git log`, + and tags releases (vN or dated). +- Offstage/COS: founder clones/tars agent-stack from a tagged SHA; changes + flow back as `git bundle` files dropped in /home/_crossfeed/outbox, which + reachableceo-PMO pulls. That is the "push via crossfeed" transport. + +## Install provenance +Installers copy files OUT of these repos; recipients keep the header stamp +`# source: /home/_crossfeed/tooling/ @ `. diff --git a/tooling-draft/agent-stack b/tooling-draft/agent-stack new file mode 160000 index 0000000..11dfd18 --- /dev/null +++ b/tooling-draft/agent-stack @@ -0,0 +1 @@ +Subproject commit 11dfd182e620f561c80d73045b6a2153947f624d diff --git a/tooling-draft/commit.sh b/tooling-draft/commit.sh new file mode 100755 index 0000000..748fdf0 --- /dev/null +++ b/tooling-draft/commit.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# commit.sh "" — commit inside /home/_crossfeed/tooling/ +# as your local uid. Sets umask 002 so group members keep write access. +set -euo pipefail +base=$(cd "$(dirname "$0")" && pwd) +repo=${1:?usage: commit.sh ""} +msg=${2:?usage: commit.sh ""} +cd "$base/$repo" +umask 002 +git add -A +git commit -m "[$USER] $msg" diff --git a/tooling-draft/credentials b/tooling-draft/credentials new file mode 160000 index 0000000..ba63368 --- /dev/null +++ b/tooling-draft/credentials @@ -0,0 +1 @@ +Subproject commit ba633685ed74bdbbd4bbeef156fe4bee9b97d9b3 diff --git a/tooling-draft/integrations b/tooling-draft/integrations new file mode 160000 index 0000000..4477b1a --- /dev/null +++ b/tooling-draft/integrations @@ -0,0 +1 @@ +Subproject commit 4477b1a1059f2ab3600f41fc194bf68f8ac00e55