FS.GG.Coord.Cli 0.88.0

Prefix Reserved
dotnet tool install --global FS.GG.Coord.Cli --version 0.88.0
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local FS.GG.Coord.Cli --version 0.88.0
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=FS.GG.Coord.Cli&version=0.88.0
                    
nuke :add-package FS.GG.Coord.Cli --version 0.88.0
                    

FS.GG.Coord.Cli — the typed coordination engine

The schedulability model behind fsgg-coord, as one total function.

This is not a user-facing tool. scripts/fsgg-coord is the client you run; this is the engine it shells out to. You will normally never invoke it by hand.

One explicit exception is the optional local telemetry view. An installed tool can run telemetry dashboard status or the foreground telemetry dashboard serve [--no-open] command for the repository selected by its private workspace association. The server uses only packaged .NET assemblies and embedded assets, binds loopback, prints a one-use bootstrap URL, and never activates or migrates a store while opening the dashboard. See the local telemetry store reference.

What it is for

scripts/fsgg-coord was 4,000 lines of bash modelling a concurrent, transactional, budget-constrained domain in a substrate with no types, no Result, no atomicity, and whose default failure mode was to fail open — an error, an empty result, and a legitimate "no" were the same value. The defect record follows from the substrate: "is this item startable?" was computed in five places and agreed in none (#485), and the fail-open family (#266) has 51 children.

ADR-0034 moves that domain to a typed F# core. There is no bool in a verdict:

type Verdict<'a> = Green of 'a | Red of string list | NoVerdict of reason: string

type Schedulability =
    | Startable
    | WrongStatus of BoardStatus        // NoStatus is its own case, not a Backlog
    | IssueClosed                       // the issue outranks the board column
    | NoTouchSet                        // an OMISSION
    | DeliberatelyNoTouchSet            // `Paths: none` — a DECISION. Not the same fact.
    | UnusableTouchSet of tokens: string list
    | BlockedBy of Blocker list         // resolved = CLOSED *or MERGED*
    | HeldBy of WorkerId
    | HeldByLiveWork of WorkerId * pr: int   // the lease lapsed; the WORK did not
    | OverlapsInFlight of (string * string) list
    | Undetermined of reason: string    // "I could not decide." NEVER green, never a silent skip.

It reads nothing

The engine performs no IO. No board, no issues, no network, no token. The client has already paid for the board scan and the claim markers by the time it decides, so it hands that state over on stdin and the engine decides from it:

fsgg-coord-engine decide < snapshot.json      # → a typed verdict per candidate, as JSON
fsgg-coord-engine decide --text < snapshot.json

That is what makes the engine pure and reproducible: the verdict is a total function of the snapshot, so the same board state always decides the same way, and a test can state the answer rather than stand a live fixture up — no second scan of the 5,000 pt/hr budget the whole fleet shares (#418).

It is the client now

scripts/fsgg-coord is the ADR-0034 §4.4 shim (ADR-0040 Phase D): it resolves this compiled engine and execs it, passing argv through unchanged. The ~7,000-line bash implementation, and the shadow that once ran both engines side by side and returned bash's answer, are gone — this engine is the one and only coordination client.

Exit codes

These are the engine's, not the client's — the client translates them.

Code Meaning
0 green — a batch was computed
1 bad arguments, or a malformed snapshot
2 the engine itself broke (a defect, never the caller's fault)
3 red — the batch is refused. A reservation whose touch-set is unmatchable reserves nothing, so scheduling against it would hand a second worker files somebody is standing in.
4 no-verdict — could not reach an answer. Never zero, and never silently a "no".

An unreachable answer is not a negative one. That rule is the whole point.

Telemetry, qualification, and roadmap closure (0.82.0)

The engine owns the deterministic telemetry boundary. telemetry usage collect codex|claude emits the stable runtime-usage CSV (or canonical JSONL), including exact model and coherent tool versions; --append retains one CSV header and ignores an already-recorded response identity. Every completed collection also archives the frozen CSV under the canonical owner-private content-addressed receipt store. telemetry usage archive|resolve exposes idempotent archive and digest-verified retrieval; --receipt-store overrides the default $FSGG_USAGE_RECEIPT_STORE / $XDG_STATE_HOME/fsgg/telemetry/usage host-state root, while temporary and repository roots are refused. telemetry lifecycle export-comments|seal-successor|validate elects GitHub-comment order, seals the SHA-256 chain, and resolves immutable receipts from explicit --usage inputs first and then the canonical store. A repeatable --legacy-proof accepts only the closed, separately-reviewed irrecoverability schema and excludes the missing event from accounting; it never reconstructs a CSV or trusts counts copied from public lifecycle JSON. Optional --history-report receipts remain supported. Extraordinary histories that cannot be repaired under the creating or current tool version use the first-class repeatable --synthetic-checkpoint <proof.json> input. The closed fsgg.telemetry.synthetic-checkpoint/v1 proof binds the canonical repository/issue/run/unit and exact frontier revision/digest to an immutable human issue-comment authorization, explicitly sets missing_provenance_required:false and reconstruct_missing_data:false, and carries only passed functional checks with immutable evidence. Exactly one adjacent synthetic-evidence-checkpoint phase consumes the proof digest and establishes a new trusted anchor; validation remains strict after that anchor and rejects missing, wrong-scope, stale-frontier, reused, ambiguous, tampered, or functionally failing checkpoints. telemetry summarize, telemetry critique validate, and telemetry feedback validate are read-only. telemetry qualification validate|run validates or executes the closed exact-checkout qualification contract. telemetry qualification obligation render|verify emits the existing guarded, current-head fsgg:delivery-obligation(s) grammar or verifies a strict GitHub PR comment readback through the same delivery parser, with URL and comment id agreement; it introduces no second marker authority.

roadmap unit prepare inspect|render|verify requires the raw --roadmap Markdown and --catalog roadmap-index alongside a narrow --input registration request. It authenticates the catalog's source digest and per-unit contract hashes, then compiles the first unchecked row whose immediate predecessor is accepted into a content-addressed authority pin, unit/gate registrations, staged-intake drafts, and evidence obligations. The render/verify pair changes only the selected unit's explicit registration marker block and performs no GitHub write. roadmap unit prepare apply is the explicit mutating arm: it routes every compiled draft through the existing receipt-first intake apply transaction, verifies the authoritative receipt readback, and emits exactly one canonical preparation-application receipt (or writes it with --output); replay reuses the bound issues and never creates duplicates. roadmap unit accept inspect|render|verify checks only that a caller-authored envelope is internally coherent; its verdict is explicitly internally-coherent-candidate and these pure actions cannot construct or print an accepted receipt. roadmap unit accept seal is the sole acceptance boundary. It requires --qualification-input and --qualification-execution, reruns the production qualification, then independently checks pinned fsgg-sdd 1.5.0 analyze/verify/ship in a fresh remote checkout. It re-compiles the plan from the immutable .github roadmap and FS.GG.Coordination catalog and independently re-reads exact intake receipts and board projections, the unedited lifecycle ledger bound to the live winning claim and implementation commit, the typed review chain and exact evidence comment, immutable SDD artifacts, merged PR facts, remote commit trees, and protected main. Only after those observations agree does it emit the atomic, self-digested accepted bundle consumed by roadmap close without schema translation.

roadmap close inspect|render|verify is likewise a pure candidate projection: it consumes an evidence manifest whose relative artifact paths bind an accepted unit receipt, delivery receipt, schema-v3 critique, schema-v2 feedback report and audit, feedback binding, cycle update, and one or more check receipts. Every machine receipt is canonical and self-digested; all unit, head, cycle, report, audit, claim, and check identities are joined before rendering. render prints only a candidate document and never confers acceptance. verify additionally requires --source-roadmap, authenticates its --source-digest, and proves that the candidate changed no bytes outside the marked unit block.

Version 0.81.0 established the publish-before-adopt boundary. Current callers and cycle-ledger provider validation use these compiled commands directly; the frozen Python differential corpus remains an independent test oracle, while no Python compatibility helper is packaged or invoked at runtime.

License

MIT

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
0.88.0 117 9/10/2026
0.87.0 182 9/8/2026
0.86.1 108 9/7/2026
0.86.0 107 9/7/2026
0.85.2 114 9/6/2026
0.85.1 107 9/6/2026
0.85.0 111 9/6/2026
0.84.0 105 9/6/2026
0.83.5 106 9/6/2026
0.83.4 105 9/6/2026
0.83.3 104 9/5/2026
0.83.2 103 9/5/2026
0.83.1 109 9/5/2026
0.83.0 106 9/5/2026
0.82.0 105 9/5/2026
0.81.1 112 9/5/2026
0.81.0 98 9/4/2026
0.80.1 108 9/4/2026
0.80.0 98 9/4/2026
0.79.0 100 9/3/2026
Loading failed

0.88.0 — add explicit standalone workspace telemetry association, local/HTTPS destinations, prospective cutover, and advisory workflow capture on qualified Linux x64.

FS.GG.Coord.Cli adds durable local-store commands, repository-owned Codex root/child lifecycle
observation, admitted exact-head CI reconciliation, native delivery outcomes, and machine-derived
whole-item population and budget inputs. The collector is future-only and advisory: missing telemetry
stays visible without changing native execution or delivery. FS.GG.Kit and FS.GG.Drivers advance with
the coherent set.

STANDING ADVISORIES — these are NOT this release's notes, and they do not age out.

Two published FS.GG.Coord.Cli versions must never be adopted. Their own listings are immutable and
cannot be corrected, so the NEWEST listing is the only channel that can say so — and an unpinned
`dotnet tool install` resolves the newest version, which makes this the entry a consumer reads.
They live in their own MSBuild property (`FsggStandingAdvisories`) rather than inside the release
narrative below, so that trimming the narrative and deleting a warning are different edits
(.github#2579). `scripts/check-engine-release-notes.py` refuses a listing that stops referencing
this property or empties it; 4fccc76d deleted these warnings once while that gate was green.

DO NOT ADOPT 0.50.1. It is a permanent two-of-three set. The 0.50.1 cut published `FS.GG.Kit` and
`FS.GG.Drivers` to both feeds and was then REFUSED for this package by `check-engine-release-notes`
(`.github#1762`), which correctly flagged that the release notes still began with `0.50.0`. Both
sibling packages were already immutable at 0.50.1 and `.github#1772`'s sibling-tag precondition
requires all three tags to name the SAME commit, so 0.50.1 could not be completed from a corrected
tree. `FS.GG.Kit 0.50.1` and `FS.GG.Drivers 0.50.1` should not be adopted on their own; adopt
0.50.2, which is the whole set cut from one commit.

DO NOT ADOPT 0.50.5. It is a permanent two-of-three set, the same shape and the same cause as
0.50.1. `FS.GG.Kit 0.50.5` and `FS.GG.Drivers 0.50.5` published to both feeds; this package's
publish was then REFUSED by `check-engine-release-notes` because the notes still began with
`0.50.4` while `Version` had moved to `0.50.5`. Correcting that needs a new commit, and the
sibling-tag precondition requires all three tags at the SAME commit, so 0.50.5 could not be
finished from a corrected tree — re-cutting it is the re-pack divergence `.github#2240` documents.
Adopt 0.50.6.

DO NOT ADOPT 0.52.0. It is a different permanent partial set: `FS.GG.Kit` and `FS.GG.Drivers`
published to both feeds, and `FS.GG.Coord.Cli` published to the org feed before nuget.org rejected
its 37,279-character `PackageReleaseNotes`. NuGet versions are immutable and re-packing corrected
bytes under 0.52.0 would make the same version identify different artifacts. Adopt 0.53.0, the next
coherent set cut from corrected source. All three partial sets are recorded in
`registry/dependencies.yml`.

FULL PER-VERSION HISTORY IS SERVED BY THE REGISTRY, NOT REPEATED HERE (`.github#2579`). Every
published version's own notes remain readable, permanently, on that version's own listing at
FS.GG.Coord.Cli — and each cut's evidence is recorded in
`registry/dependencies.yml` and `registry/CHANGELOG.md` at https://github.com/FS-GG/.github.

The release notes remain bounded: previous-version history stays on the registry listings and only
the standing safety advisories carry forward.