Skip to content

[UTEL] Complete operational collection and selected receiver adoption #4638

Closed
10 of 10 issues completed
Closed

Description

@EHotwagner

Owner

Programme /root owns programme reconciliation and cross-repository acceptance. /root/v2_acceptance owns the selected first offline local-diagnostic source slice and combined .github integration; /root/passive_capture completed the modern native-capture reader/journal/spool source window and records its bounded candidate closure; Programme /root owns further runtime acceptance. Coordination provider owners and Home/SystemAdmin retain their implementation, receiver, credential and native-operation scopes.

Done when

Operational UTEL collection is qualified across the selected producer, receiver/store and delivery paths, with actual dispatch and usage coverage, recovery/correction and explicit unsupported or Unknown cases. Historical effects are reconciled under their original identities; a fresh success does not settle them.

Current deliverable

Accepted4705/4707 scopes remain: actual compatible Host0.8.0/uv14 cutover, genuine canonical transport/fact admission,48canonical joins/12real browser assertions and scoped independent retirement. Later batch2 reconciliation6495426191 freshly verifies the original October23 applied post/independent acceptance6369730466 and settlement6369752837:24new identities plus prior25unchanged,49current identities/zero corrections, processed1/awaiting0, credential removal and original retirement. A current bounded stable local client read agrees: two applied outcomes with original digests,0ready files, sequence2/pending=false and two retained producer gaps. This is current client state, not fresh receiver health/ingestion. No batch2 drain is pending. PR4922/ab171b8d separately delivers the source fault-coverage report and active Atlas49ee4a3f, with reviewed/tested/delivered tree identity and all relevant checks green. It adds no runtime test/gate. Whole attribution/interruption/Unknown/recovery/correction/retention/rollback and adoption remain owed.

Next action

After the user-prioritized shared runner→bake→registration→firstBAR boundary, Root/Home select the remaining genuine interruption/Unknown/recovery/correction and attribution/retention/rollback/adoption journey with exact current source/configuration/custody and separate original bounds. Reuse accepted4705/4707 and October23batch2 remote application/settlement; current local metadata shows no ready batch or pending intent. Do not send batch2 again, request another credential for it, invent an ordinal or repoint/clone queued state. Root retains the exact next runtime selection; Home is already application custodian. The source transport-coverage evaluation is delivered; any optional narrow storage-operation fixture remains a separate later scoped decision, not another completion prerequisite.

Blocked on

Remaining genuine installed interruption/Unknown/recovery/correction, complete attribution, retention/rollback and adoption assertions need their actual current inputs/custody and separate operation selection after the primary shared-native/firstBAR path. Compatible Host0.8.0/uv14 cutover, authenticated durable ingestion and batch2 application/settlement are accepted, not missing original suppliers or pending drains. Today's client state supplies no fresh remote health/receipt readback. Original outage-time gaps, failed/Unknown effects and all439inherited+46later holds remain unreleased. No complete modern-provider/period coverage, zero unknown cost, off-machine recovery or wholeUTEL acceptance follows.

Acceptance evidence

2026-10-29 batch2/current-client reconciliation6495426191 and source coverage/capture acceptance6495254001 supersede older pending-drain/source-preparation planning only. Full Done when/history/OPEN/Blocked preserved.

2026-10-29 supplier reconciliation6494527715 retains closed4705/4707 actual acceptance and all original limits; full Done when and historical evidence remain unchanged. No new native operation or field transition.

The independently accepted canonical continuation used two fixed genuine CLI 0.106 capture/report calls with complete matching raw output and scoped process cleanup. It advanced 24 to 48 native identities and one to two ready batches, preserved all prior observations and the first batch, and retained owner/generation and source cursor continuity. Fresh before/after checks preserved old diagnostic/offline queues, canonical configuration/descriptor/public CA and the global 0.106 selector; canonical producer state intentionally advanced. Restricted original receipts and Root acceptance retain the original 0.528-second execution and timely collection. This is partial historical-prefix normal continuation only: attribution, cost and delivery remain Unknown, with no complete current programme population, installed crash/full-spool recovery, authenticated receiver or browser acceptance. No further capture follows from this reconciliation.

Independent original-operation acceptance now additionally verifies published Host 0.7 production staging (55 exact payloads; old live service unchanged) and the distinct canonical persistent CLI 0.106 local capture (three zero-exit, reaped calls in 0.679 seconds; 24 native-prefix observations, one ready batch and identical capture/report bytes). Restricted original receipts and independent readback retain the exact clocks, stream hashes, source/package joins and scoped process cleanup. Prior diagnostic/offline state and selector bytes were preserved; current binding-4 preimage evidence was unavailable and is not claimed. These results do not establish prospective complete coverage, resume/full-spool behavior, authenticated receiver delivery, production cutover or browser acceptance. The earlier late-collection original and all failed/partial bootstraps remain unqualified.

Current independent reconciliation and Home source disposition records the accepted disposable old-backup restore, genuine published schema-12-to-13-to-14 migration and Host 0.7 backup/isolated restore. Restricted original receipts, raw streams, original clocks, package/source joins and independent Root acceptance preserve both failed/partial bootstraps and the distinct successful continuation. The actual backend reported SQLite 3.53.4; all 15 original facts and source-permitted table/journal changes were verified, with the original backup and live old receiver unchanged. Coordinator/Creator source PR4680 merged at 21:07 UTC; publication/installed adoption remain separate. Proper canonical TLS is accepted, but no authenticated application ingestion, browser journey, production cutover, durable replacement custody or HDD/off-machine recovery is claimed. Home v6 r4's 43-control independent SOURCE PASS does not qualify native execution. The full outcome remains open; all historical evidence below is retained.

Accepted original Host0.7 candidate/preflight/publication and promoted release above, with native all-eight/journal/feeds/custody joins; current guarded Host0.7 source delivery PR4678, exact accepted source/tree and actual engine/package runs above; earlier guarded source delivery PR4675, exact engine/package runs and source/tree correspondence above; current Atlas contract/telemetry-host records source/receipt-profile boundaries and contract/passive-native-usage-observations retains partial capture, attribution and delivery separation. Accepted original candidate run39124245029, source/tree and authenticated artifact above; the prospective native Action results and root acceptance are retained in restricted custody under Atlas private/telemetry/installed-candidate-native-capture-boundary. Original trial deviations remain retained separately. owning plan; release and selected-store acceptance; containment evidence and authority evidence. Broader installed/fleet coverage is not established by those scoped milestones. Unified v3 outcome index. Existing-rights information accepted; manager-reader source task selected. No repeated policy listing is requested. Source selection does not establish actual manager-reader access or native acceptance; original failed listings and reservations remain unchanged. Home confirmed selected-plan read and implementation start.

The passive collection decision in the owning source candidate records local-observation independence and the separately open modern-reader/receiver acceptance windows. Delivered Atlas IDs platform/passive-local-telemetry-readiness-boundary and programme/forward-recovery-unavailable-history retain source-only limits; protected delivery is verified at315cb9a7a592b90e4afa9507c9ce04f912aa671b. The first offline and following modern passive-capture source windows are complete. The modern source contract is contract/passive-native-usage-observations, with executable-qualification process record platform/executable-qualification-and-final-assembly; source scope remains distinct from installed behavior and receiver acceptance. The broader UTEL outcome and modern provider/receiver acceptance remain open. Earlier complete issue bodies, owners and receipts remain preserved in original custody.

Receiver input reconciliation: [verified current access/service metadata](https://github.com/FS-GG/.github/issues/4516#issuecomment-6253495420), [completed stable address](https://github.com/FS-GG/.github/issues/4516#issuecomment-6253487948), and [independent address disposition/next owner action](https://github.com/FS-GG/.github/issues/4516#issuecomment-6253569367). Private topology, custody and operation receipts remain restricted.

Receiver backup/isolated restore, actual TLS refusal and current export-source disposition; same-journal original-context source boundary. Original receipts and operational topology remain restricted.

Canonical TLS, current isolated-tool result and delivered export/journal source reconciliation. Restricted Atlas retains private operational custody; full outcome and original Unknowns remain open.

Decomposition design and scoped remaining acceptance: https://github.com/FS-GG/.github/issues/4701; `docs/coordination/2026-10-19-board-clearing-lifecycle-design.md` (owning source plan; publication remains separate). Next bounded result: https://github.com/FS-GG/.github/issues/4705; native creation/link/enrollment and actual acceptance remain separate.
## Accepted deterministic orchestration integration — 2026-10-21

The user accepted the comprehensive framework and product workspace orchestration design and requested Coordination-board incorporation. That LEARN issue holds the complete design, source findings, replacement contracts, delivery sequence and integrated acceptance.

UTEL integration: observe the ordinary deterministic controller, framework workspaces and product workspaces through the existing observation store. Add bounded references for assessments, candidate/exclusion reasons, profile/specification identity, assignments, real waits, native lifecycle/configuration/resource use and accepted outcomes. Retain retrievable assessment artifacts, whole-original lineage, immutable provenance and explicit missing coverage. PostgreSQL execution authority and SQLite observations remain separate. LEARN statistical enrollment is optional and cannot block otherwise qualified ordinary execution. Preserve the existing receiver, installed crash/full-spool, correction, coverage and recovery acceptance.
Source incorporation: the existing accountable owner includes this requirement when preparing the relevant next contract/roadmap delivery and captures its durable ADR/Atlas references. No new implementation owner, worker dispatch, runtime activation, publication, issue closure, project-field change or reservation release is made by this issue amendment. Existing original evidence, operations and remaining acceptance are preserved.

Activity

  1. EHotwagner commented on Oct 28, 2026

    @EHotwagner
    ContributorAuthor

    User research incorporation — transport fault coverage against OpenTelemetry

    Root/existing UTEL owner uses OTel resiliency as a coverage benchmark for the CURRENT SQLite-WAL/immutable-batch/receipt/dedup/correction implementation. Map receiver outage beyond retry horizon, full queue, process restart before/after durable handoff, full/failed disk, duplicate/lost acknowledgement, misconfiguration and correction replay to existing executable tests and actual remaining operational assertions. Mark covered, missing or unavailable evidence; add a focused test only for an identified gap.

    For each hop distinguish queued, durable locally, accepted remotely and corrected/projected. Upstream acceptance without a retained receipt remains ambiguous; retry must preserve original batch/operation identity and existing receiver dedup semantics. Storage failure must not be reported as successful delivery or zero cost. Keep original outage-time observation gaps separate from accepted4707 receiver/browser scope.

    No additional collector framework/exporter migration is selected; the current scope excludes that replacement. Reconsider an exporter adapter only for a demonstrated maintenance benefit with equivalent attribution/corrections/receipts and explicit scope decision. Whole4638/4640 still needs genuine installed receiver/interruption/recovery/assessment/adoption evidence.

    Reference: https://opentelemetry.io/docs/collector/resiliency/

    This is a bounded evaluation disposition incorporating the user’s research, not runtime/publication authority or a new completion dependency. Existing owner, accepted source, full Done when and actual operational prerequisites remain. Home native managed-owner work stays primary. Use the existing v3 prior-art appendix as research: docs/roadmaps/fsgg-v3/02-prior-art-and-research.md explicitly does not amend operating policy. Root owns eventual concise cited decision capture at reviewed delivery; owning issue remains authoritative meanwhile. Benefits unmeasured. No additional scheduler, status ledger or framework is selected.

  2. EHotwagner commented on Oct 29, 2026

    @EHotwagner
    ContributorAuthor

    Root supplier reconciliation — accepted live receiver/cutover and genuine receipt supersede the stale pending-installation/ingestion body; full UTEL remains open.

    Fresh native reads verify4705 and4707 CLOSED/COMPLETED. 4705 independent acceptance6344445603 establishes one genuine pre-existing25-event passive-home-canonical-v1 batch durably received/applied by actual Host0.8.0/uv14, canonical fact admissions and ingest facts+25, matching original envelope digest and unchanged neighboring receipts. Credential copies were deleted as selected. It explicitly leaves batch2 pending,2producer gaps, programme/activity attribution Unknown, and the original reservation/effect holds unchanged. No new send or current queue state is inferred here.

    4707 final acceptance6396226736 reuses that upstream guarantee and accepts current receiver configuration10402680,48/48 canonical joins,12actual browser assertions and independent unit/process/cgroup/profile retirement. Its earlier actual Host0.8.0 schema14 compatible cutover and faithful migration are accepted, not merely staged Host0.7. Retained outage-time producer gaps and failed-supervisor effects remain unproved. This child acceptance is not complete parent attribution, interruption/recovery/correction, retention/rollback or assessment/adoption.

    Root's next operational selection must first read current canonical association/queue/batch identities, receiver/store/configuration and existing credential-reference custody, through Home's existing protected route. Only an actual unchanged pending original can be considered for a separately admitted credential delivery/drain; no invented next ordinal, replay, repointing, cloning or client-secret reuse. Reconcile any already completed retention cleanup before selecting it; elapsed time alone is not cleanup evidence. Attribution completeness, genuine interruption/Unknown/recovery/correction and actual installed adoption remain at their owning scopes. The independent optional transport-coverage research6470054902 does not add another completion prerequisite.

    Atlas github/utel-producer-association-identity@f7993302f695430a0ee938b1b3684fdfec4055bddb378b52c81785c0319e8c98 was retrieved and all3 immutable source citations independently verified. Home is already the user-selected application custodian, not an unrecovered external owner. Root WORKING on reconciliation/source selection and primary4778 review; Home WORKING on current runner source repairs. No second custodian or telemetry operation is requested during that checkpoint. After that boundary, Root owns the smallest current identity/custody read and exact remaining operation selection with Home; completion is actual current readback, not this historical supplier correction. All439+46 Unknown holds remain. Whole4638 remains OPEN/Blocked.

  3. EHotwagner commented on Oct 29, 2026

    @EHotwagner
    ContributorAuthor

    Root accepts the requested transport-coverage preparation6470054902 at source/documentation scope.

    PR4922 merged2026-10-29T11:18:45Z asab171b8d397a07bc8541854ffd9298b54bd8e905. Reviewed/tested/delivered treed91418376d6edc8696eed367fad31dfd5e0c5f5c is identical; independent exact-head source review APPROVE, all53 observed checks succeeded and2 intentionally skipped, with native head/App15368 joins. The report maps eight fault scenarios to existing source assertions and separately retains4705/4707 installed scope. Local18Atlas controls/history/guidance and maintained projection/manifest checks pass; original missing-tool/dependency/generated-bytecode failures remain recorded, not erased. No telemetry tests, runtime fault operation or publication was performed for this prose/capture delivery.

    Active Atlas github/utel-transport-fault-coverage@49ee4a3f2a8918bdbbafb312cfa807d9982800d13d29ee292c6c0daad8b9b8f1 was independently retrieved after protected delivery. All457baseline entries remain and both shipped seeds agree. This closes the research-coverage capture gap only; other current native/contract capture gaps remain Root-owned.

    Existing retry/spool/dedup/crash/correction controls are not to be duplicated merely to claim progress. Actual storage-operation failure is a possible narrow future test selection, not a new completion prerequisite. Root owns any later scoped choice. Full4638/4640 still require genuine current custody and remaining installed interruption/Unknown/recovery/correction/attribution/retention/rollback/assessment/adoption. No source/knowledge merge closes either Outcome, changes StatusBlocked, sends a batch, restores credentials or releases any original hold. Root continues primary4778 source diagnosis and reconsideration of independently useful remaining work; Home retains existing custody/runner ownership.

  4. EHotwagner commented on Oct 29, 2026

    @EHotwagner
    ContributorAuthor

    Root current-client and prior-original reconciliation — batch2 was already applied and settled; no drain/credential restoration for it is needed.

    The determining retained acceptance is later than4705's October22 window: Root6369730466 independently accepts the original October23 applied post, exact24batch2 identities/kinds/revisions/canonical digests, all prior25facts/five receipts unchanged,49current identities/zero corrections, actual provenance/profile and retirement. Root6369752837 records the one completed producer settlement at16:32:07UTC, exit0/processed1/awaitingApplication0, exact applied original, credential removal/path absence and collector retirement. Both native comments were freshly read. No new send/post/settle was run.

    A bounded read-only stable-file observation of the existing mounted canonical client at2026-10-29 verifies the unchanged association scope, two applied local outcomes with the accepted original digests,0ready files, sequence2/pending=false and the same two explicit producer-gap codes. Config480B SHA256c43be85fe26268113e1144f00b47ada91005525d03eb5febf521a5718c216059; current private metadata3159B SHA256cb1345ae19be84bfa8316d96d8da3678e12064385ad4fae244487970b45587c9. The configured engine is a bare command and resolves on currentPATH; a literal-path existence test would not establish absence. No raw producer events, keys or source copies enter this public record.

    This current observation proves the local client view only, not a fresh receiver/store read or current remote service health. The genuine prior remote acceptance/settlement is reused from its canonical original record.4707's later48-observation/browser joins retain their accepted scope. The older pending-batch2 wording is historical, superseded for next-action selection by this reconciliation; do not mint a new ordinal, resend, clone/repoint queued state or request another credential for this completed batch.

    Root next selects the remaining genuine interruption/Unknown/recovery/correction/attribution/retention/rollback/assessment/adoption journey with Home after the primary shared-native/firstBAR boundary, reusing accepted source/receipt evidence and refreshing only determining current inputs. Home retains application custody, Root integration/selection; no new telemetry runtime worker or operation is active. Primary4778 source diagnosis remains active in parallel. All original failed/Unknown effects and439+46holds remain. Whole4638/4640 stay OPEN/Blocked.

    The delivered4922 report deliberately describes4705's earlier historical acceptance scope; this later accepted batch2 receipt/settlement is the authoritative continuation for future operation selection. Root owns incorporating that navigation at the next meaningful knowledge delivery rather than repeating another qualification or publication.

  5. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev ruling, 2026-10-30 (owner's standing decision grant): telemetry receiver route.

    Corrections to the earlier Root statements.

    1. The receiver is the FS.GG fsgg-telemetry-host HTTPS receiver. It is not OTLP.
    2. The legacy Main Host 0.1.1 receiver (telemetry.main.internal = 169.254.1.2:8443) refuses connections from fdev.
    3. The UTEL receiver fsgg-store (Host 0.8.0/uv14) is live inside fdev on :8447, after the 2026-10-30 full cutover. Its TLS was verified, with the CA "FS-GG Home Telemetry 20261003 CA".
    4. --telemetry-unavailable local-clr-resource-hold on deliveries has nothing to do with the listener. It records held local CLR execution, and must not be described as a listener workaround.

    Ruling.

    • The legacy Main 8443 listener is obsolete for new work. The VM is the only security zone, and the receiver moved into fdev under the owner's "full cutover" choice.
    • fdev's producer gets a fresh enrollment against fsgg-store under ADR-0094 custody: a distinct principal and key, explicit provision/enroll, and no repointing, cloning or re-sending of the old main-fsharp-dev queued state. That old queue stays historical and retained, and its coverage gap stays recorded.

    #4638's own remaining journey (interruption/Unknown/recovery/correction plus assessment/adoption/rollback) is selected to run against the live fdev receiver. The batch2 identity is not re-sent. It stays sequenced after the shared-native/first-BAR path unless Root re-sequences it.

  6. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev decisions, 2026-10-30, under the owner's standing decision grant. These cover the fresh telemetry enrollment (recipe in .github#4983).

    1. Option B is admitted. A new workspace and store is created with init, with a fresh producer id that never appeared in association history. The live utel-home-20261003 counts (49/48) and batch2 stay untouched.
    2. Receiver custody. Under the VM-only security-zone ruling, in-VM custody is cooperative. Root acts as receiver custodian inside fdev, using in-VM sudo under the owner's standing delegation, as for [LEARN-01.2/.4–.5 / Akka orchestration] Qualify installed LEARN observation, persistent receiver and causal acceptance #4647 and [V2-LANG-01.2 P3–P5 and full .5 adoption] Complete portable workspace execution and polyglot adoption #4648. Each custody step is recorded with before/after hashes. No secret value is printed or committed.
    3. ADR-0094 "outside the development container". That requirement is superseded by the VM-only zone ruling. ADR-0094's other rules still bind: a distinct principal and key, no key reuse, explicit enrollment, and Programme accountability.
    4. CA trust. /etc does not persist in fdev, so no system trust anchor is added. The producer uses SSL_CERT_FILE pointing at the public "FS-GG Home Telemetry 20261003 CA" kept under the persistent home. If the engine does not honour it, the result is recorded as Unknown and we stop.
    5. Spool. A new empty spool root is used, and activate-remote runs via fdev-telemetry exec. The old queue and its gap are never touched.
    6. Admitted now: journey steps J0 (baseline) and J1 (enroll plus health). That includes the receiver stop/start window. The rollback is staged before the first write.
    7. Not yet admitted: J2 and later, each of which needs its own admission. J9 depends on Host 0.9.0 for Claude-transcript provenance, which is prospective; it is recorded as Unknown.
  7. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    J0 + J1 executed under the Root decisions of 2026-10-30T20:38:09Z (fresh enrollment recipe in .github#4983). Option B: new workspace fdev-vm-20261030, new producer fdev-vm-main, stream coordination. No telemetry was submitted. The only drain tick ran on an empty spool. The old queue and utel-home-20261003 were not touched. No secret value was printed, logged or committed.

    Result: J0 and J1 complete. One fault occurred and was rolled back and retried (see Fault).

    J0 baseline (before any write)

    • host.json SHA-256 10402680a98cc06c9731b0988a9d90e95add23abde55b6cecc54096702eb8d69 (the configuration hash accepted on Qualify the first installed facts-and-coverage provider-to-browser journey #4707). Copy kept in the receiver config directory and in private scratch.
    • status --config JSON SHA-256 375346f984d3ff3dbed064e2125a3115860837ff4006b111ad270c99a715d737: one store, utel-home-20261003, ready, lifetimeReceipts 6, pending 0, schema 14.
    • Live store telemetry.sqlite3 SHA-256 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb.
    • Old spool top-level listing hash 9ca9c42620405368eccebc4c72511728c4ecf545ec95d55219205fcec7a87f59.
    • Old client directory renamed to ~/.config/fs-gg/telemetry-main.retired-20261030 (contents intact, 0700).

    J1 receiver side (as fsgg-store-dev via in-VM sudo; host process runs as in-container telemetry)

    • Fresh CSPRNG token written straight to /srv/telemetry/config/home-20261003/fdev-vm-main-v1.secret (0600, 65 bytes). Never displayed.
    • Redacted diff (the file holds paths only, no secrets):
    @@ -8,6 +8,10 @@
       {
        "WorkspaceId": "utel-home-20261003",
        "Root": "/srv/telemetry/data/utel-home-store14-v1/utel-home-20261003"
    +  },
    +  {
    +   "WorkspaceId": "fdev-vm-20261030",
    +   "Root": "/srv/telemetry/data/fdev-vm-store14-v1/fdev-vm-20261030"
       }
      ],
      "Credentials": [
    @@ -26,6 +30,14 @@
        "ProducerId": "codex-passive-home-01",
        "StreamId": "native-usage",
        "Revoked": false
    +  },
    +  {
    +   "Reference": "fdev-vm-main-v1",
    +   "SecretFile": "/srv/telemetry/config/home-20261003/fdev-vm-main-v1.secret",
    +   "WorkspaceId": "fdev-vm-20261030",
    +   "ProducerId": "fdev-vm-main",
    +   "StreamId": "coordination",
    +   "Revoked": false
       }
      ],
      "BrowserPrincipals": [
    • New host.json SHA-256 01948d4418c2886c4ee5f7a251a7371a2781f1725ad6f40ea6136a691bc15c4d.
    • Stopped only the supervisor program telemetry-home (a narrower scope than stopping fsgg-store.service; the container and sshd stayed up). init returned already-provisioned on the retry (the store was created in the first attempt), enroll-producer returned enrolled, preflight returned ready with stores 2.
    • After start: status shows utel-home-20261003 identical to the J0 entry (ready, 6 receipts, pending 0), and fdev-vm-20261030 ready with 0 receipts. Status JSON SHA-256 0603b489c16fb01de17529f136511a84c06827c7e3790a9f5992ec8255e1780e. Live store sqlite hash unchanged.

    J1 producer side

    • New ~/.config/fs-gg/telemetry-main (0700): producer-main.secret 0400 (equal to the receiver file by cmp, not printed), telemetry-ca.crt and client.json (endpoint https://fsgg-store.lan:8447, workspace/producer/stream as above).
    • CA: "FS-GG Home Telemetry 20261003 CA", SHA-256 fingerprint CB:20:40:91:E8:5C:82:09:FA:FE:89:EB:4E:AD:1E:AE:29:F3:4E:E5:D4:45:BA:3D:62:9A:21:29:D9:3F:79:C8; the file hash 4073c67a4a073bbd04497d57421b71d8d042e5204d9743bd87beee6f76cc089b equals the receiver's own public ca.crt. No /etc anchor was added.
    • SSL_CERT_FILE honoured by the .NET runtime on fdev: an unauthenticated GET fails TLS without it and returns 401 with it. The engine's own TLS path is Unknown until the first real submit or drain of a ready file, because activate-remote and an empty drain make no network call.
    • First authenticated request fdev-telemetry health: exit 0, body {"status":"ready"} (output SHA-256 682c055ddf7d0afe32b7b2646e1635ab3c83f65884a37aecdc8549e7031a3417).
    • activate-remote --credential-reference main with new empty spool ~/.local/share/fs-gg-private/telemetry-spool-fdev-vm-20261030 returned activated. ~/.config/fs-gg/telemetry.json SHA-256 c8dc92176eddda8fbe34c7ef7fd11b8c91663e388415a4738d0218566d4af4d4.
    • workspace status: configured, pending 0, pendingDurablyReceived 0, pendingUnacknowledged 0 (SHA-256 d8fa0d02e7c5b01d38a0d740a8f62771be9ec70096852e44141f029278cfa8a0).
    • The 21:43:43 CET drain-timer tick printed "draining remote telemetry" and {"schema":"fsgg.telemetry.workspace-drain/1","processed":0,"awaitingApplication":0}. The "waiting for released durable-receipt CLI" message is gone.
    • Old spool listing hash after: 9ca9c426… (unchanged).

    Fault and findings

    1. First stop window: podman exec without -i dropped stdin, so host.json was installed empty, enroll-producer refused (invalid-configuration), and my rollback wrote it empty again. The host could not spawn for about 13 seconds. I restored host.json from the in-container cp -p copy (hash back to 10402680…, original mtime), restarted, and verified: J0 status hash identical, live sqlite hash identical, no-auth health 401. Window 1 ran 20:39:37Z to 20:40:09Z. The retry used -i and a post-install hash check; window 2 ran 20:40:35Z to 20:40:52Z.
    2. activate-remote refused configuration-directory-unsafe: ~/.config/fs-gg was 0755 and the engine requires exactly 0700. I set it to 0700 (it holds only the telemetry client directories). Rollback is chmod 755.
    3. The drain timer runs without SSL_CERT_FILE. It is harmless while the spool is empty, but the first real drain of a ready file needs the variable in its environment (for example a user-unit drop-in under the persistent home). I made no such change and ask Root to admit it with J2.

    Timeline (UTC)

    2026-10-30T20:38:57Z start J0/J1 under Root admission comment IC_kwDOS6feoM8AAAABhWVSKA (2026-10-30T20:38:09Z)
    2026-10-30T20:38:57Z old client dir renamed to telemetry-main.retired-20261030
    2026-10-30T20:39:06Z rollback staged: host.json hash+copy (scratch + beside original)
    2026-10-30T20:39:11Z J0 baseline status captured
    2026-10-30T20:39:25Z fresh token written to /srv/telemetry/config/home-20261003/fdev-vm-main-v1.secret (0600 telemetry); value not displayed
    2026-10-30T20:39:37Z STOP window begins: supervisorctl stop telemetry-home
    2026-10-30T20:39:43Z host.json replaced (after-hash 01948d4418c2886c4ee5f7a251a7371a2781f1725ad6f40ea6136a691bc15c4d)
    2026-10-30T20:39:45Z init ok (new store)
    2026-10-30T20:39:46Z ROLLBACK triggered: enroll refused
    2026-10-30T20:39:56Z FAULT: stdin not forwarded by podman exec (no -i); host.json written empty; init had run; restoring from in-container copy
    2026-10-30T20:40:09Z host.json restored (hash 10402680a98cc06c9731b0988a9d90e95add23abde55b6cecc54096702eb8d69); telemetry-home start issued
    2026-10-30T20:40:28Z fixed: podman exec -i; stdin staging verified against after-hash
    2026-10-30T20:40:35Z STOP window 2 begins
    2026-10-30T20:40:40Z host.json installed, hash 01948d4418c2886c4ee5f7a251a7371a2781f1725ad6f40ea6136a691bc15c4d
    2026-10-30T20:40:42Z enroll-producer ok
    2026-10-30T20:40:43Z preflight accepted
    2026-10-30T20:40:52Z telemetry-home start issued (STOP window 2 ends)
    2026-10-30T20:41:00Z receiver restarted; status after captured
    2026-10-30T20:41:20Z producer dir created: secret 0400, public CA, client.json
    2026-10-30T20:41:24Z first authenticated request: fdev-telemetry health
    2026-10-30T20:41:46Z activate-remote with new spool /home/developer/.local/share/fs-gg-private/telemetry-spool-fdev-vm-20261030
    2026-10-30T20:41:59Z FINDING: activate-remote refused configuration-directory-unsafe (~/.config/fs-gg was 0755; engine requires 0700); chmod 700 (was 755)
    2026-10-30T20:41:59Z activate-remote result: see exit above
    2026-10-30T20:42:03Z workspace status captured
    

    Corrections are recorded in .github#4983 (head b511c2c). Rollback for everything above: restore host.json from host.json.before-fdev-vm-enroll-20261030 and restart telemetry-home; enroll-producer --revoked for the principal; rename the retired client directory back; chmod 755 ~/.config/fs-gg. J2 and later are not admitted and were not started.

    Refs #4638

  8. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    [board-drift-ack] e:6532977192 — Root/fdev: the ruling did not change actionability. Status is already correct (In progress; the J0/J1 enrollment is admitted and running).

  9. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev, 2026-10-30: J0 and J1 are accepted on the evidence in 6533081132.

    What J1 established:

    • the new store fdev-vm-20261030 and producer fdev-vm-main were enrolled;
    • preflight reported ready;
    • the producer health check passed against the live fdev receiver;
    • activate-remote ran with a new empty spool;
    • the live utel-home-20261003 store and its sqlite file are hash-identical to J0;
    • the old queue was untouched.

    Incident recorded: a podman exec without -i wrote an empty host.json. The host was unable to spawn for about 13 s. It was restored from the in-container copy and verified against J0 before the retry. The recipe (#4983) now documents this, together with the requirement that ~/.config/fs-gg be 0700.

    Admitted now: J2 (normal delivery).

    • Give the drain timer SSL_CERT_FILE through a user-unit drop-in under the persistent home directory (~/.config/systemd/user/…d/), not /etc.
    • Run one genuine capture, submit it, and drain it from durably-received to applied.
    • Evidence to collect: the fsgg.telemetry.receipt/1 digest, the producer outcome files, and the receiver lifetime receipts going up by 1 in the new store only.
    • The coordination engine honouring SSL_CERT_FILE is tested here. If it doesn't honour it, stop and report.

    J3 and later are not admitted yet.

  10. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    J2 (normal delivery) executed under Root's 2026-10-30T20:49:40Z admission. Result: one genuine batch was captured, submitted, made durably received and applied in the new store only. Nothing beyond that single capture was run, and no secret was printed.

    Drain-unit drop-in

    ~/.config/systemd/user/fdev-telemetry-drain.service.d/ssl-cert-file.conf sets SSL_CERT_FILE=%h/.config/fs-gg/telemetry-main/telemetry-ca.crt; systemctl --user daemon-reload was run, and systemctl --user show lists the drop-in and the variable. Nothing under /etc was touched.

    Engine honours SSL_CERT_FILE

    The first real engine network call (drain 1) completed TLS against the live receiver with the variable set and produced a durable receipt. The Unknown from J1 is resolved for the engine itself.

    The capture (normal producer path, no synthetic input)

    • fdev-telemetry exec fsgg-coord-engine telemetry passive capture --config ~/.config/fs-gg/telemetry.json --repository FS-GG/.github --input <selection> over one real Codex rollout already on fdev (rollout-2026-10-29T13-04-17-…, 2,897,170 bytes, SHA-256 44798fa0981c2f99f8d1e2bfa5f5215919c3d0199960c7cb5c7300f241db74a0). Selection file SHA-256 13d782709d007ef6857fe9b9262a258accf01f9ca641a635fff0af25f6c181dd (private, 0600).
    • One immutable ready batch passive-4fd001a3398747c5953c1d552a61397e-1: 24 provider-usage-observation/1 rows, provenance codex-local-rollout/1, 23,592 bytes. Capture state: locally-retained, attribution unknown, delivery unknown, population partial, gaps observation-pass-budget and source-population-unknown. Raw rows are not published here.

    Delivery

    Step Producer view Receiver fdev-vm-20261030
    Before pending 0 lifetimeReceipts 0, pending 0
    After capture pending 1, pendingUnacknowledged 1, no marker unchanged (0)
    Drain 1 marker status durably-received (processed 0, awaitingApplication 1) lifetimeReceipts 1, pendingReceipts 0
    Drain 2 outcome status applied (processed 1, awaitingApplication 0), ready file removed lifetimeReceipts 1
    • Receipt digest: d4d34dd5252ae3da9288f80bb2287a43e7d55d8d985670b7e7dd19392f33fdb9 (the .durable marker and the final outcome agree; it equals the ready file's SHA-256).
    • Producer outcome files in the new spool ~/.local/share/fs-gg-private/telemetry-spool-fdev-vm-20261030/outcomes/: 74a6a7d0…c7a9.durable (219 bytes, durably-received, replaced by) 74a6a7d0…c7a9.json (210 bytes, fsgg.telemetry.workspace-outcome/1, status applied, code null, SHA-256 230df4118c0f3bf97c02888aedb92479b312c37950f0f55d36c68479cef1d120).
    • workspace status afterwards: pending 0, pendingDurablyReceived 0, pendingUnacknowledged 0.

    Unchanged controls

    • utel-home-20261003: status entry identical to the J2 baseline (ready, lifetimeReceipts 6, pending 0) and sqlite SHA-256 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, identical before and after.
    • New store sqlite SHA-256 ae8eee94…ec06 before, 45b50b1e01f94169d3789e1c4945cf39d1839b08e7d5f98c533b9ef61947ca18 after. Host status JSON SHA-256 0603b489…780e before, 881591c3a1be1d62a8a4b49fdc5c541c691569cc2085bf3ed8e789d0a9e5cf20 after (the only difference is the new store's 0 to 1 receipt).
    • host.json SHA-256 01948d44…c15c4d, unchanged since J1. Old spool top-level listing hash 9ca9c426…a87f59, unchanged. The retired client directory was not touched.

    Notes and Unknowns

    • The capture ended with observation-pass-budget, so the rollout still has unread tail beyond this one batch. No second capture was run (J2 is one batch).
    • Attribution, programme coverage and cost remain Unknown for these rows; this proves transport and application for one batch only.
    • An unattended timer tick under the new drop-in has not yet drained a real ready file; the drop-in is verified by systemctl show and by the same variable working in the manual drain.

    Timeline (UTC)

    2026-10-30T20:39:11Z J0 baseline status captured
    2026-10-30T20:41:00Z receiver restarted; status after captured
    2026-10-30T20:42:03Z workspace status captured
    2026-10-30T20:50:42Z J2 begins (Root comment IC_kwDOS6feoM8AAAABhWhYGw admits J2)
    2026-10-30T20:50:50Z drop-in written /home/developer/.config/systemd/user/fdev-telemetry-drain.service.d/ssl-cert-file.conf; daemon-reload
    2026-10-30T20:50:56Z capture start: telemetry passive capture, 1 Codex rollout (rollout-2026-10-29T13-04-17...)
    2026-10-30T20:50:56Z capture end
    2026-10-30T20:51:09Z drain #1 (first engine network call, SSL_CERT_FILE set)
    2026-10-30T20:51:11Z drain #1 done
    2026-10-30T20:51:25Z drain #2
    2026-10-30T20:51:26Z drain #2 done
    2026-10-30T20:51:36Z J2 after-state captured
    

    J3 and later are not admitted and were not started.

    Refs #4638

  11. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Post-restart readback for J2 (fdev rebooted at 21:58 CET, after J2 completed at about 21:52 CET). Read-only; no capture, drain, enrollment or config change was run after the reboot. Everything below matches the J2 evidence in 6533217852.

    • Receiver: fsgg-store.service active, supervisor program telemetry-home RUNNING, :8447 listening, no-auth health 401 with verified TLS. host.json SHA-256 01948d4418c2886c4ee5f7a251a7371a2781f1725ad6f40ea6136a691bc15c4d (unchanged). Host status JSON SHA-256 881591c3a1be1d62a8a4b49fdc5c541c691569cc2085bf3ed8e789d0a9e5cf20 (identical to the J2 after-state).
    • utel-home-20261003: ready, lifetimeReceipts 6, pending 0, sqlite SHA-256 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, identical to J0.
    • fdev-vm-20261030: ready, lifetimeReceipts 1, pending 0, sqlite SHA-256 45b50b1e01f94169d3789e1c4945cf39d1839b08e7d5f98c533b9ef61947ca18 (identical to the J2 after-state).
    • Producer: workspace status is configured, pending 0, pendingDurablyReceived 0, pendingUnacknowledged 0. The new spool holds no .ready file; the only outcome file is 74a6a7d0…c7a9.json, status applied, digest d4d34dd5252ae3da9288f80bb2287a43e7d55d8d985670b7e7dd19392f33fdb9, SHA-256 230df4118c0f3bf97c02888aedb92479b312c37950f0f55d36c68479cef1d120. Association config SHA-256 c8dc92176eddda8fbe34c7ef7fd11b8c91663e388415a4738d0218566d4af4d4; old spool listing hash 9ca9c426…a87f59 unchanged.
    • Drop-in: ~/.config/systemd/user/fdev-telemetry-drain.service.d/ssl-cert-file.conf survived (it lives in the persistent home); systemctl --user show lists it and the variable. Timer ticks after the reboot (22:03:40, 22:09:40 CET) ran with processed 0, awaitingApplication 0.

    Decision: nothing was half-done, so there was nothing to complete or roll back, and a second capture would exceed the admitted single batch. J2 stands as recorded. One loss: the private scratch under /tmp (staged copies, intermediate outputs, local timeline) did not survive the reboot. The evidence above was already posted, and the receiver-side rollback copy host.json.before-fdev-vm-enroll-20261030 (SHA-256 10402680a98cc06c9731b0988a9d90e95add23abde55b6cecc54096702eb8d69) is on persistent disk. Scratch for further steps now lives under ~/.local/share/fs-gg-private/enroll-4638/.

    Refs #4638

  12. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev, 2026-10-30: J2 is accepted.

    What J2 showed:

    • One genuine passive capture: a real Codex rollout of 24 observations went from durably-received to applied, with receipt digest d4d34dd5….
    • The new store went from 0 to 1 receipt. The old store and the old spool are hash-unchanged.
    • The engine honours SSL_CERT_FILE through the user-unit drop-in.
    • Everything survived the unannounced fdev restart. A post-restart readback (6533569227) is hash-identical to the post-J2 state.

    First measured fdev telemetry exists. This begins closing the token-efficiency evidence gap.

    Admitted now, as one batch, in the new store only, each with its own stop and rollback:

    • J3: producer interruption (kill -9 between intent and submit, then restart). Pass means identical .ready bytes, no duplicate, and the same batch id applied.
    • J4: receiver outage beyond the retry budget (telemetry-home stopped longer than 5×10 s while a batch is pending, then started again). Pass means the pending batch is kept and settles to applied, and utel-home-20261003 is unchanged.
    • J7: backup plus restoreReceiptStore into a copy, never in place. Restored receipts must equal the originals. Off-machine copy stays Unknown.
    • J8: one revision-2 correction for one identity in the new workspace. The projection must show revision 2, the original bytes must stay immutable, and corrections go from 0 to 1 in the new workspace only.

    Not yet admitted:

    • J5, the lost acknowledgement. It needs an nft rule; it is a separate admission.
    • J6, optional.
    • J9, which waits on Host 0.9.0 provenance.
    • J10, browser assessment, which needs a BrowserPrincipals edit and a restart.
    • J11 to J13.

    Before each step: record a resumable checkpoint here (state plus rollback), because fdev has restarted unannounced twice today.

  13. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Checkpoint before J3 (producer interruption), 2026-10-30. Resumable state; fdev may restart unannounced.

    • State now: J2 stands (new store fdev-vm-20261030: 1 receipt, pending 0). Producer workspace status pending 0, no .ready file, one applied outcome. Invariants OK: utel-home-20261003 sqlite 13bb564a…, old spool listing 9ca9c426…, host.json 01948d44….
    • Plan: run telemetry passive capture again (same real Codex rollout, continuing from the retained cursor) and kill -9 the engine immediately after the pending intent is written and before any submit. Then restart (re-run capture, which replays the exact retained bytes), then drain to applied.
    • Pass: .ready bytes identical to the retained intent (batchDigest), no duplicate receipt for that batch id, the same batch id applied.
    • Rollback / resume: a killed capture changes only producer-local state; nothing reaches the receiver until a drain. If the host restarts mid-step: read orchestrator-passive/producer.json for a pending object; re-run the same capture command to replay it, then workspace drain. Producer-state backup before the step: ~/.local/share/fs-gg-private/enroll-4638/spool.before-J3.tar (SHA-256 recorded in the evidence). Applied receipts cannot be un-applied; this step adds at most 2 receipts, in the new store only. Any anomaly: stop, leave the retained intent in place, report.
    • Scratch: ~/.local/share/fs-gg-private/enroll-4638/. J4, J7 and J8 each get their own checkpoint.

    Refs #4638

  14. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    J3 (producer interruption) evidence. Result: pass, with one stated limitation. New store only.

    • Interruption: the real capture command was started by a small driver that sent SIGKILL the instant the retained pending intent appeared in the producer state (orchestrator-passive/producer.json). The engine died with rc -9 after 0.4 s. State at the kill: pending intent passive-4fd001a3398747c5953c1d552a61397e-2 (24 events, 23,072 bytes, batchDigest 1a4d4343ed57e86fd218af626733121739ef63099744de0432f0384da3b2fb56, sequence 1, sequenceAfter 2), no .ready file, no outcome change. The kill landed between intent and enqueue, so nothing could have been submitted.
    • Receiver during the kill: untouched (still 1 receipt, pending 0); invariants OK straight after the kill.
    • Restart: re-running the same capture command replayed the retained intent first: pending cleared, sequence 3, and a .ready envelope for batch id ...-2 appeared (23,383 bytes, SHA-256 852c594ed16490fac3bf656f5bc8fb75e60d2fc946a0af3f9e38c8f9af715672, 24 events). The same pass then scanned onward and created one further batch ...-3 (23,429 bytes, SHA-256 610c747e5ad84d9270070914425e606f082b639e956be97c329855bc5be64231, 24 events) because the source still had unread tail (observation-pass-budget).
    • Drain to applied: batch -2 took one drain to durably-received and the next to applied; batch -3 the same (the drain handles one file per pass). Outcomes: -1 applied digest d4d34dd5…, -2 applied digest 852c594e…, -3 applied digest 610c747e…. Each digest equals its ready-file SHA-256. Batch numbers are continuous (1, 2, 3); the killed intent was applied exactly once under its original id.
    • No duplicate: new store lifetimeReceipts 1 to 3 (exactly the two new batches), pending 0; producer workspace status pending 0, durable 0, unacknowledged 0; no .ready remains; 3 outcome files.

    Limitation (Unknown): I did not copy the retained intent bytes aside before the restart, so I cannot show my own byte-for-byte comparison of intent against the .ready payload. Identity of the replayed bytes rests on the engine's own check, which refuses replay unless sha256(retained bytes) == batchDigest (SkillTelemetryAdapter.fs:1237), plus matching batch id and event count. Re-serialised payload hashes cannot be compared directly because the intent and the envelope use different JSON serialisers. A future run should save pending.batchBase64 before restarting.

    Controls: utel-home-20261003 sqlite 13bb564a… unchanged, status ready 6 receipts pending 0; old spool listing 9ca9c426… unchanged; host.json 01948d44… unchanged. New store sqlite 45b50b1e… before, 6de5bb705109012ad735a3408a4d065204caf75720f918bd620e68dff77da5c6 after.

    Next: J4 checkpoint.

    Refs #4638

  15. 65 remaining items

  16. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Coverage limit recorded (wave 2), and wave 2 resumed.

    • Resumed after the coordinator's approval: the bounded database is locked retry (3 retries, 3 s apart, read-only queries only), the reconcile of the one applied-but-unrecorded round (-218, re-verified first: receipts +1, Claude facts +11, outcome applied, no .ready/intent, 0 rejected; ledger now at round 161 with 208 receipts and 4,661 Claude facts), and the remaining rounds under the same stops, with checkpoints at rounds 200, 300 and 400.
    • Coverage limit (for the record): the capture engine resets its turn context at any transcript row its decoder rejects (a malformed non-JSON row, an oversized line, or a user/assistant row failing its field checks; SkillTelemetryReaders.fs:1526-1528). Responses after such a row are not captured until the next user prompt, because they cannot be tied to a turn (turn-identity-unavailable). It is conservative by design, not data loss. Measured so far: one malformed row in one file skips 2 responses (one identity); the independent verifier now mirrors the rule, which lowers the whole-plan expected total from 12,167 to 12,160 (7 identities behind skipped rows). Telemetry totals therefore under-count by this small, known, per-file amount; they should be described as "captured responses", not "all responses".

    Refs #4638

  17. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Wave 2 STOPPED again by its own condition after recorded round 189: the unattended drain timer overlapped my drain (configuration-busy). Same class as before; data and controls clean; paused for approval of a scheduling-only fix.

    • What happened: at 08:04:21Z the loop's workspace drain returned configuration-busy (exit 1) because the user timer fdev-telemetry-drain.timer ran its own workspace drain at the same moment and held the engine's config lock. The timer's pass then drained my batch (journal: draining remote telemetry, processed 1, awaitingApplication 0 at 08:04:21Z).
    • State left (verified, no state file edited): receiver 237 receipts, all applied, 0 rejected, 0 durably-received; 5,355 Claude facts (5,332 + 23); no .ready, no durable marker, no pending intent. The ledger says round 189 (236 receipts, 5,332 facts), so one applied batch (-248, 23 observations, round 190) is unrecorded, exactly like -218. Controls unchanged: utel sqlite 13bb564a…, old spool 9ca9c426…, host.json cebed70b…; telemetry-home RUNNING on 0.9.0. 189 recorded rounds (190 actual) of 400; selection 11 of 16 in flight (10 complete); 237 of 600 receipts today.
    • Why it will recur: the timer ticks every 5 minutes and a round's capture and drain take about 20 to 30 seconds, so any given round has roughly a 5 to 10 percent chance of overlapping a tick (this was the first overlap in about 190 rounds, and the lock retry I added covers only database reads, not the engine config lock).
    • Proposed fix (scheduling only, no stop loosened; code prepared and dry-tested, not applied): before each round the loop waits until the drain service is idle and the next tick is more than 55 seconds away (it read 217 s in the dry test), so a round never overlaps a tick; it logs any wait. All stop conditions stay exactly as admitted, including "any non-zero exit". The only cost is waiting up to about 4 minutes in the roughly 1 in 6 rounds that would otherwise cross a tick (at most 15 minutes, else stop). Alternative if preferred: pause the timer for the wave, which I have not done because it changes the installed unattended path.
    • Also needed: the same one-round reconcile for -248 (re-verify receipts +1, Claude facts +23, outcome applied, no .ready/intent, 0 rejected, then clear stopped).
    • Needs approval before I resume: the timer guard, the -248 reconcile, and the remaining rounds (210 of 400) with the same stops; next checkpoint at round 200.

    Refs #4638

  18. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Wave 2, checkpoint at round 200: on track, no deviation. Continuing to round 300.

    • Since the last report: the one unrecorded round (-248) was reconciled after re-verification, and the timer guard was applied as approved. The guard worked: rounds 191 to 200 ran with one logged 60 s wait (before round 195, for a drain-timer tick) and no overlap. Timer left running.
    • Progress: rounds 1 to 200 done (400-round cap); 11 of 16 selections complete, the 12th in flight (168 of 842 identities so far). Batches -48 to -257. 247 receipts today of 600.
    • Receiver (live new store): receipts 247, all applied, 0 rejected, 0 awaiting application; Claude facts 5,575 (906 before wave 2, +4,669); Codex facts 169; corrections 0; integrity_check ok; sqlite 13,611,008 bytes (+10.4 MB since wave 2 started; bound +100 MB). utel-home-20261003 still 6 receipts, 0 Claude facts.
    • Controls: utel-home-20261003 sqlite 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, old spool 9ca9c42620405368eccebc4c72511728c4ecf545ec95d55219205fcec7a87f59, host.json cebed70ba545f890db32d5b00a658d2cd9ee0737a014b5949d5d813029eb8050: unchanged. telemetry-home RUNNING on 0.9.0. Producer: no .ready, no pending intent; retained responses peaked at 192 (stop 235, cap 256). Free disk 381 GB.
    • Identity parity (independent, engine-aligned): wave 1 plus step 8 expect 906; the 11 completed selections expect 4,501; the in-flight one 842. Actual identities in the store 5,575. Missing from the completed set 0; extra outside completed plus in-flight 0. Whole plan 12,160 expected, 5,575 present, 6,585 to go.
    • Outlook: 200 rounds remain, carrying about 4,600 identities, so I expect about 10,170 of 12,160 (84 percent) when the 400-round cap stops the run, with the last selections (the largest files) unfinished. I will report at the cap.

    Refs #4638

  19. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Wave 2: halted at round 267 on the coordinator's stop; checkpoint at that state clean; resuming on coherent 0.114.0.

    • Halt: the loop was stopped right after state.json recorded round 267 (batch -327), before the next round began. Ledger and receiver agree: receipts 314 (47 + 267), all applied, 0 rejected; Claude facts 7,160, Codex facts 169; no .ready, 0 pending; stopped unset.
    • Producer after the 0.114.0 install: fsgg-coord-engine on PATH reports 0.114.0.0. One read-only telemetry workspace status returned configured, destination remote, producer fdev-vm-main, workspace fdev-vm-20261030, stream coordination, pending 0, unacknowledged-lossy false. The capture state producer.json is intact (schema fsgg.telemetry.passive-producer-state/1, 6 sources, 144 retained responses of cap 256, 109 retired). The first resumed round re-checks it end to end (receipt +1, Claude facts +24, 0 rejected).
    • Identity parity at round 267 (independent): 12 of 16 selections complete (5,343 identities with the 906 earlier); the 13th in flight (911 of 1,170 present). Actual in the store 7,160. Missing from the completed set 0; extra outside completed plus in-flight 0.
    • Controls unchanged: utel-home sqlite 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, old spool 9ca9c42620405368eccebc4c72511728c4ecf545ec95d55219205fcec7a87f59, host.json cebed70ba545f890db32d5b00a658d2cd9ee0737a014b5949d5d813029eb8050. Store sqlite 17.1 MB (about +14 MB since wave 2 began; bound +100 MB), integrity ok, free disk 377 GB.
    • One thing to note, not a stop yet: a file in the last selection (16, 442 expected identities) has a modification time of this minute, so it belongs to a live session, not a closed one. The loop already refuses to start a selection whose file changed since the plan, so it would stop there. At the current pace the 400-round cap is reached in selection 14 or 15, so I expect not to touch it. Whole-plan expected moved from 12,160 to 12,242 only because that file grew.
    • Resuming: same stops, timer guard on, timer left running, to round 300 (checkpoint), then to the 400-round cap.

    Refs #4638

  20. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Wave 2, checkpoint at round 300: on track, no deviation. Continuing to the 400-round cap.

    • Coherent 0.114.0: 33 rounds (268 to 300) ran on the new fsgg-coord-engine (0.114.0.0) with every round passing the loop's own checks (+1 receipt, +24 Claude facts, 0 rejected). The capture state was unaffected.
    • Progress: 300 of 400 rounds; 13 of 16 selections complete, the 14th in flight (526 of 1,460 identities so far). Batches -48 to -360. Four logged waits for the drain timer (44 to 46 s each), no overlap; timer left running.
    • Receiver (live new store): receipts 347, all applied, 0 rejected, 0 awaiting application; Claude facts 7,945; Codex facts 169; corrections 0; integrity_check ok; sqlite 18,862,080 bytes (+about 15 MB since wave 2 began; bound +100 MB). utel-home-20261003 still 6 receipts, 0 Claude facts.
    • Controls: utel-home sqlite 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, old spool 9ca9c42620405368eccebc4c72511728c4ecf545ec95d55219205fcec7a87f59, host.json cebed70ba545f890db32d5b00a658d2cd9ee0737a014b5949d5d813029eb8050: unchanged. telemetry-home unchanged; no .ready, no pending intent; retained responses peaked at 192 (stop 235, cap 256); free disk 376 GB; 347 receipts today of 600.
    • Identity parity (independent, engine-aligned): the 13 completed selections plus the 906 earlier expect 6,513 identities; the in-flight one 1,460. Actual in the store 7,945. Missing from the completed set 0; extra outside completed plus in-flight 0.
    • Outlook: whole-plan expected is now 12,278 (it grows as the live file in the last selection grows; the loop refuses to start that selection if it changed since the plan). 100 rounds remain, carrying about 2,400 identities, so I expect about 10,350 of 12,278 at the cap, ending in selection 15. I will report at the cap and will not extend it.

    Refs #4638

  21. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Wave 2 stopped at round 340, by the plan's own file-change guard, before selection 15 started. Nothing was captured or sent after the stop. Waiting for a decision.

    • What stopped it: file modified since plan: agent-ae22edd78ca3cae8b.jsonl (one of the eight files in selection 15, 217 expected identities). It was planned as closed (modification time 02:32Z) but its modification time is now 16:05Z, so that subagent was resumed after the plan. The loop checks this before the first capture of a selection, so no capture, batch or drain happened for selection 15. Separately, the single file in the last selection (16, agent-a374e797ff5df00a9.jsonl, 442 expected) is also still being written (modified 16:31Z); the same guard would have stopped selection 16.
    • State (verified by hand, ledger not edited): state.json at rounds 340, 14 of 16 selections complete, stopped set to the message above. Receiver receipts 387 (= 47 + 340), all applied, 0 rejected, 0 awaiting application; Claude facts 8,879; Codex facts 169; corrections 0; integrity_check ok; sqlite 20.9 MB (bound +100 MB). No applied-but-unrecorded batch, no .ready, no pending intent. Free disk 376 GB; 387 receipts today of 600.
    • Controls unchanged: utel-home sqlite 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, old spool 9ca9c42620405368eccebc4c72511728c4ecf545ec95d55219205fcec7a87f59, host.json cebed70ba545f890db32d5b00a658d2cd9ee0737a014b5949d5d813029eb8050. Timer left running.
    • Identity parity (independent): 14 selections complete plus the 906 earlier expect 7,973; actual in the store 8,879. Missing from the completed set 0; extra 0. Whole plan now expects 12,303 (the two live files grew); 3,424 not yet captured. This is 60 rounds short of the 400-round cap.
    • Options for Root (none taken): (a) drop agent-ae22edd78ca3cae8b.jsonl and the live file in selection 16 from the plan and run the other seven files of selection 15 (about 1,851 identities, about 77 rounds, ending near round 417, so inside the cap only up to round 400, which is about 60 rounds, about 1,400 identities); (b) re-plan so each changed file is re-baselined at its current size, which captures its new rows too but needs the plan's time and size baseline reset, which is a plan edit; (c) end the wave here at 340 rounds. I would take (a) or (b) only with admission, because both change the recorded plan. The 400-round cap stays as admitted.

    Refs #4638

  22. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Wave 2: plan change recorded (option (a), admitted), resuming to the 400-round cap.

    • Dropped from the plan (still-live agents, transcripts keep growing, modified after the plan, so the loop's guard would stop on them again):
      • agent-ae22edd78ca3cae8b.jsonl from selection 15 (217 expected identities); modified 16:05Z against a planned 02:32Z.
      • agent-a374e797ff5df00a9.jsonl from selection 16 (442 expected); modified 16:31Z against a planned 02:26Z.
    • Correction to my stop report: selection 16 has two files, not one. Its other file (587 expected) stays in the plan. I wrongly wrote that selection 16's only file was the live one.
    • New expected totals: selection 15 now has 7 files and 2,035 identities; selection 16 has 1 file and 587. Whole plan 11,501 (was 12,303 as measured at the stop; 12,160 at wave start). Captured so far 8,879; 2,622 to go. Parity at this state: 0 missing from the completed set, 0 extra.
    • Ledger: state.json has a planChanges entry (time, reason, both files, the previous stop message); stopped cleared; backups plan.json.before-drop-live and state.json.before-drop-live kept. Round count unchanged at 340, receipts 387 (47 + 340), all applied, 0 rejected; controls unchanged.
    • Running now: the seven remaining files of selection 15, same stops, same timer guard, 400-round cap unchanged (60 rounds left, about 1,440 identities, so I expect selection 15 to be about 70 percent captured at the cap). Then the independent full parity recomputation over all captured files, and a report.
    • Deferred item (not started): the two live-agent transcripts above (and anything else whose agent is still live) go to a later wave, after those agents are closed. That wave needs its own admission. Selection 15's remainder and selection 16's other file (587) also fall outside this wave if the cap stops first.

    Refs #4638

  23. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Wave 2 stopped at the 400-round cap, as admitted. Identity parity exact. Report.

    • Cap: round 400 recorded (batch -462, 17:23Z); the loop ended normally ("invocation end"), no stop in this block. Not extended. After the plan change, rounds 341 to 400 ran selection 15's seven files with 7 logged timer-guard waits and no overlap.
    • Receiver (live new store): receipts 447, all applied, 0 rejected, 0 awaiting application; Claude facts 10,316; Codex facts 169; corrections 0; integrity_check ok; sqlite 24,109,056 bytes (+about 20 MB since wave 2 began; bound +100 MB). utel-home-20261003 still 6 receipts, 0 Claude facts. Ledger consistent: rounds 400, receipts 47 + 400 = 447, no applied-but-unrecorded batch, no .ready, no pending intent.
    • Controls unchanged: utel-home sqlite 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, old spool 9ca9c42620405368eccebc4c72511728c4ecf545ec95d55219205fcec7a87f59, host.json cebed70ba545f890db32d5b00a658d2cd9ee0737a014b5949d5d813029eb8050. Drain timer left running. Producer on fsgg-coord-engine 0.114.0.0; workspace status configured, pending 0. Retained responses peaked at 192 (stop 235, cap 256); free disk 375 GB; 447 receipts today of 600.
    • Independent full identity recomputation (every captured file, engine-aligned decode rules): the 906 earlier identities (wave 1 plus step 8) plus the 14 completed selections expect 7,973; selection 15 (in flight) expects 2,035, of which 1,437 are present. Actual identities in the store 10,316. Missing from the completed set 0; extra outside completed plus in-flight 0. The identity rule is the same independent one used at every checkpoint (thread, turn and response hashed with the claude-transcript/1 prefix).
    • Not captured (outside this wave): whole plan expects 11,501 after the plan change, so 1,185 remain: 598 in selection 15's seven files, and selection 16's other file (587). Those need their own admission; I have not continued. Also deferred and not started, as ruled: the two live-agent transcripts agent-ae22edd78ca3cae8b.jsonl (217) and agent-a374e797ff5df00a9.jsonl (442), for a later wave after those agents are closed.
    • Stops and fixes this wave: three recorded stops, each reported and approved: a database-lock on a read-only query (round 160), a drain-timer overlap (round 189), and the plan's file-change guard (round 340). Fixes: bounded lock retry, the timer guard, and the plan change above. Rollback artifacts are kept until step 9 plus 7 days.

    Refs #4638

  24. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Wave 2b started (admitted): the remaining 1,185 identities, cap raised from 400 to 460 rounds.

    • Scope: selection 15's seven files (598 identities left) and selection 16's other file (587). The two live-agent transcripts stay deferred.
    • Changed: only the round cap constant (MAXROUNDS 400 to 460; backup wave2.py.before-cap460). Plan, stops and timer guard unchanged. Daily receipt limit stays 600: now 447, so at most 507 even at all 60 rounds; the loop stops at 600.
    • State at start: rounds 400, receipts 447 all applied, Claude facts 10,316, controls unchanged, no plan file changed since the last plan edit.
    • Next: a parity checkpoint with the independent recomputation when the wave ends (about 50 rounds are needed).

    Refs #4638

  25. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Wave 2b complete: all 16 selections captured in 452 rounds (cap 460, not reached). Independent parity exact.

    • Run: rounds 401 to 452, no stop; 7 logged timer-guard waits (47 to 50 s), no overlap; drain timer left running. Selection 15 finished, then selection 16's remaining file. The loop ended on its own ("all 16 selections complete").
    • Receiver (live new store): receipts 499 (47 + 452), all applied, 0 rejected, 0 awaiting application; Claude facts 11,501; Codex facts 169; corrections 0; integrity_check ok; sqlite 26,710,016 bytes (+about 23 MB since wave 2 began; bound +100 MB). utel-home-20261003 still 6 receipts, 0 Claude facts. Ledger consistent: no applied-but-unrecorded batch, no .ready, no pending intent. 499 receipts today of 600.
    • Controls unchanged: utel-home sqlite 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, old spool 9ca9c42620405368eccebc4c72511728c4ecf545ec95d55219205fcec7a87f59, host.json cebed70ba545f890db32d5b00a658d2cd9ee0737a014b5949d5d813029eb8050. Producer on fsgg-coord-engine 0.114.0.0, workspace status configured, pending 0. Retained responses peaked at 192 in the earlier blocks (stop 235). Free disk 374 GB.
    • Independent full identity recomputation (every captured file, engine-aligned rules): the 906 earlier identities plus all 16 selections give 11,501 expected; 11,501 present; sets equal; 0 missing, 0 extra, 0 not yet captured.
    • Still deferred, not started: the two live-agent transcripts, agent-ae22edd78ca3cae8b.jsonl (217) and agent-a374e797ff5df00a9.jsonl (442), for a later wave once those agents are closed; that needs its own admission. Rollback artifacts are kept until step 9 plus 7 days. State: ~/.local/share/fs-gg-private/enroll-4638/wave2/state.json.

    Refs #4638

  26. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Close-out report: fresh telemetry producer enrollment in fdev (J-journey through step 9). For Root's acceptance; nothing new ran for it.

    Root's rulings applied: step 9 closes now for the closed backlog; live-agent transcripts stay deferred; the main session goes with continuous capture; continuous capture stays declined; Atlas capture and this report are go; browser.key kept.

    Done-when, mapped to this slice

    Done-when: "Operational UTEL collection is qualified across the selected producer, receiver/store and delivery paths, with actual dispatch and usage coverage, recovery/correction and explicit unsupported or Unknown cases. Historical effects are reconciled under their original identities; a fresh success does not settle them." This slice covers the fdev producer, the live new store and the delivery path. It does not settle the parent outcome.

    Done-when element In this slice Evidence
    Producer, fresh enrollment Accepted. New workspace fdev-vm-20261030 on the live receiver, distinct principal and key, explicit enrollment, no repointing or re-sending of the old queue J0 to J2 and the recipe (PR #4983, merged)
    Receiver/store Accepted. New store alongside utel-home-20261003; both read normally; the old store and old spool were hash-identical after every step, including now J3, J4, J7, comments above; controls re-read 2026-10-31T18:07Z
    Delivery path Accepted. Unattended drain (four ticks, then all of waves 1 to 2b); lost acknowledgement; revocation; retention bounds J5, J11, J12, J13
    Recovery/correction Partly. Backup and copy restore into a copy only; correction mechanism on a throwaway Host (synthetic, not natural) J7, J8
    Usage coverage Claude Code usage now measured: Host 0.9.0 published, read back, org feed verified independently (observer PR #5006 merged), live cutover, one Claude capture, then the closed backlog steps 1 to 9
    Browser Accepted for the scoped assessment (not a rerun of the earlier twelve assertions) J10
    Historical effects Untouched. The old store, old spool and legacy queue were only read controls

    Step 9 (closed backlog) is closed, with these numbers

    Waves 1, 2 and 2b: 452 rounds after the step 8 capture, 11,501 Claude identities captured, all 16 selections of the plan. Receiver: 499 receipts, all applied, 0 rejected; Claude facts 11,501; Codex facts 169; corrections 0. Independent recomputation from the transcripts (identity rule restated in the wave checkpoints): 11,501 expected, 11,501 present, 0 missing, 0 extra, sets equal (Root accepted this). Controls: utel-home sqlite 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, old spool listing 9ca9c42620405368eccebc4c72511728c4ecf545ec95d55219205fcec7a87f59, host.json cebed70ba545f890db32d5b00a658d2cd9ee0737a014b5949d5d813029eb8050: unchanged since the baseline. Producer pending 0, no .ready. Drain timer left running throughout.

    Rollback clock: starts 2026-10-31; earliest deletion of the cutover seals, the previous conf copy and the 0.8.0 payload is after 2026-11-07, and only under its own admission. Nothing is deleted. The artifacts are /srv/telemetry/backups/fdev-s7-seal-20261031/, supervisor.d/telemetry-home.conf.before-s7, releases/host-0.8.0/, the J7 backup backups/fdev-vm-j7-20261030, and the host.json.before-* copies in the receiver config directory.

    Coverage limits (recorded, not repaired)

    • Responses that follow a malformed transcript row are skipped until the next user prompt (reader behaviour; the wave-2 checks were aligned to it; comment 6540815895).
    • Attribution to dispatches stays Unknown; usage is measured per response, not per dispatch.
    • Subagent files only for agents that were closed when the plan was frozen (about 02:30Z on 2026-10-31); transcripts created later are not counted and I have not measured how many.
    • The dashboard's unassigned list truncates at 256, so the store count plus the independent recomputation is the completeness evidence, not the dashboard.
    • Capture is manual and bounded; only the drain is unattended.

    Explicit Unknown or unsupported cases

    1. Continuous capture of new Claude sessions: declined ("neither, for now"). Unsupported. No capture timer or separate Claude producer exists. A reader sees a closed-backlog snapshot plus later admitted waves, not complete current coverage.
    2. Live-agent transcripts: deferred. agent-ae22edd78ca3cae8b.jsonl (217 identities) and agent-a374e797ff5df00a9.jsonl (442) were dropped by Root's ruling after the plan's file-change guard stopped the run (comments 6546293739, 6546302631). A later wave, after those agents are closed, needs its own admission. Not started.
    3. The main session 26c49156…: excluded from manual waves; goes with item 1.
    4. Receiver-side expiry of applied receipts, disk-full behaviour (J6, never admitted), off-machine retention and recovery: Unknown (J13).
    5. Natural correction: Unknown (J8 used a labelled synthetic source). Dispatch-id attribution: Unknown (no dispatch run).

    Root-retained, outside this slice

    Installed interruption, Unknown, recovery and correction assertions; complete attribution; off-machine recovery (Home-only); the 439 inherited plus 46 later holds; whole-UTEL acceptance; broader fleet coverage. The parent issue's Done-when stays open for those.

    Deliveries and knowledge

    • Source: recipe PR docs: fdev fresh telemetry enrollment preparation recipe (Refs #4638) #4983 (merged), observer pin PR Pin the org-feed observer to published Host 0.9.0 (Refs #4638) #5006 (merged). Published Host 0.9.0 (tag telemetry-host/v0.9.0, release 429603937) accepted at step 5.
    • Atlas: PR #5129, open for Root's review and merge. Seven new records (nothing superseded), cited at main 494f5205: github/fdev-fresh-enrollment-acceptance-boundary, github/claude-backlog-capture-capacity-and-pacing, github/claude-transcript-capture-coverage-limits, github/telemetry-drain-timer-and-manual-capture-overlap, github/telemetry-host-successor-publication-route, github/telemetry-host-cutover-and-rollback-boundary, github/fdev-telemetry-manual-capture-and-live-transcript-boundary. Atlas gate locally: 496 records, baseline preserved. CI was pending when I posted. Until it merges, the capture gap is this PR.
    • Cleanup: the two worktrees (telemetry-fdev-enroll-4638, detached at an origin/main commit; observer-090, whose squash patch-id equals merge cb2c4e94, remote branch gone, no local changes) were clean and merged, so I removed them and the local observer branch. ~/.local/share/fs-gg-private/enroll-4638/ is kept, including browser.key (the J10 browser principal stays enrolled), the ledgers and the scripts. The Atlas worktree atlas-fdev-telemetry-4638 stays until docs(atlas): capture the fdev telemetry enrollment, Claude backlog capture and Host 0.9.0 adoption lessons (Refs #4638) #5129 lands.

    Refs #4638

  27. EHotwagner commented on Nov 1, 2026

    @EHotwagner
    ContributorAuthor

    Checkpoint before the forward-only work on #4638 (Root decision 2 at #4730 issuecomment-6551301543, relayed by the coordinator). Nothing below has started yet.

    1. Rollback artifacts for the superseded host: delete after a read-only health check (receiver status for both stores, telemetry-home RUNNING on the 0.9.0 path, an authenticated health ready, the drain timer ticking). Exactly these five targets, each listed with its size first and recorded after: /srv/telemetry/backups/fdev-s7-seal-20261031/, /srv/telemetry/supervisor.d/telemetry-home.conf.before-s7, /srv/telemetry/releases/host-0.8.0/, /srv/telemetry/backups/fdev-vm-j7-20261030, and the host.json.before-* copies in /srv/telemetry/config/home-20261003/. Not touched: the live host.json, releases/host-0.9.0/, the live stores, and everything under my private scratch.
    2. Continuous capture: a user timer (fdev-claude-capture.timer, every 5 minutes) with a daily cap, the existing stops and the timer guard. Design choice, stated openly: I am using neither Variant P nor Q but the existing association and capture state. Reason: that state already holds the retired-source cursors from the 11,501-identity backlog, so a transcript that is resumed later (an old agent that continues) is suppressed or resumed correctly. A fresh second state (P or Q) would not know those cursors and would re-emit old identities, which the receiver refuses as an identity conflict. It also needs no receiver change, no second credential copy and no second drain unit; the existing drain timer keeps draining. Cost: it shares the 256-identity and 8-source limits with the one Codex source that is still active, so the selection is capped at 7 files and the retained-response stop stays at 235.
    3. Rules of the timer: forward-only (all current files are baselined as seen; only new and grown files are captured from now on); at most 7 files per run, at most 4 capture-and-drain rounds per run, one batch in flight; a file stays selected until it is read to the end and has been quiet for 900 s, so its slot is released; it waits for the drain service to be idle and the next drain tick to be more than 55 s away; daily cap 300 receipts per UTC day (reaching it skips quietly until the next day; a plain knob in the script, my choice since no number was given); every earlier stop stays a stop and writes a stopped marker that disables later runs until a human clears it. A side effect to note: files that are live now (this session and the running agents) are baselined at their current size, but they keep growing, so their whole content is captured from the start when they next change. That is the approved "includes this main session's growth and live agents' growth", and it is also what drops the two deferred transcripts as separate waves.
    4. Close-out on [UTEL] Complete operational collection and selected receiver adoption #4638 after that: forward scope, what is qualified and what is unsupported or Unknown, and the parts of the Done-when now met. Pull and verify an off-machine copy of the telemetry backup #5043 and Reconcile UTEL historical holds and stale plan items #5044 are already closed as not planned.

    Refs #4638

  28. EHotwagner commented on Nov 1, 2026

    @EHotwagner
    ContributorAuthor

    #4638 forward scope: continuous capture is live, the superseded host's rollback artifacts are deleted, and the Done-when is mapped below. Executed under Root decision 2 at #4730 issuecomment-6551301543 (relayed by the coordinator). No credential was printed; nothing outside the targets below was deleted.

    1. Rollback artifacts deleted (after a read-only health check)

    Health first, with the drain running: telemetry-home RUNNING on the 0.9.0 path; both stores read by the 0.9.0 status (6 and 499 receipts, pending 0); authenticated health ready (HTTP 200) and no-auth 401; the drain timer's last tick exit 0; no reference to host-0.8.0 in the supervisor configuration or host.json. Deleted, with sizes:

    Path (under /srv/telemetry/) Files Bytes
    backups/fdev-s7-seal-20261031/ 4 2,101,248
    releases/host-0.8.0/ 56 17,528,064
    backups/fdev-vm-j7-20261030 5 1,049,235
    supervisor.d/telemetry-home.conf.before-s7 1 689
    config/home-20261003/host.json.before-J10-20261030 1 1,833
    config/home-20261003/host.json.before-fdev-vm-enroll-20261030 1 1,472
    Total 68 20,682,541

    Re-checked afterwards: same health, controls unchanged (utel-home sqlite 13bb564a615dc9f294619fe44e6d2466f2e422646a91e8dda7f633f92053debb, old spool 9ca9c42620405368eccebc4c72511728c4ecf545ec95d55219205fcec7a87f59, host.json cebed70ba545f890db32d5b00a658d2cd9ee0737a014b5949d5d813029eb8050). Left alone: the live host.json, releases/host-0.9.0/, releases/host-0.7.0/, the live stores, the hidden .host.json.before-canonical-tls-20261018T2020Z (Home's, outside the host.json.before-* pattern) and all other backups. My own private scratch is kept, including browser.key.

    2. Continuous capture: live

    • Choice (stated at [UTEL] Complete operational collection and selected receiver adoption #4638 issuecomment-6551361847): neither Variant P nor Q. It uses the existing association and capture state, because that state holds the retired-source cursors from the backlog (a fresh state would re-emit identities the receiver refuses as conflicts), and it needs no receiver change, second credential copy or second drain unit. It shares the 256-identity and 8-source limits with the one Codex source still active.
    • Installed on fdev: ~/.local/libexec/fsgg-claude-capture plus the user units fdev-claude-capture.service and fdev-claude-capture.timer (every 5 minutes; enabled). These are installed state on fdev; they are not in the repository.
    • Rules: forward-only (189 existing transcripts baselined as seen at 00:49Z); only new and grown files; at most 7 files and 4 capture-and-drain rounds per run; one batch in flight; a file stays selected until read to its end and quiet for 900 s; waits for the drain service to be idle and its next tick more than 55 s away; daily cap 300 receipts per UTC day (reaching it skips quietly until the next day; the number is my choice and a plain constant); every earlier stop (rejected receipt, control drift, receiver pending above 8, two .ready files, a drain wait over 6 minutes, retained responses over 235, free disk under 50 GB, new-store sqlite over 500 MB or +100 MB in a day, the three gap names, any other non-zero exit, a forbidden string in a batch) writes STOPPED.json and disables later runs until a person removes it. Six skipped runs in a row stop it too. State and a counts-only log are in ~/.local/share/fs-gg-private/telemetry-claude-capture/.
    • Verified: a supervised first run (1 round) applied a batch; then the timer ran four ticks of four rounds each (one logged 56 s wait for the drain timer, no overlap). Receiver now: receipts 512, Claude facts 11813 with 0 duplicate identities (count equals distinct count), 0 rejected, integrity_check ok, sqlite 27.4 MB. Producer: 8 sources (7 files plus the Codex source, at the engine's limit of 8), 192 retained responses (stop 235), pending 0. Controls unchanged.
    • Side effect, as approved: files that were live at the baseline (this session and the running agents, including the two deferred transcripts) are captured whole from their start as they grow, so they are no longer a separate wave. The backlog waves are dropped.
    • Watch: with several large live files the first day's volume may reach the 300 cap; capture then simply continues the next UTC day. To stop it: systemctl --user disable --now fdev-claude-capture.timer.

    3. Forward scope and the Done-when

    Done-when: "Operational UTEL collection is qualified across the selected producer, receiver/store and delivery paths, with actual dispatch and usage coverage, recovery/correction and explicit unsupported or Unknown cases. Historical effects are reconciled under their original identities; a fresh success does not settle them."

    Element Status
    Producer, receiver/store, delivery paths Met. Fresh enrollment, new store beside the old, unattended drain and capture on timers, retention bounds checked (J0 to J13, steps 1 to 9)
    Usage coverage Met for Claude, forward-only. Host 0.9.0 published, read back and cut over; 11,501 backlog identities exact against an independent recomputation; continuous capture of new and grown transcripts now running
    Dispatch coverage Unsupported. Usage is per response, not attributed to dispatches (no codex-exec dispatch ran; Claude attribution stays Unknown)
    Recovery and correction Partly met, rest explicit Unknown. Backup and copy restore, lost acknowledgement, revocation and a labelled-synthetic correction passed. Natural correction, installed interruption and recovery assertions are Unknown
    Explicit unsupported or Unknown cases Met by this list: dispatch attribution; natural correction; receiver-side expiry of applied receipts; disk-full behaviour (J6, never run); off-machine backup pull (#5043, closed not planned); closed transcripts that predate the baseline (not counted, by the forward-only decision); responses after a malformed transcript row (reader skips them until the next prompt); a stopped timer is not coverage (the marker disables it until cleared)
    Historical effects reconciled under original identities Closed by decision, not by evidence. Root decided the work is forward-only; #5044 (historical reconciliation) and #5043 (off-machine pull) are closed as not planned. The old store, old spool and legacy queue were only read, never changed, and their held effects stay unreleased

    Still needs Home: nothing in this slice's Done-when. The only Home-only item was the off-machine backup pull (#5043), now closed as not planned. Remaining items stay with Root (installed interruption and recovery assertions, whole-UTEL acceptance), none blocked on Home.

    4. Knowledge

    Atlas PR #5151 (open, Root reviews and merges): supersedes the continuous-capture-declined boundary and the rollback-window sentence of the cutover record, and adds github/telemetry-continuous-capture-reuses-existing-state. It also corrects a table error in the description of #5129: six of its seven digests were paired with the wrong records (the archive itself was right).

    Refs #4638

  29. EHotwagner commented on Nov 1, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev acceptance of the Outcome under programme decision 2, forward-only telemetry.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions