From 0ed78cacedba8ed297c8ec16ba430ac6dfc491d4 Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Thu, 22 Oct 2026 06:19:40 +0200 Subject: [PATCH 1/9] Capture Claude Code transcript usage through the existing telemetry path Refs #4801 Co-Authored-By: Claude Opus 5.5 --- src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fs | 33 +- src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fsi | 9 + src/FS.GG.Coord.Cli/SkillTelemetryReaders.fs | 127 ++++- src/FS.GG.Coord.Cli/SkillTelemetryReaders.fsi | 25 +- src/FS.GG.Coord.Cli/TelemetryApplication.fs | 37 +- src/FS.GG.Coord.Core/Telemetry.fs | 514 +++++++++++++++++- src/FS.GG.Coord.Core/Telemetry.fsi | 56 ++ src/FS.GG.Coord.Core/TelemetryStore.fs | 12 +- .../TelemetryCliTests.fs | 60 ++ .../WorkspaceTelemetryApplicationTests.fs | 199 +++++++ .../TelemetryStoreTests.fs | 14 + .../FS.GG.Coord.Core.Tests/TelemetryTests.fs | 225 ++++++++ 12 files changed, 1274 insertions(+), 37 deletions(-) diff --git a/src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fs b/src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fs index 48c391287..83f550478 100644 --- a/src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fs +++ b/src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fs @@ -1118,12 +1118,17 @@ module SkillTelemetryAdapter = Generation = requiredString "generation" value Offset = value["offset"].GetValue() AnchorDigest = requiredString "anchorDigest" value - SkippingOversized = boolValue "skippingOversized" value } + SkippingOversized = boolValue "skippingOversized" value + Context = if isNull value["context"] then None else Some(value["context"].GetValue()) } let private cursorNode (cursor: PassiveCursor) = - jsonObject [ "sourceInstance", node cursor.SourceInstance; "generation", node cursor.Generation - "offset", node cursor.Offset; "anchorDigest", node cursor.AnchorDigest - "skippingOversized", node cursor.SkippingOversized ] + let value = + jsonObject [ "sourceInstance", node cursor.SourceInstance; "generation", node cursor.Generation + "offset", node cursor.Offset; "anchorDigest", node cursor.AnchorDigest + "skippingOversized", node cursor.SkippingOversized ] + // Only a Claude transcript carries prompt context; Codex cursor bytes are unchanged. + cursor.Context |> Option.iter (fun context -> value["context"] <- node context) + value let private passiveGap (state: JsonObject) (code: string) = // One reserved bounded status slot; original distinct reasons survive subsequent passes. @@ -1135,7 +1140,7 @@ module SkillTelemetryAdapter = let optional value = value |> Option.map node |> Option.defaultValue nullNode let counts = record.Usage jsonObject [ "kind", node "provider-usage-observation/1" - "identity", node (NativeUsage.passiveIdentity record.ThreadId record.TurnId record.ResponseId) + "identity", node (NativeUsage.passiveRecordIdentity record) "itemId", nullNode; "revision", node revision "threadId", node (record.ThreadId.ToString("D")); "turnId", node (record.TurnId.ToString("D")) "responseId", node record.ResponseId @@ -1145,7 +1150,7 @@ module SkillTelemetryAdapter = "sourceInstance", node cursor.SourceInstance; "sourceGeneration", node cursor.Generation "sourceDigest", node record.SourceDigest; "position", node record.Position "capturedAt", node capturedAt; "occurredAt", optional record.OccurredAt - "provenance", node "codex-local-rollout/1"; "populationCoverage", node "partial" + "provenance", node record.Provenance; "populationCoverage", node "partial" "inventoryCoverage", node "unknown"; "terminalCoverage", node "unknown"; "attributionCoverage", node "unknown" ] let private passiveSnapshot (state: JsonObject) = @@ -1193,7 +1198,7 @@ module SkillTelemetryAdapter = // One bounded pass over explicit sources. The production caller always supplies its selected association root. // Same-owner state cloning/reinitialization/root migration requires original-state/fence reconciliation; // undeclared clones cannot be detected offline and are outside this supported first profile. - let capturePassiveWithHook (root: string) (owner: string) (sourceIdentity: string) (codexHome: string) (paths: string list) (enqueue: byte array -> Result) (hook: string -> unit) = + let capturePassiveFromWithHook (root: string) (owner: string) (sourceIdentity: string) (sourceRoot: PassiveSourceRoot) (paths: string list) (enqueue: byte array -> Result) (hook: string -> unit) = try if paths.IsEmpty || paths.Length > NativeUsage.PassiveMaximumFiles || (paths |> List.exists (Path.IsPathFullyQualified >> not)) @@ -1240,7 +1245,7 @@ module SkillTelemetryAdapter = if not (sources.ContainsKey key) && sources.Count >= NativeUsage.PassiveMaximumFiles then passiveGap state "source-index-full-capture-deferred" else - match NativeUsage.scanPassive codexHome path (passiveCursor sources[key]) budget (24 - events.Count) with + match NativeUsage.scanPassiveFrom sourceRoot path (passiveCursor sources[key]) budget (24 - events.Count) with | Error _ -> passiveGap state "source-unavailable-cursor-retained" | Ok scan -> budget <- budget - scan.ScannedBytes @@ -1248,12 +1253,12 @@ module SkillTelemetryAdapter = // Reserve all new response identities before advancing any source cursor. let fresh = scan.Records - |> List.map (fun row -> NativeUsage.passiveIdentity row.ThreadId row.TurnId row.ResponseId) + |> List.map (fun row -> NativeUsage.passiveRecordIdentity row) |> List.distinct |> List.filter (responses.ContainsKey >> not) let crossesCorrection = scan.Records |> List.exists (fun row -> - let identity = NativeUsage.passiveIdentity row.ThreadId row.TurnId row.ResponseId + let identity = NativeUsage.passiveRecordIdentity row (events |> Seq.exists (fun fact -> fact["identity"].GetValue() = identity)) && (responses[identity]["digest"]).GetValue() <> row.SourceDigest) if responses.Count + fresh.Length > maximumPassiveIdentities then @@ -1263,7 +1268,7 @@ module SkillTelemetryAdapter = passiveGap state "response-correction-boundary-deferred" else for record in scan.Records do - let identity = NativeUsage.passiveIdentity record.ThreadId record.TurnId record.ResponseId + let identity = NativeUsage.passiveRecordIdentity record let prior = responses[identity] let unchanged = not (isNull prior) && prior["digest"].GetValue() = record.SourceDigest if not unchanged then @@ -1310,6 +1315,12 @@ module SkillTelemetryAdapter = | AdapterError message -> result 1 "" $"fsgg passive telemetry: {message}\n" | _ -> result 1 "" "fsgg passive telemetry: local capture outcome uncertain; inspect retained intent and state\n" + let capturePassiveWithHook root owner sourceIdentity codexHome paths enqueue hook = + capturePassiveFromWithHook root owner sourceIdentity (CodexHome codexHome) paths enqueue hook + + let capturePassiveFrom root owner sourceIdentity sourceRoot paths enqueue = + capturePassiveFromWithHook root owner sourceIdentity sourceRoot paths enqueue ignore + let capturePassive root owner sourceIdentity codexHome paths enqueue = capturePassiveWithHook root owner sourceIdentity codexHome paths enqueue ignore diff --git a/src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fsi b/src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fsi index edfdf68b0..5b04b7bc9 100644 --- a/src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fsi +++ b/src/FS.GG.Coord.Cli/SkillTelemetryAdapter.fsi @@ -35,6 +35,15 @@ module SkillTelemetryAdapter = root: string -> owner: string -> sourceIdentity: string -> codexHome: string -> paths: string list -> enqueue: (byte array -> Result) -> hook: (string -> unit) -> CommandResult + /// Bounded partial local usage from explicit files below one selected Codex or Claude Code root. + val capturePassiveFrom: + root: string -> owner: string -> sourceIdentity: string -> sourceRoot: SkillTelemetryReaders.PassiveSourceRoot -> + paths: string list -> enqueue: (byte array -> Result) -> CommandResult + + val capturePassiveFromWithHook: + root: string -> owner: string -> sourceIdentity: string -> sourceRoot: SkillTelemetryReaders.PassiveSourceRoot -> + paths: string list -> enqueue: (byte array -> Result) -> hook: (string -> unit) -> CommandResult + val reportPassive: root: string -> owner: string -> sourceIdentity: string -> CommandResult val run: SkillTelemetryReaders.HostConfig option -> TelemetryCommand -> CommandResult diff --git a/src/FS.GG.Coord.Cli/SkillTelemetryReaders.fs b/src/FS.GG.Coord.Cli/SkillTelemetryReaders.fs index a7a7f34c7..a041484c4 100644 --- a/src/FS.GG.Coord.Cli/SkillTelemetryReaders.fs +++ b/src/FS.GG.Coord.Cli/SkillTelemetryReaders.fs @@ -107,14 +107,20 @@ module SkillTelemetryReaders = Effort: string option OccurredAt: string option SourceDigest: string - Position: int64 } + Position: int64 + Provenance: string } type PassiveCursor = { SourceInstance: string Generation: string Offset: int64 AnchorDigest: string - SkippingOversized: bool } + SkippingOversized: bool + Context: string option } + + type PassiveSourceRoot = + | CodexHome of string + | ClaudeHome of string type PassiveScan = { Records: PassiveNativeRecord list @@ -1250,9 +1256,10 @@ module SkillTelemetryReaders = [] extern int Close(int descriptor) - let private openRollout codexHome path = + // Opens one regular file below a selected private root without following any link. + let private openUnder (selectedRoot: string) path = try - let sessions = Path.GetFullPath(Path.Combine(codexHome, "sessions")) + let sessions = Path.GetFullPath selectedRoot let source = Path.GetFullPath path let relative = Path.GetRelativePath(sessions, source) @@ -1366,6 +1373,9 @@ module SkillTelemetryReaders = with _ -> failure "native usage rollout is unavailable or outside the private host" + let private openRollout codexHome path = + openUnder (Path.Combine(codexHome, "sessions")) path + [] let PassiveMaximumFiles = 8 [] @@ -1373,19 +1383,66 @@ module SkillTelemetryReaders = [] let PassiveMaximumObservations = 64 + [] + let CodexPassiveProvenance = "codex-local-rollout/1" + [] + let ClaudePassiveProvenance = "claude-local-transcript/1" + let passiveIdentity (thread: Guid) (turn: Guid) (response: string) = "passive-" + sha256(Encoding.UTF8.GetBytes("codex-rollout/1\u001f" + thread.ToString("D") + "\u001f" + turn.ToString("D") + "\u001f" + response)) + let passiveClaudeIdentity (thread: Guid) (turn: Guid) (response: string) = + "passive-" + sha256(Encoding.UTF8.GetBytes("claude-transcript/1\u001f" + thread.ToString("D") + "\u001f" + turn.ToString("D") + "\u001f" + response)) + + let passiveRecordIdentity (record: PassiveNativeRecord) = + if record.Provenance = ClaudePassiveProvenance then passiveClaudeIdentity record.ThreadId record.TurnId record.ResponseId + else passiveIdentity record.ThreadId record.TurnId record.ResponseId + + let private passiveTimestamp (text: string) = + if not (Regex.IsMatch(text, "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]+)?(?:Z|[+-][0-9]{2}:[0-9]{2})$")) then None + else + match DateTimeOffset.TryParse(text, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind) with + | true, parsed -> Some(parsed.ToUniversalTime().ToString("O")) + | _ -> None + + // One completed Claude response as an allowlisted projection. Its digest deliberately excludes the per-block + // record timestamp, so a repeated identical record is the same observation rather than a correction. + let private claudeRecord (record: FS.GG.Coord.RuntimeUsage.ClaudeTranscript.Response) (usage: FS.GG.Coord.RuntimeUsage.ClaudeTranscript.Usage) (turn: string) (position: int64) = + let add (left: int64) (right: int64) = if left > Int64.MaxValue - right then None else Some(left + right) + match add usage.Uncached usage.CacheRead |> Option.bind (add usage.CacheCreation) with + | None -> None + | Some input -> + match add input usage.Output with + | None -> None + | Some total -> + let thread, turnId = Guid.ParseExact(record.ThreadId, "D"), Guid.ParseExact(turn, "D") + let normalized = + JsonSerializer.SerializeToUtf8Bytes + {| threadId = thread; turnId = turnId; responseId = record.MessageId; requestId = record.RequestId + input = input; cachedInput = usage.CacheRead; cacheWriteInput = usage.CacheCreation + output = usage.Output; reasoning = usage.Thinking |> Option.toNullable; total = total + provider = "Anthropic"; model = record.Model; effort = record.Effort |> Option.toObj |} + Some { ThreadId = thread; TurnId = turnId; ResponseId = record.MessageId + Usage = { Input = Some input; CachedInput = Some usage.CacheRead; CacheWriteInput = Some usage.CacheCreation + Output = Some usage.Output; Reasoning = usage.Thinking; Total = Some total } + Provider = Some "Anthropic"; Model = Some record.Model; Effort = record.Effort + OccurredAt = passiveTimestamp record.Timestamp; SourceDigest = sha256 normalized + Position = position; Provenance = ClaudePassiveProvenance } + // Reads only selected files through the same no-follow opener as complete native accounting. // The inode/device identity comes from the opened descriptor, never the pathname's metadata. - let scanPassive (codexHome: string) (path: string) (prior: PassiveCursor option) (maximumBytes: int) (maximumRecords: int) : Result = + let scanPassiveFrom (sourceRoot: PassiveSourceRoot) (path: string) (prior: PassiveCursor option) (maximumBytes: int) (maximumRecords: int) : Result = if maximumBytes < 16384 || maximumBytes > PassiveMaximumScanBytes || maximumRecords < 1 || maximumRecords > PassiveMaximumObservations then failure "passive native scan bounds are invalid" elif not (OperatingSystem.IsLinux() && RuntimeInformation.ProcessArchitecture = Architecture.X64) then failure "passive source identity is unsupported on this platform" else - match openRollout codexHome path with + let opened, instanceLabel = + match sourceRoot with + | CodexHome codexHome -> openRollout codexHome path, "codex-file/1" + | ClaudeHome claudeHome -> openUnder (Path.Combine(claudeHome, "projects")) path, "claude-file/1" + match opened with | Error error -> Error error | Ok opened -> use source = opened @@ -1394,7 +1451,7 @@ module SkillTelemetryReaders = let mutable stat = Unchecked.defaultof if NativeFile.fstat(file.SafeFileHandle.DangerousGetHandle().ToInt32(), &stat) <> 0 || (stat.Mode &&& 0xF000u) <> 0x8000u then invalidOp "passive source is not a regular file" - let instance = sha256(Encoding.UTF8.GetBytes($"codex-file/1:{stat.Device}:{stat.Inode}")) + let instance = sha256(Encoding.UTF8.GetBytes($"{instanceLabel}:{stat.Device}:{stat.Inode}")) let mutable scanned = 0 let anchor (offset: int64) = use retained = new MemoryStream() @@ -1411,18 +1468,22 @@ module SkillTelemetryReaders = | Some cursor when cursor.SourceInstance = instance && cursor.Offset >= 0L && cursor.Offset <= source.Length -> anchor cursor.Offset = cursor.AnchorDigest | _ -> false - let generation, initialOffset, initialSkip = + // A Claude response's turn is the nearest preceding prompt identity; the cursor retains it so + // resumed passes attribute exactly as a full read would. Unknown context withholds the turn. + let generation, initialOffset, initialSkip, initialContext = match prior with - | Some cursor when continuous -> cursor.Generation, cursor.Offset, cursor.SkippingOversized + | Some cursor when continuous -> cursor.Generation, cursor.Offset, cursor.SkippingOversized, cursor.Context | Some _ -> diagnostics.Add "source-continuity-gap" |> ignore - Guid.NewGuid().ToString("N"), 0L, false + Guid.NewGuid().ToString("N"), 0L, false, None | None -> diagnostics.Add "source-population-unknown" |> ignore - Guid.NewGuid().ToString("N"), 0L, false + Guid.NewGuid().ToString("N"), 0L, false, None source.Position <- initialOffset let records = ResizeArray() let identities = HashSet(StringComparer.Ordinal) + let claudeDigests = Dictionary(StringComparer.Ordinal) + let mutable context = initialContext use line = new MemoryStream() let buffer = Array.zeroCreate 8192 let mutable position, committed, lineStart = initialOffset, initialOffset, initialOffset @@ -1443,12 +1504,45 @@ module SkillTelemetryReaders = if not skipping then if line.Length >= int64 maximumLineBytes then skipping <- true + // A skipped line may be a prompt; its successors' turn becomes unknown. + context <- None line.SetLength 0L diagnostics.Add "oversized-line-skipped" |> ignore else line.WriteByte value if value = byte '\n' then if not skipping then - let bytes = line.ToArray() + let bytes = line.ToArray() + match sourceRoot with + | ClaudeHome _ -> + let mutable length = bytes.Length + if length > 0 && bytes[length - 1] = byte '\n' then length <- length - 1 + if length > 0 && bytes[length - 1] = byte '\r' then length <- length - 1 + match (if length = 0 then Ok FS.GG.Coord.RuntimeUsage.ClaudeTranscript.Other + else FS.GG.Coord.RuntimeUsage.ClaudeTranscript.decodeLine bytes[.. length - 1]) with + | Error _ -> + diagnostics.Add "malformed-row-skipped" |> ignore + context <- None + | Ok(FS.GG.Coord.RuntimeUsage.ClaudeTranscript.Prompt prompt) -> context <- Some prompt + | Ok FS.GG.Coord.RuntimeUsage.ClaudeTranscript.Other -> () + | Ok(FS.GG.Coord.RuntimeUsage.ClaudeTranscript.Assistant response) -> + match response.Usage, context with + | None, _ -> () // An incomplete streaming record never becomes an observation. + | Some _, None -> diagnostics.Add "turn-identity-unavailable" |> ignore + | Some usage, Some turn -> + match claudeRecord response usage turn lineStart with + | None -> diagnostics.Add "malformed-row-skipped" |> ignore + | Some record -> + let identity = passiveRecordIdentity record + match claudeDigests.TryGetValue identity with + | true, digest when digest = record.SourceDigest -> () + | true, _ -> + // Never collapse a correction before its prior revision has an intent. + doneReading <- true + diagnostics.Add "response-boundary-deferred" |> ignore + | false, _ -> + claudeDigests[identity] <- record.SourceDigest + records.Add record + | CodexHome _ -> match decodeUsageRecord bytes with | Error _ -> diagnostics.Add "malformed-row-skipped" |> ignore | Ok None -> () @@ -1477,7 +1571,8 @@ module SkillTelemetryReaders = if identities.Add(passiveIdentity thread turn response) then records.Add { ThreadId = thread; TurnId = turn; ResponseId = response; Usage = usage Provider = profile "provider"; Model = profile "model"; Effort = profile "effort" - OccurredAt = occurred; SourceDigest = sha256 normalized; Position = lineStart } + OccurredAt = occurred; SourceDigest = sha256 normalized; Position = lineStart + Provenance = CodexPassiveProvenance } else // Never collapse a correction before its prior revision has an intent. doneReading <- true @@ -1495,11 +1590,15 @@ module SkillTelemetryReaders = if not doneReading && records.Count < maximumRecords then diagnostics.Add "scan-pass-budget" |> ignore let finalAnchor = anchor committed Ok { Records = records |> Seq.toList - Cursor = { SourceInstance = instance; Generation = generation; Offset = committed; AnchorDigest = finalAnchor; SkippingOversized = skipping } + Cursor = { SourceInstance = instance; Generation = generation; Offset = committed; AnchorDigest = finalAnchor + SkippingOversized = skipping; Context = context } ScannedBytes = scanned Diagnostics = diagnostics |> Seq.sort |> Seq.toList } with _ -> failure "passive native source read failed; cursor retained" + let scanPassive (codexHome: string) (path: string) (prior: PassiveCursor option) (maximumBytes: int) (maximumRecords: int) = + scanPassiveFrom (CodexHome codexHome) path prior maximumBytes maximumRecords + type private UsageRecord = { Response: string diff --git a/src/FS.GG.Coord.Cli/SkillTelemetryReaders.fsi b/src/FS.GG.Coord.Cli/SkillTelemetryReaders.fsi index 0b4ac7d73..3f8f91576 100644 --- a/src/FS.GG.Coord.Cli/SkillTelemetryReaders.fsi +++ b/src/FS.GG.Coord.Cli/SkillTelemetryReaders.fsi @@ -86,14 +86,25 @@ module SkillTelemetryReaders = Effort: string option OccurredAt: string option SourceDigest: string - Position: int64 } + Position: int64 + /// codex-local-rollout/1 or claude-local-transcript/1; selects the native identity namespace. + Provenance: string } type PassiveCursor = { SourceInstance: string Generation: string Offset: int64 AnchorDigest: string - SkippingOversized: bool } + SkippingOversized: bool + /// Claude prompt identity in force at Offset; None when unknown or for Codex rollouts. + Context: string option } + + /// The explicitly selected private root that a passive source file must lie below. + type PassiveSourceRoot = + /// Codex home; sources lie below its sessions directory. + | CodexHome of string + /// Claude Code configuration home; sources lie below its projects directory. + | ClaudeHome of string type PassiveScan = { Records: PassiveNativeRecord list @@ -158,7 +169,17 @@ module SkillTelemetryReaders = [] val PassiveMaximumObservations: int = 64 + [] + val CodexPassiveProvenance: string = "codex-local-rollout/1" + [] + val ClaudePassiveProvenance: string = "claude-local-transcript/1" + val passiveIdentity: thread: Guid -> turn: Guid -> response: string -> string + val passiveClaudeIdentity: thread: Guid -> turn: Guid -> response: string -> string + val passiveRecordIdentity: record: PassiveNativeRecord -> string + val scanPassiveFrom: + sourceRoot: PassiveSourceRoot -> path: string -> prior: PassiveCursor option -> maximumBytes: int -> maximumRecords: int -> + Result val scanPassive: codexHome: string -> path: string -> prior: PassiveCursor option -> maximumBytes: int -> maximumRecords: int -> Result diff --git a/src/FS.GG.Coord.Cli/TelemetryApplication.fs b/src/FS.GG.Coord.Cli/TelemetryApplication.fs index ac44236d2..32eca0b35 100644 --- a/src/FS.GG.Coord.Cli/TelemetryApplication.fs +++ b/src/FS.GG.Coord.Cli/TelemetryApplication.fs @@ -369,9 +369,26 @@ module TelemetryApplication = contracts (read path) | "claude" -> - match required "--snapshot" args with - | Error reason -> Error [ reason ] - | Ok path -> RuntimeUsage.collectClaude task coordination sdd contracts (read path) + match option "--session-file" args, option "--snapshot" args with + | Some _, Some _ -> Error [ "--session-file and --snapshot are mutually exclusive" ] + | Some path, None when + FileInfo(path).Length > int64 RuntimeUsage.ClaudeTranscript.MaximumFileBytes + -> + Error [ "Claude transcript exceeds its 128 MiB bound; totals withheld" ] + | Some path, None -> + // Claude Code transcript JSONL, collected with the Codex selection contract. + RuntimeUsage.collectClaudeTranscript + task + (option "--turn-id" args) + (has "--all-responses" args) + (option "--since" args) + (option "--until" args) + coordination + sdd + contracts + (read path) + | None, Some path -> RuntimeUsage.collectClaude task coordination sdd contracts (read path) + | None, None -> Error [ "--session-file or --snapshot is required" ] | _ -> Error [ "runtime must be codex or claude" ] match result with @@ -1077,13 +1094,21 @@ module TelemetryApplication = use document = JsonDocument.Parse bytes let selection = document.RootElement let fields = selection.EnumerateObject() |> Seq.map _.Name |> Seq.toList - if fields.Length <> 3 || Set.ofList fields <> Set.ofList [ "schema"; "codexHome"; "sources" ] + // Exactly one selected private root: a Codex home or a Claude Code configuration home. + let homeField = + if Set.ofList fields = Set.ofList [ "schema"; "codexHome"; "sources" ] then "codexHome" + elif Set.ofList fields = Set.ofList [ "schema"; "claudeHome"; "sources" ] then "claudeHome" + else invalidOp "passive source selection has an unsupported shape" + if fields.Length <> 3 || selection.GetProperty("schema").GetString() <> "fsgg.telemetry.passive-selection/1" then invalidOp "passive source selection has an unsupported shape" - let home = selection.GetProperty("codexHome").GetString() + let home = selection.GetProperty(homeField).GetString() if not (Path.IsPathFullyQualified home) then invalidOp "passive source root must be absolute" + let sourceRoot = + if homeField = "claudeHome" then SkillTelemetryReaders.ClaudeHome home + else SkillTelemetryReaders.CodexHome home let paths = selection.GetProperty("sources").EnumerateArray() |> Seq.map _.GetString() |> Seq.toList - SkillTelemetryAdapter.capturePassive root owner scope.Stream home paths + SkillTelemetryAdapter.capturePassiveFrom root owner scope.Stream sourceRoot paths (WorkspaceTelemetryApplication.tryEnqueueBound config (Some repository) (Some scope.Producer) (Some binding)) with _ -> { SkillTelemetryAdapter.CommandResult.ExitCode = 1; Stdout = Array.empty diff --git a/src/FS.GG.Coord.Core/Telemetry.fs b/src/FS.GG.Coord.Core/Telemetry.fs index 9f2b4689f..63b71ea7b 100644 --- a/src/FS.GG.Coord.Core/Telemetry.fs +++ b/src/FS.GG.Coord.Core/Telemetry.fs @@ -100,6 +100,268 @@ module RuntimeUsage = SourceDigest: string } + // Claude Code writes one transcript JSONL per session (`~/.claude/projects//.jsonl`) and, + // on observed hosts, one per subagent beside it. The decoder is shared by the strict CLI collector and the + // passive scanner. It returns only allowlisted identities and counters; transcript bodies are never retained. + module ClaudeTranscript = + [] + let MaximumFileBytes = 134217728 + + [] + let MaximumLineBytes = 4194304 + + type Usage = + { + Uncached: int64 + CacheRead: int64 + CacheCreation: int64 + Output: int64 + Thinking: int64 option + } + + type Response = + { + MessageId: string + RequestId: string + SessionId: string + ThreadId: string + Sidechain: bool + AgentId: string option + Model: string + Effort: string option + Timestamp: string + RuntimeVersion: string option + Usage: Usage option + } + + type Line = + | Prompt of promptId: string + | Assistant of Response + | Other + + let private identityPattern = + Regex("^[A-Za-z0-9_-]{1,200}$", RegexOptions.CultureInvariant) + + let private agentPattern = + Regex("^[A-Za-z0-9_-]{1,128}$", RegexOptions.CultureInvariant) + + let private timestampPattern = + Regex( + "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]+)?(?:Z|[+-][0-9]{2}:[0-9]{2})$", + RegexOptions.CultureInvariant + ) + + let private options = + JsonDocumentOptions(CommentHandling = JsonCommentHandling.Disallow, AllowTrailingCommas = false) + + let rec private rejectDuplicates (value: JsonElement) = + match value.ValueKind with + | JsonValueKind.Object -> + let names = Collections.Generic.HashSet(StringComparer.Ordinal) + + for property in value.EnumerateObject() do + if not (names.Add property.Name) then + invalidOp "transcript record has a duplicate property" + + rejectDuplicates property.Value + | JsonValueKind.Array -> + for item in value.EnumerateArray() do + rejectDuplicates item + | _ -> () + + let private property (name: string) (node: JsonElement) = + match node.TryGetProperty name with + | true, value -> Some value + | _ -> None + + let private profileText (label: string) (value: string) = + if + String.IsNullOrWhiteSpace value + || value.Length > 200 + || (value |> Seq.exists Char.IsControl) + then + invalidOp $"%s{label} must be a bounded non-empty string" + + value + + let private requiredString (label: string) (name: string) (node: JsonElement) = + match property name node with + | Some value when value.ValueKind = JsonValueKind.String -> profileText $"%s{label}.%s{name}" (value.GetString()) + | _ -> invalidOp $"%s{label}.%s{name} must be a non-empty string" + + let private optionalString (label: string) (name: string) (node: JsonElement) = + match property name node with + | None -> None + | Some value when value.ValueKind = JsonValueKind.Null -> None + | Some value when value.ValueKind = JsonValueKind.String -> + Some(profileText $"%s{label}.%s{name}" (value.GetString())) + | Some _ -> invalidOp $"%s{label}.%s{name} must be a string when present" + + let private guid (label: string) (value: string) = + match Guid.TryParseExact(value, "D") with + | true, parsed when parsed <> Guid.Empty && parsed.ToString("D") = value -> value + | _ -> invalidOp $"%s{label} must be a canonical lowercase UUID" + + let private count (label: string) (name: string) (node: JsonElement) = + match property name node with + | Some value when value.ValueKind = JsonValueKind.Number -> + match value.TryGetInt64() with + | true, number when number >= 0L -> number + | _ -> invalidOp $"%s{label}.%s{name} must be a non-negative integer" + | _ -> invalidOp $"%s{label}.%s{name} must be a non-negative integer" + + let subagentThreadId (sessionId: string) (agentId: string) = + // A deterministic RFC 9562 version-8 name-based identity: stable across hosts and passes, and never + // equal to the main thread's session identity. + let digest = + SHA256.HashData(Encoding.UTF8.GetBytes("claude-subagent-thread/1\u001f" + sessionId + "\u001f" + agentId)) + + let bytes = digest[..15] + bytes[6] <- (bytes[6] &&& 0x0Fuy) ||| 0x80uy + bytes[8] <- (bytes[8] &&& 0x3Fuy) ||| 0x80uy + let hex = Convert.ToHexString(bytes).ToLowerInvariant() + $"%s{hex[0..7]}-%s{hex[8..11]}-%s{hex[12..15]}-%s{hex[16..19]}-%s{hex[20..31]}" + + let private usage (node: JsonElement) = + if node.ValueKind <> JsonValueKind.Object then + invalidOp "message.usage must be an object on a completed response" + + let thinking = + match property "output_tokens_details" node with + | None -> None + | Some details when details.ValueKind = JsonValueKind.Null -> None + | Some details when details.ValueKind = JsonValueKind.Object -> + match property "thinking_tokens" details with + | None -> None + | Some value when value.ValueKind = JsonValueKind.Null -> None + | Some _ -> Some(count "message.usage.output_tokens_details" "thinking_tokens" details) + | Some _ -> invalidOp "message.usage.output_tokens_details must be an object when present" + + let output = count "message.usage" "output_tokens" node + + if thinking |> Option.exists (fun value -> value > output) then + invalidOp "message.usage thinking_tokens exceeds output_tokens" + + { + Uncached = count "message.usage" "input_tokens" node + CacheRead = count "message.usage" "cache_read_input_tokens" node + CacheCreation = count "message.usage" "cache_creation_input_tokens" node + Output = output + Thinking = thinking + } + + let decodeLine (line: byte array) : Result = + try + if line.Length > MaximumLineBytes then + invalidOp "transcript line exceeds its bound" + + // Strict UTF-8, no comments or trailing commas, and recursive duplicate-property refusal. + let text = UTF8Encoding(false, true).GetString line + use document = JsonDocument.Parse(text, options) + let root = document.RootElement + + if root.ValueKind <> JsonValueKind.Object then + invalidOp "transcript record must be an object" + + rejectDuplicates root + + match property "type" root with + | Some kind when kind.ValueKind = JsonValueKind.String && kind.GetString() = "user" -> + match property "promptId" root with + | None -> Ok Other + | Some value when value.ValueKind = JsonValueKind.String -> + Ok(Prompt(guid "promptId" (value.GetString()))) + | Some _ -> invalidOp "promptId must be a string" + | Some kind when kind.ValueKind = JsonValueKind.String && kind.GetString() = "assistant" -> + let message = + match property "message" root with + | Some value when value.ValueKind = JsonValueKind.Object -> value + | _ -> invalidOp "assistant.message must be an object" + + let model = requiredString "message" "model" message + + // Claude Code writes local error/interruption notices as assistant records with a synthetic + // model and no API request. They are not provider responses. + if model = "" then + Ok Other + else + let messageId = requiredString "message" "id" message + + if not (identityPattern.IsMatch messageId) then + invalidOp "message.id is not a bounded identity" + + let requestId = requiredString "assistant" "requestId" root + + if not (identityPattern.IsMatch requestId) then + invalidOp "assistant.requestId is not a bounded identity" + + let session = guid "assistant.sessionId" (requiredString "assistant" "sessionId" root) + + let sidechain = + match property "isSidechain" root with + | Some value when value.ValueKind = JsonValueKind.True -> true + | Some value when value.ValueKind = JsonValueKind.False -> false + | _ -> invalidOp "assistant.isSidechain must be a boolean" + + let agent = + if sidechain then + let value = requiredString "assistant" "agentId" root + + if not (agentPattern.IsMatch value) then + invalidOp "assistant.agentId is not a bounded identity" + + Some value + else + None + + let timestamp = requiredString "assistant" "timestamp" root + + if not (timestampPattern.IsMatch timestamp) then + invalidOp "assistant.timestamp must be an RFC 3339 timestamp" + + let completed = + match property "stop_reason" message with + | None -> false + | Some value when value.ValueKind = JsonValueKind.Null -> false + | Some value when value.ValueKind = JsonValueKind.String -> + profileText "message.stop_reason" (value.GetString()) |> ignore + true + | Some _ -> invalidOp "message.stop_reason must be a string or null" + + Ok( + Assistant + { + MessageId = messageId + RequestId = requestId + SessionId = session + ThreadId = + match agent with + | Some value -> subagentThreadId session value + | None -> session + Sidechain = sidechain + AgentId = agent + Model = model + Effort = optionalString "assistant" "effort" root + Timestamp = timestamp + RuntimeVersion = optionalString "assistant" "version" root + // Streaming writers record incomplete per-block usage before stop_reason; only a + // completed record carries the response's final counters. + Usage = + if completed then + match property "usage" message with + | Some value -> Some(usage value) + | None -> invalidOp "message.usage is required on a completed response" + else + None + } + ) + | _ -> Ok Other + with + | :? JsonException + | :? InvalidOperationException + | :? DecoderFallbackException + | :? ArgumentException as error -> Error error.Message + let private text (label: string) (node: JsonElement) (name: string) = match node.TryGetProperty name with | true, value when @@ -452,6 +714,256 @@ module RuntimeUsage = with error -> Error [ error.Message ] + type private ClaudeEntry = + { + First: ClaudeTranscript.Response + /// The prompt identity in force at the response's first record, which owns an incomplete response. + StartTurn: string option + // The prompt identity in force at the response's first completed record; incomplete streaming records + // and later tool results never move it. + mutable Turn: string option + mutable Completed: (ClaudeTranscript.Response * ClaudeTranscript.Usage) option + } + + let private claudeCounts (usage: ClaudeTranscript.Usage) = + let add (left: int64) (right: int64) = + if left > Int64.MaxValue - right then + invalidOp "Claude usage counters overflow" + + left + right + + let input = add (add usage.Uncached usage.CacheRead) usage.CacheCreation + + { + Input = input + CachedInput = usage.CacheRead + CacheWriteInput = usage.CacheCreation + Output = usage.Output + Reasoning = usage.Thinking + Total = add input usage.Output + } + + let private sumCounts (left: TokenCounts) (right: TokenCounts) = + let add (a: int64) (b: int64) = + if a > Int64.MaxValue - b then + invalidOp "Claude turn usage counters overflow" + + a + b + + { + Input = add left.Input right.Input + CachedInput = add left.CachedInput right.CachedInput + CacheWriteInput = add left.CacheWriteInput right.CacheWriteInput + Output = add left.Output right.Output + Reasoning = Option.map2 add left.Reasoning right.Reasoning + Total = add left.Total right.Total + } + + let collectClaudeTranscript + (task: string) + (turnId: string option) + (allResponses: bool) + (sinceUtc: string option) + (untilUtc: string option) + (coordinationVersion: string) + (sddVersion: string) + (contractsVersion: string) + (bytes: byte array) + = + try + let errors = ensureVersions task coordinationVersion sddVersion contractsVersion + + if not errors.IsEmpty then + Error errors + elif bytes.LongLength > int64 ClaudeTranscript.MaximumFileBytes then + Error [ "Claude transcript exceeds its 128 MiB bound; totals withheld" ] + elif bytes.Length = 0 then + Error [ "Claude transcript is empty" ] + elif bytes[bytes.Length - 1] <> byte '\n' then + Error [ "Claude transcript ends in a partial line; totals withheld until the record is complete" ] + else + let source = "claude-transcript-jsonl:sha256:" + TelemetryJson.sha256 bytes + let order = ResizeArray() + let entries = Collections.Generic.Dictionary(StringComparer.Ordinal) + let failures = ResizeArray() + let mutable turn = None + let mutable start = 0 + let mutable lineNumber = 0 + + while start < bytes.Length && failures.Count = 0 do + let stop = Array.IndexOf(bytes, byte '\n', start) + lineNumber <- lineNumber + 1 + let length = stop - start + + if length > ClaudeTranscript.MaximumLineBytes then + failures.Add $"line %d{lineNumber}: exceeds the 4 MiB line bound; totals withheld" + elif length > 0 && not (length = 1 && bytes[start] = byte '\r') then + match ClaudeTranscript.decodeLine bytes[start .. stop - 1] with + | Error reason -> failures.Add $"line %d{lineNumber}: %s{reason}" + | Ok(ClaudeTranscript.Prompt prompt) -> turn <- Some prompt + | Ok ClaudeTranscript.Other -> () + | Ok(ClaudeTranscript.Assistant record) -> + match entries.TryGetValue record.MessageId with + | false, _ -> + order.Add record.MessageId + + entries[record.MessageId] <- + { + First = record + StartTurn = turn + Turn = if record.Usage.IsSome then turn else None + Completed = record.Usage |> Option.map (fun usage -> record, usage) + } + | true, entry -> + if + entry.First.RequestId <> record.RequestId + || entry.First.SessionId <> record.SessionId + || entry.First.ThreadId <> record.ThreadId + || entry.First.Model <> record.Model + then + failures.Add + $"line %d{lineNumber}: response %s{record.MessageId} changes its request, session, thread or model identity" + else + match entry.Completed, record.Usage with + | None, Some usage -> + entry.Completed <- Some(record, usage) + entry.Turn <- turn + | Some(_, prior), Some usage when prior = usage -> () + | Some _, Some _ -> + failures.Add + $"line %d{lineNumber}: response %s{record.MessageId} repeats disagreeing completed usage; totals withheld" + | Some _, None -> + failures.Add + $"line %d{lineNumber}: response %s{record.MessageId} has an incomplete record after its completed usage" + | None, None -> () + + start <- stop + 1 + + let sessions = entries.Values |> Seq.map _.First.SessionId |> Seq.distinct |> Seq.length + + if failures.Count > 0 then + Error(List.ofSeq failures) + elif entries.Count = 0 then + Error [ "no Claude API responses found" ] + elif sessions <> 1 then + Error [ "Claude transcript mixes session identities" ] + else + // Turn totals are cumulative within one thread and prompt, as Codex's turn_token_usage is. A + // response whose turn predecessor is incomplete has an unknown turn total, never a partial sum. + let running = + Collections.Generic.Dictionary>() + + let candidates = + [ + for id in order do + let entry = entries[id] + + let row = + match entry.Turn, entry.Completed with + | _, None -> Error $"response %s{id} has no completed usage record; totals withheld" + | None, Some _ -> Error $"response %s{id} has no preceding Claude prompt identity" + | Some prompt, Some(record, usage) -> + match record.RuntimeVersion with + | None -> Error $"response %s{id} has no Claude Code version" + | Some version -> + let counts = claudeCounts usage + let key = record.ThreadId, prompt + + let turnCounts = + match running.TryGetValue key with + | true, Error reason -> Error reason + | true, Ok prior -> Ok(sumCounts prior counts) + | false, _ -> Ok counts + + turnCounts + |> Result.map (fun turnTotal -> + { + Timestamp = record.Timestamp + Task = task + SessionId = record.SessionId + ThreadId = record.ThreadId + TurnId = prompt + ResponseId = id + Provider = "Anthropic" + Model = record.Model + Effort = record.Effort |> Option.defaultValue "" + RuntimeVersion = version + CoordinationVersion = coordinationVersion + SddVersion = sddVersion + ContractsVersion = contractsVersion + LedgerSchema = 1 + Response = counts + Turn = turnTotal + Thread = None + Source = source + }) + + // An incomplete response belongs to the turn it started in, so it is selected by + // that turn and makes every later total in that turn unknown. + let owner = + match entry.Completed with + | Some _ -> entry.Turn + | None -> entry.StartTurn + + match owner with + | Some prompt -> + let key = entry.First.ThreadId, prompt + + running[key] <- + match row with + | Ok value -> Ok value.Turn + | Error _ -> + Error $"turn %s{prompt} usage is incomplete before response %s{id}" + | None -> () + + let timestamp = + entry.Completed + |> Option.map (fun (record, _) -> record.Timestamp) + |> Option.defaultValue entry.First.Timestamp + + yield owner, timestamp, row + ] + + let filtered = + candidates + |> List.filter (fun (turn, _, _) -> turnId |> Option.forall (fun wanted -> turn = Some wanted)) + |> List.filter (fun (_, timestamp, _) -> + sinceUtc |> Option.forall (fun since -> String.CompareOrdinal(timestamp, since) >= 0)) + |> List.filter (fun (_, timestamp, _) -> + untilUtc |> Option.forall (fun until -> String.CompareOrdinal(timestamp, until) < 0)) + + if filtered.IsEmpty then + Error [ "no Claude responses matched the requested turn/time window" ] + else + let selected = + if allResponses then + filtered + else + [ List.last filtered ] + + let refused = + selected + |> List.choose (fun (_, _, row) -> + match row with + | Error reason -> Some reason + | Ok _ -> None) + + if not refused.IsEmpty then + Error refused + else + Ok + { + Rows = + selected + |> List.choose (fun (_, _, row) -> + match row with + | Ok value -> Some value + | Error _ -> None) + SourceDigest = source + } + with error -> + Error [ error.Message ] + let private csvEscape (value: string) = if value.IndexOfAny([| ','; '"'; '\n'; '\r' |]) >= 0 then "\"" + value.Replace("\"", "\"\"") + "\"" @@ -659,7 +1171,7 @@ module RuntimeUsage = not ( Regex.IsMatch( source, - "^(codex-session-jsonl|claude-statusline-json):sha256:[0-9a-f]{64}$", + "^(codex-session-jsonl|claude-statusline-json|claude-transcript-jsonl):sha256:[0-9a-f]{64}$", RegexOptions.CultureInvariant ) ) diff --git a/src/FS.GG.Coord.Core/Telemetry.fsi b/src/FS.GG.Coord.Core/Telemetry.fsi index 84f51927c..5c40daa86 100644 --- a/src/FS.GG.Coord.Core/Telemetry.fsi +++ b/src/FS.GG.Coord.Core/Telemetry.fsi @@ -45,6 +45,49 @@ module RuntimeUsage = SourceDigest: string } + /// Strict bounded decoder for Claude Code transcript JSONL. It retains only allowlisted identities and counters. + module ClaudeTranscript = + [] + val MaximumFileBytes: int = 134217728 + + [] + val MaximumLineBytes: int = 4194304 + + type Usage = + { + Uncached: int64 + CacheRead: int64 + CacheCreation: int64 + Output: int64 + /// Present only when the response reports output_tokens_details.thinking_tokens. + Thinking: int64 option + } + + type Response = + { + MessageId: string + RequestId: string + SessionId: string + /// The session for the main thread; a derived stable identity for one sidechain agent. + ThreadId: string + Sidechain: bool + AgentId: string option + Model: string + Effort: string option + Timestamp: string + RuntimeVersion: string option + /// Final counters from a completed record; None for an incomplete streaming record. + Usage: Usage option + } + + type Line = + | Prompt of promptId: string + | Assistant of Response + | Other + + val subagentThreadId: sessionId: string -> agentId: string -> string + val decodeLine: line: byte array -> Result + val collectCodex: task: string -> turnId: string option -> @@ -65,6 +108,19 @@ module RuntimeUsage = bytes: byte array -> Result + /// One row per distinct completed API response (message.id), deduplicated across per-block records. + val collectClaudeTranscript: + task: string -> + turnId: string option -> + allResponses: bool -> + sinceUtc: string option -> + untilUtc: string option -> + coordinationVersion: string -> + sddVersion: string -> + contractsVersion: string -> + bytes: byte array -> + Result + val renderCsv: UsageRow list -> string val renderJsonLines: UsageRow list -> string val parseJsonLines: string -> Result diff --git a/src/FS.GG.Coord.Core/TelemetryStore.fs b/src/FS.GG.Coord.Core/TelemetryStore.fs index 9c61cf9aa..6ff6137c2 100644 --- a/src/FS.GG.Coord.Core/TelemetryStore.fs +++ b/src/FS.GG.Coord.Core/TelemetryStore.fs @@ -1577,15 +1577,21 @@ module TelemetryStore = let value = optional name if value |> Option.exists (fun v -> v.Length > 200 || (v |> Seq.exists Char.IsControl)) then invalidOp "passive profile is invalid" value - let expected = "passive-" + CanonicalJson.sha256(Encoding.UTF8.GetBytes("codex-rollout/1\u001f" + thread + "\u001f" + turn + "\u001f" + response)) + // Each admitted local provenance owns one native identity namespace; no other value is accepted. + let provenance = text "provenance" + let ns = + match provenance with + | "codex-local-rollout/1" -> "codex-rollout/1" + | "claude-local-transcript/1" -> "claude-transcript/1" + | _ -> invalidOp "passive observation must preserve native identity and unknown attribution/population" + let expected = "passive-" + CanonicalJson.sha256(Encoding.UTF8.GetBytes(ns + "\u001f" + thread + "\u001f" + turn + "\u001f" + response)) if itemId.IsSome || identity <> expected || revision < 1L || not (guid thread && guid turn) || (response |> Seq.exists Char.IsControl) || not (subset cached input && subset cacheWrite input && subset reasoning output) || (match input, output, total with Some i, Some o, Some t -> i > Int64.MaxValue - o || i + o <> t | _ -> false) || ([input; cached; cacheWrite; output; reasoning; total] |> List.forall Option.isNone) || text "populationCoverage" <> "partial" || text "attributionCoverage" <> "unknown" - || text "inventoryCoverage" <> "unknown" || text "terminalCoverage" <> "unknown" - || text "provenance" <> "codex-local-rollout/1" then + || text "inventoryCoverage" <> "unknown" || text "terminalCoverage" <> "unknown" then invalidOp "passive observation must preserve native identity and unknown attribution/population" let observation = { ThreadId = thread; TurnId = turn; ResponseId = response diff --git a/tests/FS.GG.Coord.Cli.Tests/TelemetryCliTests.fs b/tests/FS.GG.Coord.Cli.Tests/TelemetryCliTests.fs index 483f9e028..448c5f413 100644 --- a/tests/FS.GG.Coord.Cli.Tests/TelemetryCliTests.fs +++ b/tests/FS.GG.Coord.Cli.Tests/TelemetryCliTests.fs @@ -622,6 +622,66 @@ module TelemetryCliTests = Assert.Contains(",10,4,0,5,2,15,", stdout) Assert.DoesNotContain(path, stdout) + // Synthetic Claude Code transcript in the observed native shape; no private transcript content. + let private claudeTranscript = + let session = "5f0c2a8e-3b1d-4e6f-9a7b-1c2d3e4f5a6b" + let user (prompt: string) = + $"""{{"type":"user","isSidechain":false,"promptId":"{prompt}","message":{{"role":"user","content":"synthetic"}},"sessionId":"{session}","timestamp":"2026-10-22T05:00:00.000Z","version":"2.1.299"}}""" + let assistant (id: string) (second: int) (output: int) = + $"""{{"type":"assistant","isSidechain":false,"message":{{"model":"claude-opus-5-5","id":"{id}","role":"assistant","content":[],"stop_reason":"end_turn","usage":{{"input_tokens":2,"cache_creation_input_tokens":3,"cache_read_input_tokens":5,"output_tokens":{output}}}}},"requestId":"req_{id}","sessionId":"{session}","timestamp":"2026-10-22T05:01:{second:D2}.000Z","version":"2.1.299","effort":"medium"}}""" + [ user "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d"; assistant "msg_a" 1 7; assistant "msg_a" 2 7 + user "1b2c3d4e-5f6a-4b7c-9d8e-0f1a2b3c4d5e"; assistant "msg_b" 3 11 ] + |> String.concat "\n" + |> fun text -> text + "\n" + + [] + let ``packaged Claude collector reads a transcript with the Codex selection contract`` () = + let disposable, path = temporary claudeTranscript + use _ = disposable + + let store = + Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + "fsgg-4801-cli-tests", + Guid.NewGuid().ToString("n") + ) + + use _store = + { new IDisposable with + member _.Dispose() = + if Directory.Exists store then + Directory.Delete(store, true) + } + + let collect (selection: string list) = + invoke ( + [ "telemetry"; "usage"; "collect"; "claude" ] + @ selection + @ [ "--task"; "repo#1/claim"; "--coord-version"; "4.5.6"; "--sdd-version"; "7.8.9" + "--contracts-version"; "10.0.0"; "--receipt-store"; store ] + ) + + let code, all, stderr = collect [ "--session-file"; path; "--all-responses" ] + Assert.Equal(0, code) + Assert.Equal("", stderr) + let rows = all.Trim().Split('\n') |> Array.tail + Assert.Equal(2, rows.Length) + Assert.Contains(",msg_a,Anthropic,claude-opus-5-5,medium,2.1.299,", rows[0]) + Assert.Contains(",10,5,3,7,,17,", rows[0]) + Assert.Contains("claude-transcript-jsonl:sha256:", rows[0]) + Assert.DoesNotContain(path, all) + let _, latest, _ = collect [ "--session-file"; path ] + Assert.Contains(",msg_b,", latest) + Assert.DoesNotContain(",msg_a,", latest) + let _, turn, _ = collect [ "--session-file"; path; "--turn-id"; "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d" ] + Assert.Contains(",msg_a,", turn) + let both, _, bothError = collect [ "--session-file"; path; "--snapshot"; path ] + Assert.NotEqual(0, both) + Assert.Contains("mutually exclusive", bothError) + let neither, _, neitherError = collect [] + Assert.NotEqual(0, neither) + Assert.Contains("--session-file or --snapshot", neitherError) + [] let ``#3259 collector durably archives and resolver returns the exact receipt`` () = let sessionDisposable, sessionPath = temporary (codex 15) diff --git a/tests/FS.GG.Coord.Cli.Tests/WorkspaceTelemetryApplicationTests.fs b/tests/FS.GG.Coord.Cli.Tests/WorkspaceTelemetryApplicationTests.fs index 0b0c4bf0a..040cef9ea 100644 --- a/tests/FS.GG.Coord.Cli.Tests/WorkspaceTelemetryApplicationTests.fs +++ b/tests/FS.GG.Coord.Cli.Tests/WorkspaceTelemetryApplicationTests.fs @@ -514,6 +514,162 @@ module WorkspaceTelemetryApplicationTests = Assert.Equal(int64(Encoding.UTF8.GetByteCount row), boundary.Cursor.Offset) Assert.Contains("response-boundary-deferred", boundary.Diagnostics) + // Synthetic Claude Code transcript records in the observed native shape; no private transcript content. + let private claudeSession = "5f0c2a8e-3b1d-4e6f-9a7b-1c2d3e4f5a6b" + let private claudePromptA = "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d" + let private claudePromptB = "1b2c3d4e-5f6a-4b7c-9d8e-0f1a2b3c4d5e" + + let private claudeSource (root: string) (name: string) = + let home = Path.Combine(root, "claude") + let project = Path.Combine(home, "projects", "-work") + Directory.CreateDirectory project |> ignore + home, Path.Combine(project, name + ".jsonl") + + let private claudePrompt (prompt: string) = + $"""{{"parentUuid":null,"isSidechain":false,"promptId":"{prompt}","type":"user","message":{{"role":"user","content":"synthetic"}},"uuid":"00000000-0000-4000-8000-000000000001","timestamp":"2026-10-22T05:00:00.000Z","cwd":"/work","sessionId":"{claudeSession}","version":"2.1.299"}}""" + "\n" + + let private claudeResponse (messageId: string) (second: int) (stop: string) (output: int64) = + $"""{{"parentUuid":"00000000-0000-4000-8000-000000000001","isSidechain":false,"message":{{"model":"claude-opus-5-5","id":"{messageId}","type":"message","role":"assistant","content":[{{"type":"text","text":"synthetic"}}],"stop_reason":{stop},"usage":{{"input_tokens":2,"cache_creation_input_tokens":300,"cache_read_input_tokens":4000,"output_tokens":{output},"output_tokens_details":{{"thinking_tokens":7}}}}}},"requestId":"req_{messageId}","type":"assistant","uuid":"00000000-0000-4000-9000-0000000000{second:D2}","timestamp":"2026-10-22T05:01:{second:D2}.000Z","cwd":"/work","sessionId":"{claudeSession}","version":"2.1.299","effort":"high"}}""" + "\n" + + [] + let ``passive Claude reader deduplicates per-block records and carries prompt context across passes`` () = + if OperatingSystem.IsLinux() && Runtime.InteropServices.RuntimeInformation.ProcessArchitecture = Runtime.InteropServices.Architecture.X64 then + let cleanup, root = temp () + use cleanup = cleanup + let home, path = claudeSource root "session" + let source = SkillTelemetryReaders.ClaudeHome home + let scan cursor = SkillTelemetryReaders.NativeUsage.scanPassiveFrom source path cursor 4194304 64 |> Result.defaultWith (fun error -> failwith error.Message) + // A streaming record before stop_reason never becomes an observation. + File.WriteAllText(path, claudePrompt claudePromptA + claudeResponse "msg_a" 1 "null" 8L) + let streaming = scan None + Assert.Empty streaming.Records + Assert.Equal(Some claudePromptA, streaming.Cursor.Context) + File.AppendAllText(path, claudeResponse "msg_a" 2 "\"tool_use\"" 50L + claudeResponse "msg_a" 3 "\"tool_use\"" 50L) + let completed = scan (Some streaming.Cursor) + let record = Assert.Single completed.Records + Assert.Equal("msg_a", record.ResponseId) + Assert.Equal(Guid.Parse claudeSession, record.ThreadId) + Assert.Equal(Guid.Parse claudePromptA, record.TurnId) + Assert.Equal(SkillTelemetryReaders.NativeUsage.ClaudePassiveProvenance, record.Provenance) + Assert.Equal(Some 4302L, record.Usage.Input) + Assert.Equal(Some 4000L, record.Usage.CachedInput) + Assert.Equal(Some 300L, record.Usage.CacheWriteInput) + Assert.Equal(Some 50L, record.Usage.Output) + Assert.Equal(Some 7L, record.Usage.Reasoning) + Assert.Equal(Some 4352L, record.Usage.Total) + Assert.Equal(Some "claude-opus-5-5", record.Model) + Assert.Equal(Some "high", record.Effort) + Assert.DoesNotContain("response-boundary-deferred", completed.Diagnostics) + Assert.Equal( + SkillTelemetryReaders.NativeUsage.passiveClaudeIdentity record.ThreadId record.TurnId record.ResponseId, + SkillTelemetryReaders.NativeUsage.passiveRecordIdentity record) + Assert.NotEqual( + SkillTelemetryReaders.NativeUsage.passiveIdentity record.ThreadId record.TurnId record.ResponseId, + SkillTelemetryReaders.NativeUsage.passiveRecordIdentity record) + // A repeat in a later pass has the same allowlisted digest despite its different block timestamp. + File.AppendAllText(path, claudeResponse "msg_a" 4 "\"tool_use\"" 50L) + let repeated = Assert.Single((scan (Some completed.Cursor)).Records) + Assert.Equal(record.SourceDigest, repeated.SourceDigest) + // The resumed cursor attributes a later prompt exactly as a full read does. + let beforeB = scan (Some completed.Cursor) + File.AppendAllText(path, claudePrompt claudePromptB + claudeResponse "msg_b" 5 "\"end_turn\"" 9L) + let resumed = scan (Some beforeB.Cursor) + let fromStart = scan None + let resumedB = resumed.Records |> List.find (fun row -> row.ResponseId = "msg_b") + let fullB = fromStart.Records |> List.find (fun row -> row.ResponseId = "msg_b") + Assert.Equal(Guid.Parse claudePromptB, resumedB.TurnId) + Assert.Equal(fullB.TurnId, resumedB.TurnId) + Assert.Equal(fullB.SourceDigest, resumedB.SourceDigest) + // A disagreeing repeat within one pass is a correction boundary, never a silent overwrite. + File.AppendAllText(path, claudeResponse "msg_b" 6 "\"end_turn\"" 10L) + let boundary = scan (Some resumed.Cursor) + Assert.Single boundary.Records |> ignore + File.WriteAllText(path, claudePrompt claudePromptA + claudeResponse "msg_c" 1 "\"end_turn\"" 9L + claudeResponse "msg_c" 2 "\"end_turn\"" 10L) + let disagreeing = scan None + Assert.Single disagreeing.Records |> ignore + Assert.Contains("response-boundary-deferred", disagreeing.Diagnostics) + + [] + let ``passive Claude reader withholds unattributable malformed partial and outside sources`` () = + if OperatingSystem.IsLinux() && Runtime.InteropServices.RuntimeInformation.ProcessArchitecture = Runtime.InteropServices.Architecture.X64 then + let cleanup, root = temp () + use cleanup = cleanup + let home, path = claudeSource root "session" + let source = SkillTelemetryReaders.ClaudeHome home + let scan cursor = SkillTelemetryReaders.NativeUsage.scanPassiveFrom source path cursor 4194304 64 |> Result.defaultWith (fun error -> failwith error.Message) + // Control: an attributable completed response is observed. + File.WriteAllText(path, claudePrompt claudePromptA + claudeResponse "msg_a" 1 "\"end_turn\"" 9L) + Assert.Single((scan None).Records) |> ignore + // No preceding prompt: the turn is unknown, so no observation is invented. + File.WriteAllText(path, claudeResponse "msg_a" 1 "\"end_turn\"" 9L) + let orphan = scan None + Assert.Empty orphan.Records + Assert.Contains("turn-identity-unavailable", orphan.Diagnostics) + // A malformed line may have been a prompt; later responses stay unattributed until the next prompt. + File.WriteAllText(path, claudePrompt claudePromptA + "{\"type\":\"user\",\"promptId\":\n" + claudeResponse "msg_a" 1 "\"end_turn\"" 9L) + let malformed = scan None + Assert.Empty malformed.Records + Assert.Contains("malformed-row-skipped", malformed.Diagnostics) + Assert.Contains("turn-identity-unavailable", malformed.Diagnostics) + // Missing counters are malformed, never zero. + File.WriteAllText(path, claudePrompt claudePromptA + (claudeResponse "msg_a" 1 "\"end_turn\"" 9L).Replace("\"cache_read_input_tokens\":4000,", "")) + let missing = scan None + Assert.Empty missing.Records + Assert.Contains("malformed-row-skipped", missing.Diagnostics) + // A partial tail is deferred without advancing past it. + let complete = claudePrompt claudePromptA + File.WriteAllText(path, complete + (claudeResponse "msg_a" 1 "\"end_turn\"" 9L).TrimEnd('\n')) + let tail = scan None + Assert.Empty tail.Records + Assert.Contains("partial-tail-deferred", tail.Diagnostics) + Assert.Equal(int64 (Encoding.UTF8.GetByteCount complete), tail.Cursor.Offset) + File.AppendAllText(path, "\n") + Assert.Single((scan (Some tail.Cursor)).Records) |> ignore + // Only files below the selected Claude projects root are readable. + let outside = Path.Combine(home, "session.jsonl") + File.WriteAllText(outside, complete) + Assert.True(SkillTelemetryReaders.NativeUsage.scanPassiveFrom source outside None 4194304 64 |> Result.isError) + Assert.True(SkillTelemetryReaders.NativeUsage.scanPassiveFrom (SkillTelemetryReaders.CodexHome home) path None 4194304 64 |> Result.isError) + + [] + let ``passive Claude capture enqueues admitted provider usage with its own provenance and corrections`` () = + if OperatingSystem.IsLinux() && Runtime.InteropServices.RuntimeInformation.ProcessArchitecture = Runtime.InteropServices.Architecture.X64 then + let cleanup, root = temp () + use cleanup = cleanup + let home, path = claudeSource root "session" + let source = SkillTelemetryReaders.ClaudeHome home + File.WriteAllText(path, claudePrompt claudePromptA + claudeResponse "msg_a" 1 "\"tool_use\"" 50L) + let batches = ResizeArray() + let capture () = + SkillTelemetryAdapter.capturePassiveFrom root "owner" "passive-stream" source [ path ] (fun bytes -> batches.Add(Array.copy bytes); Ok "locally-retained") + |> parseCapture + let first = capture () + let row = Assert.Single(first["observations"].AsArray()) + Assert.Equal("claude-local-transcript/1", row["provenance"].GetValue()) + Assert.Equal("partial", row["populationCoverage"].GetValue()) + Assert.Equal("unknown", row["attributionCoverage"].GetValue()) + Assert.Null(row["itemId"]) + Assert.Equal(7L, row["reasoning"].GetValue()) + let parsed = TelemetryStore.parseBatch batches[0] |> Result.defaultWith (sprintf "%A" >> failwith) + let fact = Assert.Single(parsed.Facts |> List.filter (fun value -> value.Kind = "provider-usage-observation/1")) + Assert.Equal(row["identity"].GetValue(), fact.Identity) + let state = System.Text.Json.Nodes.JsonNode.Parse(File.ReadAllBytes(Path.Combine(root, "orchestrator-passive", "producer.json"))) + let cursor = state["sources"].AsObject() |> Seq.exactlyOne + Assert.Equal(claudePromptA, cursor.Value["context"].GetValue()) + // An identical per-block repeat is not a new observation. + File.AppendAllText(path, claudeResponse "msg_a" 2 "\"tool_use\"" 50L) + capture () |> ignore + Assert.Equal(1, batches.Count) + // A disagreeing later record is a numbered correction under the same identity. + File.AppendAllText(path, claudeResponse "msg_a" 3 "\"tool_use\"" 60L) + let corrected = capture () + Assert.Equal(2, batches.Count) + let current = Assert.Single(corrected["observations"].AsArray()) + Assert.Equal(2L, current["revision"].GetValue()) + Assert.Equal(60L, current["output"].GetValue()) + let correction = TelemetryStore.parseBatch batches[1] |> Result.defaultWith (sprintf "%A" >> failwith) + Assert.Equal(fact.Identity, (Assert.Single correction.Facts).Identity) + [] let ``passive capture persists intent before enqueue and replays exact identity after uncertain enqueue`` () = if OperatingSystem.IsLinux() && Runtime.InteropServices.RuntimeInformation.ProcessArchitecture = Runtime.InteropServices.Architecture.X64 then @@ -1061,6 +1217,49 @@ module WorkspaceTelemetryApplicationTests = Assert.Equal(1, invalidCode) Assert.Single(Directory.GetFiles(spool, "*.ready")) |> ignore + [] + let ``passive command selects an explicit Claude transcript through the actual application route`` () = + if OperatingSystem.IsLinux() && Runtime.InteropServices.RuntimeInformation.ProcessArchitecture = Runtime.InteropServices.Architecture.X64 then + let cleanup, root = temp () + use cleanup = cleanup + let config, spool = passiveRemoteConfig root + let home, path = claudeSource root "command" + File.WriteAllText(path, claudePrompt claudePromptA + claudeResponse "msg_a" 1 "\"end_turn\"" 9L) + let run (arguments: string list) = + let priorOut, priorError = Console.Out, Console.Error + use stdout = new StringWriter() + use stderr = new StringWriter() + try + Console.SetOut stdout + Console.SetError stderr + let code = TelemetryApplication.tryRun ([ "telemetry"; "passive" ] @ arguments) |> Option.defaultValue 99 + code, stdout.ToString(), stderr.ToString() + finally + Console.SetOut priorOut + Console.SetError priorError + let select (name: string) (body: string) = + let selection = Path.Combine(root, name) + File.WriteAllText(selection, body) + File.SetUnixFileMode(selection, enum 0o600) + selection + let args = [ "--config"; config; "--repository"; "FS-GG/.github" ] + // Exactly one selected root: both homes together are an unsupported shape and capture nothing. + let ambiguous = + select "ambiguous.json" (System.Text.Json.JsonSerializer.Serialize {| schema = "fsgg.telemetry.passive-selection/1"; codexHome = home; claudeHome = home; sources = [| path |] |}) + let refusedCode, _, _ = run ([ "capture" ] @ args @ [ "--input"; ambiguous ]) + Assert.Equal(1, refusedCode) + Assert.True(not (Directory.Exists spool) || Array.isEmpty (Directory.GetFiles(spool, "*.ready"))) + let selection = + select "selected.json" (System.Text.Json.JsonSerializer.Serialize {| schema = "fsgg.telemetry.passive-selection/1"; claudeHome = home; sources = [| path |] |}) + let code, output, error = run ([ "capture" ] @ args @ [ "--input"; selection ]) + Assert.True((code = 0), error) + let captured = System.Text.Json.Nodes.JsonNode.Parse output + let row = Assert.Single(captured["observations"].AsArray()) + Assert.Equal("claude-local-transcript/1", row["provenance"].GetValue()) + Assert.Equal("unknown", captured["attribution"].GetValue()) + Assert.DoesNotContain(root, output) + Assert.Single(Directory.GetFiles(spool, "*.ready")) |> ignore + [] let ``passive blocked chains leave ordinary delivery fair across more than sixteen heads`` () = if OperatingSystem.IsLinux() && Runtime.InteropServices.RuntimeInformation.ProcessArchitecture = Runtime.InteropServices.Architecture.X64 then diff --git a/tests/FS.GG.Coord.Core.Tests/TelemetryStoreTests.fs b/tests/FS.GG.Coord.Core.Tests/TelemetryStoreTests.fs index ebebb56e8..92e10b2b2 100644 --- a/tests/FS.GG.Coord.Core.Tests/TelemetryStoreTests.fs +++ b/tests/FS.GG.Coord.Core.Tests/TelemetryStoreTests.fs @@ -459,6 +459,20 @@ module TelemetryStoreTests = System.Text.Json.Nodes.JsonNode.Parse( $"""{{"kind":"provider-usage-observation/1","identity":"{identity}","itemId":null,"revision":1,"threadId":"{thread}","turnId":"{turn}","responseId":"response-a","provider":null,"model":null,"effort":null,"input":10,"cachedInput":9,"cacheWriteInput":8,"output":5,"reasoning":2,"total":15,"sourceInstance":"{String('a',64)}","sourceGeneration":"source-1","sourceDigest":"{String('b',64)}","position":0,"capturedAt":"2026-10-18T07:00:00Z","occurredAt":null,"provenance":"codex-local-rollout/1","populationCoverage":"partial","attributionCoverage":"unknown","inventoryCoverage":"unknown","terminalCoverage":"unknown"}}""") + [] + let ``passive Claude transcript provenance owns its own native identity namespace`` () = + let event = passiveEvent () + let thread, turn = event["threadId"].GetValue(), event["turnId"].GetValue() + let claudeIdentity = "passive-" + CanonicalJson.sha256(bytes ("claude-transcript/1\u001f" + thread + "\u001f" + turn + "\u001fresponse-a")) + let parse (node: System.Text.Json.Nodes.JsonNode) = TelemetryStore.parseBatch(causalBatch (node.ToJsonString())) + event["provenance"] <- System.Text.Json.Nodes.JsonValue.Create "claude-local-transcript/1" + // Causal control: the same fact under the Codex namespace is refused once provenance says Claude. + Assert.True(parse event |> Result.isError) + event["identity"] <- System.Text.Json.Nodes.JsonValue.Create claudeIdentity + Assert.True(parse event |> Result.isOk) + event["provenance"] <- System.Text.Json.Nodes.JsonValue.Create "claude-statusline/1" + Assert.True(parse event |> Result.isError) + [] let ``passive response is partial unassigned and preserves independent cache counters`` () = let event = passiveEvent () diff --git a/tests/FS.GG.Coord.Core.Tests/TelemetryTests.fs b/tests/FS.GG.Coord.Core.Tests/TelemetryTests.fs index 42e60facc..9aad1e4ee 100644 --- a/tests/FS.GG.Coord.Core.Tests/TelemetryTests.fs +++ b/tests/FS.GG.Coord.Core.Tests/TelemetryTests.fs @@ -309,6 +309,231 @@ module TelemetryTests = Assert.Equal(13L, first.Rows.Head.Response.Total) Assert.Equal(None, first.Rows.Head.Response.Reasoning) + // Synthetic Claude Code transcript records in the observed native shape (2.1.x). Identities, text and paths are + // invented; no private transcript content is used. Usage is repeated per content block exactly as Claude Code + // writes it, and a streaming writer's incomplete records carry stop_reason null with provisional counters. + module private ClaudeFixture = + let session = "5f0c2a8e-3b1d-4e6f-9a7b-1c2d3e4f5a6b" + let promptA = "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d" + let promptB = "1b2c3d4e-5f6a-4b7c-9d8e-0f1a2b3c4d5e" + + let user (prompt: string) (index: int) = + $"""{{"parentUuid":null,"isSidechain":false,"promptId":"{prompt}","type":"user","message":{{"role":"user","content":"synthetic prompt"}},"uuid":"00000000-0000-4000-8000-{index:D12}","timestamp":"2026-10-22T05:00:{index:D2}.000Z","userType":"external","entrypoint":"cli","cwd":"/work","sessionId":"{session}","version":"2.1.299","gitBranch":"main"}}""" + + let usage (input: int64) (cacheWrite: int64) (cacheRead: int64) (output: int64) (thinking: int64 option) = + let details = + match thinking with + | Some value -> $""","output_tokens_details":{{"thinking_tokens":{value}}}""" + | None -> "" + + "\"usage\":" + + $"""{{"input_tokens":{input},"cache_creation_input_tokens":{cacheWrite},"cache_read_input_tokens":{cacheRead},"output_tokens":{output},"server_tool_use":{{"web_search_requests":0,"web_fetch_requests":0}},"service_tier":"standard","cache_creation":{{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":{cacheWrite}}},"inference_geo":"","iterations":[],"speed":"standard"{details}}}""" + + let assistantWith (extra: string) (messageId: string) (request: string) (second: int) (stop: string) (usageJson: string) = + $"""{{"parentUuid":"00000000-0000-4000-8000-000000000001","isSidechain":false,{extra}"message":{{"model":"claude-opus-5-5","id":"{messageId}","type":"message","role":"assistant","content":[{{"type":"text","text":"synthetic"}}],"stop_reason":{stop},"stop_sequence":null,"stop_details":null,{usageJson},"context_management":null}},"requestId":"{request}","type":"assistant","uuid":"00000000-0000-4000-9000-{second:D12}","timestamp":"2026-10-22T05:01:{second:D2}.000Z","userType":"external","entrypoint":"cli","cwd":"/work","sessionId":"{session}","version":"2.1.299","gitBranch":"main","effort":"high"}}""" + + let assistant = assistantWith "" + + let sidechain (agent: string) (messageId: string) (request: string) (second: int) (usageJson: string) = + (assistant messageId request second "\"end_turn\"" usageJson) + .Replace("\"isSidechain\":false,", $"\"isSidechain\":true,\"agentId\":\"{agent}\",") + + let other = + [ + """{"type":"mode","mode":"default","sessionId":"5f0c2a8e-3b1d-4e6f-9a7b-1c2d3e4f5a6b"}""" + """{"type":"attachment","attachment":{"type":"synthetic"},"uuid":"00000000-0000-4000-a000-000000000001"}""" + """{"type":"system","subtype":"informational","content":"synthetic"}""" + ] + + // Two API responses in prompt A: msg-a repeated identically per block; msg-b streamed then completed. + let transcript = + [ user promptA 1 ] + @ other + @ [ + assistant "msg_a" "req_a" 1 "\"tool_use\"" (usage 2L 300L 4000L 50L None) + assistant "msg_a" "req_a" 2 "\"tool_use\"" (usage 2L 300L 4000L 50L None) + user promptA 2 + assistant "msg_b" "req_b" 3 "null" (usage 2L 0L 0L 8L None) + assistant "msg_b" "req_b" 4 "\"end_turn\"" (usage 3L 10L 4300L 120L (Some 40L)) + // Claude Code's local interruption notice is an assistant record but not a provider response. + """{"type":"assistant","isSidechain":false,"message":{"model":"","id":"6d1f3c58-0000-4000-8000-000000000000","role":"assistant","content":[],"stop_reason":"stop_sequence","usage":{"input_tokens":0,"output_tokens":0,"cache_creation_input_tokens":0,"cache_read_input_tokens":0}},"isApiErrorMessage":true,"sessionId":"5f0c2a8e-3b1d-4e6f-9a7b-1c2d3e4f5a6b","timestamp":"2026-10-22T05:01:05.000Z"}""" + ] + + let render (lines: string list) = (lines |> String.concat "\n") + "\n" + + let private collectTranscript turn all since until (text: string) = + RuntimeUsage.collectClaudeTranscript "repo#1/claim" turn all since until "4.5.6" "7.8.9" "10.0.0" (bytes text) + + let private refusal (result: Result) = + match result with + | Ok collection -> failwithf "expected refusal, collected %A" collection.Rows + | Error reasons -> String.concat "; " reasons + + [] + let ``Claude transcript emits one deduplicated row per completed API response`` () = + let result = + ClaudeFixture.render ClaudeFixture.transcript + |> collectTranscript None true None None + |> unwrap + + Assert.Equal([ "msg_a"; "msg_b" ], result.Rows |> List.map _.ResponseId) + let a, b = result.Rows[0], result.Rows[1] + Assert.Equal("Anthropic", a.Provider) + Assert.Equal("claude-opus-5-5", a.Model) + Assert.Equal("high", a.Effort) + Assert.Equal("2.1.299", a.RuntimeVersion) + Assert.Equal(ClaudeFixture.session, a.SessionId) + Assert.Equal(ClaudeFixture.session, a.ThreadId) + Assert.Equal(ClaudeFixture.promptA, a.TurnId) + Assert.Equal("2026-10-22T05:01:01.000Z", a.Timestamp) + // Input is uncached + cache-read + cache-creation; cache counters are its subsets. + Assert.Equal(4302L, a.Response.Input) + Assert.Equal(4000L, a.Response.CachedInput) + Assert.Equal(300L, a.Response.CacheWriteInput) + Assert.Equal(50L, a.Response.Output) + Assert.Equal(4352L, a.Response.Total) + // Reasoning is reported only when the response carries thinking_tokens. + Assert.Equal(None, a.Response.Reasoning) + Assert.Equal(Some 40L, b.Response.Reasoning) + // The completed record supersedes the streaming record's provisional output. + Assert.Equal(120L, b.Response.Output) + Assert.Equal(4313L, b.Response.Input) + Assert.Equal("2026-10-22T05:01:04.000Z", b.Timestamp) + // Turn totals accumulate within one prompt; reasoning stays unknown when any response lacks it. + Assert.Equal(a.Response.Input + b.Response.Input, b.Turn.Input) + Assert.Equal(a.Response.Total + b.Response.Total, b.Turn.Total) + Assert.Equal(None, b.Turn.Reasoning) + Assert.Equal(None, b.Thread) + Assert.StartsWith("claude-transcript-jsonl:sha256:", result.SourceDigest) + Assert.All(result.Rows, fun row -> Assert.Equal(result.SourceDigest, row.Source)) + // The rendered receipt reparses under the admitted provenance. + let reparsed = RuntimeUsage.parseJsonLines (RuntimeUsage.renderJsonLines result.Rows) |> unwrap + Assert.Equal(result.Rows, reparsed) + Assert.DoesNotContain("synthetic prompt", RuntimeUsage.renderCsv result.Rows) + + [] + let ``Claude transcript honours the Codex selection contract`` () = + let text = + ClaudeFixture.render ( + ClaudeFixture.transcript + @ [ + ClaudeFixture.user ClaudeFixture.promptB 9 + ClaudeFixture.assistant "msg_c" "req_c" 30 "\"end_turn\"" (ClaudeFixture.usage 1L 0L 10L 5L (Some 0L)) + ] + ) + + let latest = collectTranscript None false None None text |> unwrap + Assert.Equal("msg_c", (List.exactlyOne latest.Rows).ResponseId) + Assert.Equal(ClaudeFixture.promptB, latest.Rows.Head.TurnId) + Assert.Equal(latest.Rows.Head.Response, latest.Rows.Head.Turn) + Assert.Equal(Some 0L, latest.Rows.Head.Response.Reasoning) + let turnA = collectTranscript (Some ClaudeFixture.promptA) true None None text |> unwrap + Assert.Equal([ "msg_a"; "msg_b" ], turnA.Rows |> List.map _.ResponseId) + let window = collectTranscript None true (Some "2026-10-22T05:01:02Z") (Some "2026-10-22T05:01:29Z") text |> unwrap + Assert.Equal([ "msg_b" ], window.Rows |> List.map _.ResponseId) + Assert.Contains("no Claude responses matched", collectTranscript (Some ClaudeFixture.promptB) true (Some "2026-10-23T00:00:00Z") None text |> refusal) + + [] + let ``Claude sidechain usage stays on its own derived thread`` () = + let agent = "a5f3c1e2d4b6a8c9e" + let text = + ClaudeFixture.render ( + ClaudeFixture.transcript + @ [ ClaudeFixture.sidechain agent "msg_s" "req_s" 20 (ClaudeFixture.usage 1L 0L 100L 9L None) ] + ) + + let rows = (collectTranscript None true None None text |> unwrap).Rows + let side = rows |> List.find (fun row -> row.ResponseId = "msg_s") + let expected = RuntimeUsage.ClaudeTranscript.subagentThreadId ClaudeFixture.session agent + Assert.Equal(expected, side.ThreadId) + Assert.NotEqual(ClaudeFixture.session, side.ThreadId) + Assert.True(Guid.TryParseExact(side.ThreadId, "D") |> fst) + Assert.Equal(expected, RuntimeUsage.ClaudeTranscript.subagentThreadId ClaudeFixture.session agent) + // Same prompt, different thread: the sidechain never joins the main thread's turn total. + Assert.Equal(side.Response, side.Turn) + Assert.Equal(ClaudeFixture.promptA, side.TurnId) + let missingAgent = text.Replace($"\"agentId\":\"{agent}\",", "") + Assert.Contains("agentId", collectTranscript None true None None missingAgent |> refusal) + + [] + let ``Claude transcript refuses disagreeing repeated usage but accepts the agreeing control`` () = + let agreeing = ClaudeFixture.render ClaudeFixture.transcript + Assert.True(collectTranscript None true None None agreeing |> Result.isOk) + let disagreeing = + ClaudeFixture.render ( + ClaudeFixture.transcript + @ [ ClaudeFixture.assistant "msg_a" "req_a" 7 "\"tool_use\"" (ClaudeFixture.usage 2L 300L 4000L 51L None) ] + ) + + Assert.Contains("repeats disagreeing completed usage", collectTranscript None true None None disagreeing |> refusal) + let changedRequest = + ClaudeFixture.render ( + ClaudeFixture.transcript + @ [ ClaudeFixture.assistant "msg_a" "req_other" 7 "\"tool_use\"" (ClaudeFixture.usage 2L 300L 4000L 50L None) ] + ) + + Assert.Contains("changes its request", collectTranscript None true None None changedRequest |> refusal) + + [] + let ``Claude transcript withholds totals for partial malformed and oversized input`` () = + let complete = ClaudeFixture.render ClaudeFixture.transcript + Assert.True(collectTranscript None true None None complete |> Result.isOk) + Assert.Contains("partial line", collectTranscript None true None None (complete.TrimEnd('\n')) |> refusal) + Assert.Contains("partial line", collectTranscript None true None None (complete + "{\"type\":\"assi") |> refusal) + Assert.Contains("line 2:", collectTranscript None true None None (complete.Replace("\"mode\":\"default\"", "\"mode\":")) |> refusal) + let duplicateProperty = complete.Replace("\"type\":\"system\",", "\"type\":\"system\",\"type\":\"system\",") + Assert.Contains("duplicate property", collectTranscript None true None None duplicateProperty |> refusal) + let invalidUtf8 = Encoding.UTF8.GetBytes complete + invalidUtf8[complete.IndexOf("synthetic prompt", StringComparison.Ordinal)] <- 0xFFuy + let utf8Result = + RuntimeUsage.collectClaudeTranscript "task" None true None None "1" "1" "1" invalidUtf8 + + Assert.True(Result.isError utf8Result) + let oversized = complete + "{\"type\":\"attachment\",\"content\":\"" + String('x', RuntimeUsage.ClaudeTranscript.MaximumLineBytes) + "\"}\n" + Assert.Contains("line bound", collectTranscript None true None None oversized |> refusal) + Assert.Contains("empty", collectTranscript None true None None "" |> refusal) + Assert.Contains("no Claude API responses", collectTranscript None true None None (ClaudeFixture.render [ ClaudeFixture.user ClaudeFixture.promptA 1 ]) |> refusal) + + [] + let ``Claude transcript never turns missing counters into zero`` () = + let line = ClaudeFixture.assistant "msg_z" "req_z" 40 "\"end_turn\"" (ClaudeFixture.usage 1L 2L 3L 4L None) + let withLine (value: string) = ClaudeFixture.render [ ClaudeFixture.user ClaudeFixture.promptA 1; value ] + Assert.True(collectTranscript None true None None (withLine line) |> Result.isOk) + + for field in [ "input_tokens"; "cache_creation_input_tokens"; "cache_read_input_tokens"; "output_tokens" ] do + let missing = line.Replace($"\"{field}\":", $"\"x_{field}\":") + Assert.Contains(field, collectTranscript None true None None (withLine missing) |> refusal) + let nulled = System.Text.RegularExpressions.Regex.Replace(line, $"\"{field}\":[0-9]+", $"\"{field}\":null") + Assert.Contains(field, collectTranscript None true None None (withLine nulled) |> refusal) + + let negative = line.Replace("\"output_tokens\":4", "\"output_tokens\":-4") + Assert.Contains("output_tokens", collectTranscript None true None None (withLine negative) |> refusal) + let excessThinking = ClaudeFixture.assistant "msg_z" "req_z" 40 "\"end_turn\"" (ClaudeFixture.usage 1L 2L 3L 4L (Some 5L)) + Assert.Contains("thinking_tokens", collectTranscript None true None None (withLine excessThinking) |> refusal) + Assert.Contains("version", collectTranscript None true None None (withLine (line.Replace("\"version\":\"2.1.299\",", ""))) |> refusal) + Assert.Contains("prompt identity", collectTranscript None true None None (ClaudeFixture.render [ line ]) |> refusal) + let otherSession = line.Replace(ClaudeFixture.session, "6f0c2a8e-3b1d-4e6f-9a7b-1c2d3e4f5a6b") + Assert.Contains("mixes session", collectTranscript None true None None (ClaudeFixture.render [ ClaudeFixture.user ClaudeFixture.promptA 1; line.Replace("msg_z", "msg_y"); otherSession ]) |> refusal) + + [] + let ``Claude incomplete response is withheld and makes later turn totals unknown`` () = + let streamed = ClaudeFixture.assistant "msg_i" "req_i" 10 "null" (ClaudeFixture.usage 2L 0L 0L 8L None) + let later = ClaudeFixture.assistant "msg_j" "req_j" 20 "\"end_turn\"" (ClaudeFixture.usage 2L 0L 10L 30L None) + let text = ClaudeFixture.render [ ClaudeFixture.user ClaudeFixture.promptA 1; streamed; later ] + // An interrupted stream's tokens are unknown, so neither it nor a later total in its turn is reported. + Assert.Contains("no completed usage record", collectTranscript None true None None text |> refusal) + Assert.Contains("incomplete before response", collectTranscript None false None None text |> refusal) + Assert.Contains("no completed usage record", collectTranscript (Some ClaudeFixture.promptA) true (Some "2026-10-22T05:01:09Z") (Some "2026-10-22T05:01:11Z") text |> refusal) + // A window that excludes the in-flight tail collects the completed responses before it. + let tail = ClaudeFixture.render [ ClaudeFixture.user ClaudeFixture.promptA 1; later; streamed.Replace("05:01:10", "05:01:50") ] + Assert.Contains("no completed usage record", collectTranscript None false None None tail |> refusal) + let before = collectTranscript None true None (Some "2026-10-22T05:01:30Z") tail |> unwrap + Assert.Equal("msg_j", (List.exactlyOne before.Rows).ResponseId) + // Completion after a streaming record is accepted; streaming after completion is refused. + let completed = streamed.Replace("\"stop_reason\":null", "\"stop_reason\":\"end_turn\"") + Assert.True(collectTranscript None true None None (ClaudeFixture.render [ ClaudeFixture.user ClaudeFixture.promptA 1; streamed; completed ]) |> Result.isOk) + Assert.Contains("incomplete record after", collectTranscript None true None None (ClaudeFixture.render [ ClaudeFixture.user ClaudeFixture.promptA 1; completed; streamed ]) |> refusal) + [] let ``lifecycle sealing is canonical and terminal pending usage is refused`` () = let common event at actual tokens = From 9c28aaf574512ec1f1d98e5664cec83e6070e573 Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Thu, 22 Oct 2026 06:21:38 +0200 Subject: [PATCH 2/9] Name the working Claude transcript route in telemetry guidance Refs #4801 Co-Authored-By: Claude Opus 5.5 --- .../pnext-item/references/lifecycle-ledger.md | 33 ++++++++++++------- .../work-roadmap/references/lifecycle-log.md | 8 ++--- .../references/runtime-observation.md | 9 +++++ .../pnext-item/references/lifecycle-ledger.md | 33 ++++++++++++------- .../work-roadmap/references/lifecycle-log.md | 8 ++--- .../references/runtime-observation.md | 9 +++++ registry/coordination-kit-skill-manifest.json | 4 +-- registry/driver-skill-manifest.json | 6 ++-- src/FS.GG.Coord.Cli/README.md | 5 ++- 9 files changed, 79 insertions(+), 36 deletions(-) diff --git a/.agents/skills/pnext-item/references/lifecycle-ledger.md b/.agents/skills/pnext-item/references/lifecycle-ledger.md index 658e25953..efe745b98 100644 --- a/.agents/skills/pnext-item/references/lifecycle-ledger.md +++ b/.agents/skills/pnext-item/references/lifecycle-ledger.md @@ -75,7 +75,7 @@ Each JSONL line is one phase transition. The shared v1 fields are `schema_versio - `tooling` binds `ledger_schema` plus `runtime`, `coordination`, `sdd`, and `contracts` components. Each component records its exact name/version/source or an explicit `unavailable`/`not_applicable` reason. For Codex, take the runtime version from `session_meta.cli_version`; for Claude Code, take it - from status-line `version`. Capture `fsgg-coord --version`, `fsgg-sdd --version`, and the governed + from the transcript assistant record's `version`. Capture `fsgg-coord --version`, `fsgg-sdd --version`, and the governed contracts version at phase start. Historical comparisons must group by the canonicalized `tooling` object; do not blend durations or token rates from different toolchain fingerprints. - `model` records `provider`, exact `name`/variant, optional `effort`, and authoritative `source`. A model @@ -121,15 +121,25 @@ Never append another phase to a receipt whose SHA-256 is already cited. The vali The local Codex JSONL is an internal interface, so the collector validates every required key and fails closed on shape drift. For direct API work, prefer the stable response `usage` object. -Claude Code exposes `session_id`, `prompt_id`, `model.id`, effort, and the latest API response's input, -cache-creation, cache-read, and output usage to a status-line command. Persist those snapshots after each -assistant message. A `Stop` hook runs after the main response finishes and receives `session_id` and -`transcript_path`; use it to append the saved snapshot. `SubagentStop` supplies a separate -`agent_transcript_path`, so subagent usage must remain separate. The collector derives a stable response -identity from session, prompt, timestamp, model, and usage, so repeated hook delivery is idempotent. The status-line value is one latest API -response, not a whole multi-call turn; aggregate only captured requests. Claude's ordinary usage does not -separate reasoning from output, so the report leaves `reasoning` empty rather than guessing. For -non-interactive work, `--output-format json`/`stream-json` or the Agent SDK result is preferred. +Claude Code persists its transcript as JSONL under `~/.claude/projects//.jsonl`. Collect +it with the same selection contract; no status line or hook is required: + +```sh +scripts/fsgg-coord telemetry usage collect claude \ + --session-file --task --turn-id \ + --coord-version --sdd-version --contracts-version \ + --all-responses --append +``` + +The collector emits one row per distinct API response, keyed by `message.id`. It deduplicates the +per-content-block records and binds `requestId`, model, effort, version and timestamp. Input is uncached +plus cache-read plus cache-creation; `reasoning` is `thinking_tokens` only when the response reports it. +`turn_id` is the `promptId` of the nearest preceding user record; turn totals accumulate within that +thread and prompt, and thread totals stay empty. A sidechain record keeps its own derived thread. Disagreeing +repeated usage, malformed or partial lines, oversized input, missing counters and incomplete streaming +responses (`stop_reason` null) are refused, never counted as zero. Collect after the response completes, +or bound a live transcript with `--until`. Public provenance is `claude-transcript-jsonl:sha256:`. +The legacy `--snapshot` status-line input remains accepted, but nothing produces it by default. ### Supervising a completed child @@ -147,7 +157,8 @@ terminal, then: For Codex, a parent may use a unique phase marker only when the child could not return the session/turn identity; multiple matching sessions are an attribution failure, not permission to choose one. For -Claude Code, consume the `SubagentStop` `agent_transcript_path`, never the parent's transcript. A strict +Claude Code, collect the subagent's own transcript, never the parent's; observed hosts write it beside the +session as `/subagents/agent-.jsonl`. A strict post-completion lookup that finds no unique terminal record, or a collector failure caused by internal schema drift, may seal `unavailable` only when the exact lookup and validation failure are recorded. “Final usage is written after this response” proves the state is pending and is forbidden as an diff --git a/.agents/skills/work-roadmap/references/lifecycle-log.md b/.agents/skills/work-roadmap/references/lifecycle-log.md index 8ddf76af9..291a70e54 100644 --- a/.agents/skills/work-roadmap/references/lifecycle-log.md +++ b/.agents/skills/work-roadmap/references/lifecycle-log.md @@ -104,7 +104,7 @@ in `source`. The roadmap driver, as supervising parent, owns every post-child seal. A child returns an unposted terminal draft with `pending final usage` and its exact session/turn identity (or Claude prompt and -`SubagentStop` transcript path). It does not post its own terminal lifecycle event, because the final +transcript path). It does not post its own terminal lifecycle event, because the final usage row does not exist until after that response ends. Once the child is terminal, the driver locates the completed record, runs the strict collector into a phase-scoped immutable receipt, seals the terminal event as `measured`, and only then accepts the handoff. A statement that final usage will be written after @@ -114,9 +114,9 @@ If a legacy immutable event already used the timing excuse, append a separate `telemetry-reconciliation-` recovery phase before host acceptance, cycle completion, or Done. Codex's completed `token_usage_record` rows provide request, turn, and thread totals; matching -`turn_context` rows provide the exact model variant and effort. Claude Code's status-line input provides -the exact model ID and latest-response input/cache/output usage, while `Stop` and `SubagentStop` hooks -provide the post-response lifecycle point and separate transcript paths. The `pnext-item` lifecycle-ledger +`turn_context` rows provide the exact model variant and effort. Claude Code's transcript JSONL provides one +completed usage record per API response (`message.id`) with its exact model and effort; collect it with +`telemetry usage collect claude --session-file`, keeping each subagent's own transcript separate. The `pnext-item` lifecycle-ledger contract carries the equivalent normal-item collection rules. If turn-level usage spans multiple phases, do not allocate or estimate shares. diff --git a/.agents/skills/work-roadmap/references/runtime-observation.md b/.agents/skills/work-roadmap/references/runtime-observation.md index dcf08f92a..af18edb52 100644 --- a/.agents/skills/work-roadmap/references/runtime-observation.md +++ b/.agents/skills/work-roadmap/references/runtime-observation.md @@ -51,6 +51,15 @@ Call the item total proven only after every expected invocation is present, ever outcome and final completed-turn counters, and every submitted batch has an applied Host receipt. Missing, pending or conflicting evidence remains an explicit coverage gap; never infer a total from partial counters. +## Claude Code usage + +Claude Code has no observed launcher or App Server join. Its native usage reaches the same local path from +an explicitly selected transcript: `fsgg-coord-engine telemetry usage collect claude --session-file` for a +phase receipt, or `telemetry passive capture` with a `fsgg.telemetry.passive-selection/1` file naming +`claudeHome` and the selected transcripts below its `projects` directory. Passive rows use provenance +`claude-local-transcript/1`, partial population and unknown attribution. Subagent transcripts stay separate +files and threads; item totals and attribution remain unknown. + ## Record repository-owned dispatches by default This native collaboration route applies when the opt-in `codex-exec` route above was not selected. The launcher diff --git a/.claude/skills/pnext-item/references/lifecycle-ledger.md b/.claude/skills/pnext-item/references/lifecycle-ledger.md index 658e25953..efe745b98 100644 --- a/.claude/skills/pnext-item/references/lifecycle-ledger.md +++ b/.claude/skills/pnext-item/references/lifecycle-ledger.md @@ -75,7 +75,7 @@ Each JSONL line is one phase transition. The shared v1 fields are `schema_versio - `tooling` binds `ledger_schema` plus `runtime`, `coordination`, `sdd`, and `contracts` components. Each component records its exact name/version/source or an explicit `unavailable`/`not_applicable` reason. For Codex, take the runtime version from `session_meta.cli_version`; for Claude Code, take it - from status-line `version`. Capture `fsgg-coord --version`, `fsgg-sdd --version`, and the governed + from the transcript assistant record's `version`. Capture `fsgg-coord --version`, `fsgg-sdd --version`, and the governed contracts version at phase start. Historical comparisons must group by the canonicalized `tooling` object; do not blend durations or token rates from different toolchain fingerprints. - `model` records `provider`, exact `name`/variant, optional `effort`, and authoritative `source`. A model @@ -121,15 +121,25 @@ Never append another phase to a receipt whose SHA-256 is already cited. The vali The local Codex JSONL is an internal interface, so the collector validates every required key and fails closed on shape drift. For direct API work, prefer the stable response `usage` object. -Claude Code exposes `session_id`, `prompt_id`, `model.id`, effort, and the latest API response's input, -cache-creation, cache-read, and output usage to a status-line command. Persist those snapshots after each -assistant message. A `Stop` hook runs after the main response finishes and receives `session_id` and -`transcript_path`; use it to append the saved snapshot. `SubagentStop` supplies a separate -`agent_transcript_path`, so subagent usage must remain separate. The collector derives a stable response -identity from session, prompt, timestamp, model, and usage, so repeated hook delivery is idempotent. The status-line value is one latest API -response, not a whole multi-call turn; aggregate only captured requests. Claude's ordinary usage does not -separate reasoning from output, so the report leaves `reasoning` empty rather than guessing. For -non-interactive work, `--output-format json`/`stream-json` or the Agent SDK result is preferred. +Claude Code persists its transcript as JSONL under `~/.claude/projects//.jsonl`. Collect +it with the same selection contract; no status line or hook is required: + +```sh +scripts/fsgg-coord telemetry usage collect claude \ + --session-file --task --turn-id \ + --coord-version --sdd-version --contracts-version \ + --all-responses --append +``` + +The collector emits one row per distinct API response, keyed by `message.id`. It deduplicates the +per-content-block records and binds `requestId`, model, effort, version and timestamp. Input is uncached +plus cache-read plus cache-creation; `reasoning` is `thinking_tokens` only when the response reports it. +`turn_id` is the `promptId` of the nearest preceding user record; turn totals accumulate within that +thread and prompt, and thread totals stay empty. A sidechain record keeps its own derived thread. Disagreeing +repeated usage, malformed or partial lines, oversized input, missing counters and incomplete streaming +responses (`stop_reason` null) are refused, never counted as zero. Collect after the response completes, +or bound a live transcript with `--until`. Public provenance is `claude-transcript-jsonl:sha256:`. +The legacy `--snapshot` status-line input remains accepted, but nothing produces it by default. ### Supervising a completed child @@ -147,7 +157,8 @@ terminal, then: For Codex, a parent may use a unique phase marker only when the child could not return the session/turn identity; multiple matching sessions are an attribution failure, not permission to choose one. For -Claude Code, consume the `SubagentStop` `agent_transcript_path`, never the parent's transcript. A strict +Claude Code, collect the subagent's own transcript, never the parent's; observed hosts write it beside the +session as `/subagents/agent-.jsonl`. A strict post-completion lookup that finds no unique terminal record, or a collector failure caused by internal schema drift, may seal `unavailable` only when the exact lookup and validation failure are recorded. “Final usage is written after this response” proves the state is pending and is forbidden as an diff --git a/.claude/skills/work-roadmap/references/lifecycle-log.md b/.claude/skills/work-roadmap/references/lifecycle-log.md index 8ddf76af9..291a70e54 100644 --- a/.claude/skills/work-roadmap/references/lifecycle-log.md +++ b/.claude/skills/work-roadmap/references/lifecycle-log.md @@ -104,7 +104,7 @@ in `source`. The roadmap driver, as supervising parent, owns every post-child seal. A child returns an unposted terminal draft with `pending final usage` and its exact session/turn identity (or Claude prompt and -`SubagentStop` transcript path). It does not post its own terminal lifecycle event, because the final +transcript path). It does not post its own terminal lifecycle event, because the final usage row does not exist until after that response ends. Once the child is terminal, the driver locates the completed record, runs the strict collector into a phase-scoped immutable receipt, seals the terminal event as `measured`, and only then accepts the handoff. A statement that final usage will be written after @@ -114,9 +114,9 @@ If a legacy immutable event already used the timing excuse, append a separate `telemetry-reconciliation-` recovery phase before host acceptance, cycle completion, or Done. Codex's completed `token_usage_record` rows provide request, turn, and thread totals; matching -`turn_context` rows provide the exact model variant and effort. Claude Code's status-line input provides -the exact model ID and latest-response input/cache/output usage, while `Stop` and `SubagentStop` hooks -provide the post-response lifecycle point and separate transcript paths. The `pnext-item` lifecycle-ledger +`turn_context` rows provide the exact model variant and effort. Claude Code's transcript JSONL provides one +completed usage record per API response (`message.id`) with its exact model and effort; collect it with +`telemetry usage collect claude --session-file`, keeping each subagent's own transcript separate. The `pnext-item` lifecycle-ledger contract carries the equivalent normal-item collection rules. If turn-level usage spans multiple phases, do not allocate or estimate shares. diff --git a/.claude/skills/work-roadmap/references/runtime-observation.md b/.claude/skills/work-roadmap/references/runtime-observation.md index dcf08f92a..af18edb52 100644 --- a/.claude/skills/work-roadmap/references/runtime-observation.md +++ b/.claude/skills/work-roadmap/references/runtime-observation.md @@ -51,6 +51,15 @@ Call the item total proven only after every expected invocation is present, ever outcome and final completed-turn counters, and every submitted batch has an applied Host receipt. Missing, pending or conflicting evidence remains an explicit coverage gap; never infer a total from partial counters. +## Claude Code usage + +Claude Code has no observed launcher or App Server join. Its native usage reaches the same local path from +an explicitly selected transcript: `fsgg-coord-engine telemetry usage collect claude --session-file` for a +phase receipt, or `telemetry passive capture` with a `fsgg.telemetry.passive-selection/1` file naming +`claudeHome` and the selected transcripts below its `projects` directory. Passive rows use provenance +`claude-local-transcript/1`, partial population and unknown attribution. Subagent transcripts stay separate +files and threads; item totals and attribution remain unknown. + ## Record repository-owned dispatches by default This native collaboration route applies when the opt-in `codex-exec` route above was not selected. The launcher diff --git a/registry/coordination-kit-skill-manifest.json b/registry/coordination-kit-skill-manifest.json index a01c3a74f..adaeb4932 100644 --- a/registry/coordination-kit-skill-manifest.json +++ b/registry/coordination-kit-skill-manifest.json @@ -132,7 +132,7 @@ { "id": "pnext-item", "supplied-by": ".claude/skills/pnext-item", - "tree-sha256": "f98c47fa00ae2d8481a967afa9d1a2987906a5b0223c181fafdf7eb8cc10ce7e", + "tree-sha256": "b2a167131800c2bd9545c3c8794cf5cc31eed77cc179b942b1ffb65268d2c57c", "files": [ { "path": "SKILL.md", @@ -171,7 +171,7 @@ }, { "path": "references/lifecycle-ledger.md", - "sha256": "5bb91039adc253c5c2cd1eba78b7cee98933f27fee1b06d43979216c68930009", + "sha256": "566c863a46c7e5fce98c439e421e8651c1070a84b369655e193d14638dcf0100", "executable": false }, { diff --git a/registry/driver-skill-manifest.json b/registry/driver-skill-manifest.json index 4523dba29..86bad183f 100644 --- a/registry/driver-skill-manifest.json +++ b/registry/driver-skill-manifest.json @@ -1825,7 +1825,7 @@ "id": "work-roadmap", "scope": "driver", "sha256": "48ee31933a1eb4114cf177bda85d8b7bb5bf0310b396b3915ebb85c214ac3f2e", - "tree-sha256": "4b21404bff41e2972d2622029886642ba4eb58b7e41361d532cf72a74b0a1af7", + "tree-sha256": "301d1668e2aefc840d33b0f0cad659a29ad3e486989f21bee8c90b74dfecbad7", "files": [ { "path": "SKILL.md", @@ -1869,7 +1869,7 @@ }, { "path": "references/lifecycle-log.md", - "sha256": "86452edc1985dd73b77ce06c1623306100ddc7fd415127d7b2394f7d32103700", + "sha256": "91f454e1c2cc2fb8b03086b761327f0aef2a0c6a3ee259ea117352d4352b0182", "executable": false }, { @@ -1889,7 +1889,7 @@ }, { "path": "references/runtime-observation.md", - "sha256": "61b6bc611b5cafe1a96dd39789e5a257a609f720fb0acaf32091154f7b90d8d9", + "sha256": "fe6e5ef7c1a903e2373e68c797543dbfe95373e0e4185c40d3f5dfd0b445e330", "executable": false } ], diff --git a/src/FS.GG.Coord.Cli/README.md b/src/FS.GG.Coord.Cli/README.md index 2b6683e2f..ce213a5d9 100644 --- a/src/FS.GG.Coord.Cli/README.md +++ b/src/FS.GG.Coord.Cli/README.md @@ -96,7 +96,10 @@ An unreachable answer is not a negative one. That rule is the whole point. 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 +retains one CSV header and ignores an already-recorded response identity. Both runtimes read a native +session JSONL through `--session-file` with `--turn-id`, `--all-responses`, `--since` and `--until`; for +Claude Code that is the transcript, one row per completed `message.id` (the legacy `--snapshot` status-line +input remains). 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 From ae56d90bfaf6f50a17c0f00bfb82b7984eb62505 Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Thu, 22 Oct 2026 06:26:43 +0200 Subject: [PATCH 3/9] Capture the Claude transcript usage lesson in Atlas Refs #4801 Co-Authored-By: Claude Opus 5.5 --- .agents/skills/atlas/assets/seed/catalog.json | 2 +- ...124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json | 1 + .claude/skills/atlas/assets/seed/catalog.json | 2 +- ...124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json | 1 + docs/atlas/catalog.json | 2 +- ...124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json | 1 + registry/driver-skill-manifest.json | 9 +++++++-- 7 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 .agents/skills/atlas/assets/seed/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json create mode 100644 .claude/skills/atlas/assets/seed/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json create mode 100644 docs/atlas/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json diff --git a/.agents/skills/atlas/assets/seed/catalog.json b/.agents/skills/atlas/assets/seed/catalog.json index e0f679c2e..39039d1a3 100644 --- a/.agents/skills/atlas/assets/seed/catalog.json +++ b/.agents/skills/atlas/assets/seed/catalog.json @@ -1 +1 @@ -{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} +{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} diff --git a/.agents/skills/atlas/assets/seed/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json b/.agents/skills/atlas/assets/seed/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json new file mode 100644 index 000000000..18b029165 --- /dev/null +++ b/.agents/skills/atlas/assets/seed/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json @@ -0,0 +1 @@ +{"citations":[{"path":"src/FS.GG.Coord.Core/Telemetry.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"cfe7eb7d4e26dff2e220d8e87bfe13d2a2e122349d275df6371f53d42d6a81bf"},{"path":"src/FS.GG.Coord.Cli/SkillTelemetryReaders.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"2e48229f7e48ea3c52017073e30b36daf48ee529771b91e3eb002d1c66bdd29b"},{"path":"src/FS.GG.Coord.Core/TelemetryStore.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"0f852fd75475cae72e9b1b09213a6cf11fa86d58377e06eca652396d26feb402"},{"path":".claude/skills/pnext-item/references/lifecycle-ledger.md","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"566c863a46c7e5fce98c439e421e8651c1070a84b369655e193d14638dcf0100"},{"path":"tests/FS.GG.Coord.Core.Tests/TelemetryTests.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"dd2c3a3133ce186712f8ed5535f65410ed0202de06b33a56318daf58a02b5078"}],"conflictsWith":[],"id":"github/claude-transcript-native-usage","kind":"lesson","recordedAt":"2026-10-22T04:21:44Z","repository":"FS-GG/.github","schema":"fsgg.atlas/1","status":"recorded","summary":"Source for #4801 (unmerged at capture) reads Claude Code transcript JSONL through the existing usage and passive paths without a new wire schema: `telemetry usage collect claude --session-file` uses the Codex --turn-id/--all-responses/--since/--until contract, and a fsgg.telemetry.passive-selection/1 file naming claudeHome feeds provider-usage-observation/1 with provenance claude-local-transcript/1 and identity namespace claude-transcript/1. The legacy --snapshot input stays; nothing produces it by default.\n\nMeasured on one host, Claude Code 2.1.299 (shape only; no transcript content retained): usage repeats per content block. The main-thread writer emits only completed records (stop_reason set) with identical usage. The subagent writer streams; per-block records carry stop_reason null and provisional output_tokens without thinking_tokens before one completed record, and 11 of 17 message ids disagreed. Deduplicate on completed records only, and refuse when completed repeats disagree. A response with no completed record is withheld and makes later totals in its turn unknown, never zero. Every user record, including tool results, carries promptId. Assistant records do not, so turn_id is the promptId of the nearest preceding user record at completion; this agreed with parentUuid resolution for all 209 measured records. In a subagent transcript promptId tracks the session's current prompt rather than the subagent task. Subagent transcripts were observed at /subagents/agent-.jsonl beside a .meta.json, sharing the parent sessionId with isSidechain true and agentId. Readers take an explicit file and give each sidechain a derived version-8 thread identity; the path is an observation, not a contract. The passive cursor retains the prompt context so resumed passes attribute like a full read; its digest excludes per-block timestamps so identical repeats are not corrections.\n\nUnknown: whether status-line payloads still carry prompt_id/timestamp; older transcripts lacking promptId, isSidechain or agentId fail closed. --since/--until compare timestamps ordinally, so 05:01:30.000Z sorts before 05:01:30Z, as with Codex. Receiver admission of the new provenance needs a Host built from this source. Installed adoption, Host ingestion and display remain with #4640.","supersedes":[],"tags":["telemetry","claude","transcript","usage","passive","subagent","dedupe","parity","fail-closed"],"title":"Claude Code native usage comes from completed transcript records, not status-line snapshots"} diff --git a/.claude/skills/atlas/assets/seed/catalog.json b/.claude/skills/atlas/assets/seed/catalog.json index e0f679c2e..39039d1a3 100644 --- a/.claude/skills/atlas/assets/seed/catalog.json +++ b/.claude/skills/atlas/assets/seed/catalog.json @@ -1 +1 @@ -{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} +{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} diff --git a/.claude/skills/atlas/assets/seed/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json b/.claude/skills/atlas/assets/seed/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json new file mode 100644 index 000000000..18b029165 --- /dev/null +++ b/.claude/skills/atlas/assets/seed/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json @@ -0,0 +1 @@ +{"citations":[{"path":"src/FS.GG.Coord.Core/Telemetry.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"cfe7eb7d4e26dff2e220d8e87bfe13d2a2e122349d275df6371f53d42d6a81bf"},{"path":"src/FS.GG.Coord.Cli/SkillTelemetryReaders.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"2e48229f7e48ea3c52017073e30b36daf48ee529771b91e3eb002d1c66bdd29b"},{"path":"src/FS.GG.Coord.Core/TelemetryStore.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"0f852fd75475cae72e9b1b09213a6cf11fa86d58377e06eca652396d26feb402"},{"path":".claude/skills/pnext-item/references/lifecycle-ledger.md","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"566c863a46c7e5fce98c439e421e8651c1070a84b369655e193d14638dcf0100"},{"path":"tests/FS.GG.Coord.Core.Tests/TelemetryTests.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"dd2c3a3133ce186712f8ed5535f65410ed0202de06b33a56318daf58a02b5078"}],"conflictsWith":[],"id":"github/claude-transcript-native-usage","kind":"lesson","recordedAt":"2026-10-22T04:21:44Z","repository":"FS-GG/.github","schema":"fsgg.atlas/1","status":"recorded","summary":"Source for #4801 (unmerged at capture) reads Claude Code transcript JSONL through the existing usage and passive paths without a new wire schema: `telemetry usage collect claude --session-file` uses the Codex --turn-id/--all-responses/--since/--until contract, and a fsgg.telemetry.passive-selection/1 file naming claudeHome feeds provider-usage-observation/1 with provenance claude-local-transcript/1 and identity namespace claude-transcript/1. The legacy --snapshot input stays; nothing produces it by default.\n\nMeasured on one host, Claude Code 2.1.299 (shape only; no transcript content retained): usage repeats per content block. The main-thread writer emits only completed records (stop_reason set) with identical usage. The subagent writer streams; per-block records carry stop_reason null and provisional output_tokens without thinking_tokens before one completed record, and 11 of 17 message ids disagreed. Deduplicate on completed records only, and refuse when completed repeats disagree. A response with no completed record is withheld and makes later totals in its turn unknown, never zero. Every user record, including tool results, carries promptId. Assistant records do not, so turn_id is the promptId of the nearest preceding user record at completion; this agreed with parentUuid resolution for all 209 measured records. In a subagent transcript promptId tracks the session's current prompt rather than the subagent task. Subagent transcripts were observed at /subagents/agent-.jsonl beside a .meta.json, sharing the parent sessionId with isSidechain true and agentId. Readers take an explicit file and give each sidechain a derived version-8 thread identity; the path is an observation, not a contract. The passive cursor retains the prompt context so resumed passes attribute like a full read; its digest excludes per-block timestamps so identical repeats are not corrections.\n\nUnknown: whether status-line payloads still carry prompt_id/timestamp; older transcripts lacking promptId, isSidechain or agentId fail closed. --since/--until compare timestamps ordinally, so 05:01:30.000Z sorts before 05:01:30Z, as with Codex. Receiver admission of the new provenance needs a Host built from this source. Installed adoption, Host ingestion and display remain with #4640.","supersedes":[],"tags":["telemetry","claude","transcript","usage","passive","subagent","dedupe","parity","fail-closed"],"title":"Claude Code native usage comes from completed transcript records, not status-line snapshots"} diff --git a/docs/atlas/catalog.json b/docs/atlas/catalog.json index e0f679c2e..39039d1a3 100644 --- a/docs/atlas/catalog.json +++ b/docs/atlas/catalog.json @@ -1 +1 @@ -{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} +{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} diff --git a/docs/atlas/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json b/docs/atlas/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json new file mode 100644 index 000000000..18b029165 --- /dev/null +++ b/docs/atlas/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json @@ -0,0 +1 @@ +{"citations":[{"path":"src/FS.GG.Coord.Core/Telemetry.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"cfe7eb7d4e26dff2e220d8e87bfe13d2a2e122349d275df6371f53d42d6a81bf"},{"path":"src/FS.GG.Coord.Cli/SkillTelemetryReaders.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"2e48229f7e48ea3c52017073e30b36daf48ee529771b91e3eb002d1c66bdd29b"},{"path":"src/FS.GG.Coord.Core/TelemetryStore.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"0f852fd75475cae72e9b1b09213a6cf11fa86d58377e06eca652396d26feb402"},{"path":".claude/skills/pnext-item/references/lifecycle-ledger.md","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"566c863a46c7e5fce98c439e421e8651c1070a84b369655e193d14638dcf0100"},{"path":"tests/FS.GG.Coord.Core.Tests/TelemetryTests.fs","repository":"FS-GG/.github","revision":"9c28aaf574512ec1f1d98e5664cec83e6070e573","sha256":"dd2c3a3133ce186712f8ed5535f65410ed0202de06b33a56318daf58a02b5078"}],"conflictsWith":[],"id":"github/claude-transcript-native-usage","kind":"lesson","recordedAt":"2026-10-22T04:21:44Z","repository":"FS-GG/.github","schema":"fsgg.atlas/1","status":"recorded","summary":"Source for #4801 (unmerged at capture) reads Claude Code transcript JSONL through the existing usage and passive paths without a new wire schema: `telemetry usage collect claude --session-file` uses the Codex --turn-id/--all-responses/--since/--until contract, and a fsgg.telemetry.passive-selection/1 file naming claudeHome feeds provider-usage-observation/1 with provenance claude-local-transcript/1 and identity namespace claude-transcript/1. The legacy --snapshot input stays; nothing produces it by default.\n\nMeasured on one host, Claude Code 2.1.299 (shape only; no transcript content retained): usage repeats per content block. The main-thread writer emits only completed records (stop_reason set) with identical usage. The subagent writer streams; per-block records carry stop_reason null and provisional output_tokens without thinking_tokens before one completed record, and 11 of 17 message ids disagreed. Deduplicate on completed records only, and refuse when completed repeats disagree. A response with no completed record is withheld and makes later totals in its turn unknown, never zero. Every user record, including tool results, carries promptId. Assistant records do not, so turn_id is the promptId of the nearest preceding user record at completion; this agreed with parentUuid resolution for all 209 measured records. In a subagent transcript promptId tracks the session's current prompt rather than the subagent task. Subagent transcripts were observed at /subagents/agent-.jsonl beside a .meta.json, sharing the parent sessionId with isSidechain true and agentId. Readers take an explicit file and give each sidechain a derived version-8 thread identity; the path is an observation, not a contract. The passive cursor retains the prompt context so resumed passes attribute like a full read; its digest excludes per-block timestamps so identical repeats are not corrections.\n\nUnknown: whether status-line payloads still carry prompt_id/timestamp; older transcripts lacking promptId, isSidechain or agentId fail closed. --since/--until compare timestamps ordinally, so 05:01:30.000Z sorts before 05:01:30Z, as with Codex. Receiver admission of the new provenance needs a Host built from this source. Installed adoption, Host ingestion and display remain with #4640.","supersedes":[],"tags":["telemetry","claude","transcript","usage","passive","subagent","dedupe","parity","fail-closed"],"title":"Claude Code native usage comes from completed transcript records, not status-line snapshots"} diff --git a/registry/driver-skill-manifest.json b/registry/driver-skill-manifest.json index 86bad183f..d5ab09ca3 100644 --- a/registry/driver-skill-manifest.json +++ b/registry/driver-skill-manifest.json @@ -5,7 +5,7 @@ "id": "atlas", "scope": "driver", "sha256": "c18e56fcc56abf80903e2fc6829cd94b44f42947724a26318ebcbf1ac5e1b35b", - "tree-sha256": "b8b21621e25170e47bcc3d679fa35375bdd5756b105323bd40af6ca79dd23063", + "tree-sha256": "2434cf59f44914179a30befa0233cb9dabbd6b05d8f0275f78727bdffc82bebc", "files": [ { "path": "SKILL.md", @@ -24,7 +24,7 @@ }, { "path": "assets/seed/catalog.json", - "sha256": "6570c9ba2f7106d433141b292d2371cebfd4c3c393f090412204f7f49adaf933", + "sha256": "71c9394403f6c9e9e5d1efb8438a6683cfc3eab68784034c9904c00a5918ed57", "executable": false }, { @@ -477,6 +477,11 @@ "sha256": "4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c", "executable": false }, + { + "path": "assets/seed/records/4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d.json", + "sha256": "4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d", + "executable": false + }, { "path": "assets/seed/records/4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb.json", "sha256": "4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb", From 6eb30be318d0eacde220ffdc5ba7b7aee7a22c0e Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Thu, 22 Oct 2026 06:33:33 +0200 Subject: [PATCH 4/9] Keep implementation comments out of doc siting and link the reader probe to Core Refs #4801 Co-Authored-By: Claude Opus 5.5 --- src/FS.GG.Coord.Core/Telemetry.fs | 2 +- tests/skill-fsharp/readers/ReadersProbe.fsproj | 2 ++ tests/skill-fsharp/readers/packages.lock.json | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/FS.GG.Coord.Core/Telemetry.fs b/src/FS.GG.Coord.Core/Telemetry.fs index 63b71ea7b..056a3bb3f 100644 --- a/src/FS.GG.Coord.Core/Telemetry.fs +++ b/src/FS.GG.Coord.Core/Telemetry.fs @@ -717,7 +717,7 @@ module RuntimeUsage = type private ClaudeEntry = { First: ClaudeTranscript.Response - /// The prompt identity in force at the response's first record, which owns an incomplete response. + // The prompt identity in force at the response's first record, which owns an incomplete response. StartTurn: string option // The prompt identity in force at the response's first completed record; incomplete streaming records // and later tool results never move it. diff --git a/tests/skill-fsharp/readers/ReadersProbe.fsproj b/tests/skill-fsharp/readers/ReadersProbe.fsproj index 9e87d4e0f..995ba745d 100644 --- a/tests/skill-fsharp/readers/ReadersProbe.fsproj +++ b/tests/skill-fsharp/readers/ReadersProbe.fsproj @@ -6,6 +6,8 @@ + + diff --git a/tests/skill-fsharp/readers/packages.lock.json b/tests/skill-fsharp/readers/packages.lock.json index 68b5933fa..b63e58ca6 100644 --- a/tests/skill-fsharp/readers/packages.lock.json +++ b/tests/skill-fsharp/readers/packages.lock.json @@ -7,6 +7,12 @@ "requested": "[10.1.401, )", "resolved": "10.1.401", "contentHash": "/lvOK51KD8IangBYkfDVna3/HrE/r4VUnX3dI01KDspctoYXmind3POeoYkqWKeXHwiKlf6Hc9TxwSnoSCWcjw==" + }, + "fs.gg.coord.core": { + "type": "Project", + "dependencies": { + "FSharp.Core": "[10.1.401, )" + } } } } From 1552a12ffbfb3dbda1c29ec35e7098bde31ae4a8 Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Thu, 22 Oct 2026 06:34:43 +0200 Subject: [PATCH 5/9] Prove a rotated Claude transcript restarts without carried prompt context Refs #4801 Co-Authored-By: Claude Opus 5.5 --- .../WorkspaceTelemetryApplicationTests.fs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/FS.GG.Coord.Cli.Tests/WorkspaceTelemetryApplicationTests.fs b/tests/FS.GG.Coord.Cli.Tests/WorkspaceTelemetryApplicationTests.fs index 040cef9ea..62e5ef8a4 100644 --- a/tests/FS.GG.Coord.Cli.Tests/WorkspaceTelemetryApplicationTests.fs +++ b/tests/FS.GG.Coord.Cli.Tests/WorkspaceTelemetryApplicationTests.fs @@ -624,7 +624,17 @@ module WorkspaceTelemetryApplicationTests = Assert.Contains("partial-tail-deferred", tail.Diagnostics) Assert.Equal(int64 (Encoding.UTF8.GetByteCount complete), tail.Cursor.Offset) File.AppendAllText(path, "\n") - Assert.Single((scan (Some tail.Cursor)).Records) |> ignore + let completedTail = scan (Some tail.Cursor) + Assert.Single completedTail.Records |> ignore + // A rotated source is a continuity gap: a new generation rereads from the start with no carried + // prompt context, so the replacement's responses are attributed only by its own prompts. + File.Move(path, path + ".old") + File.WriteAllText(path, claudeResponse "msg_r" 2 "\"end_turn\"" 9L) + let rotated = scan (Some completedTail.Cursor) + Assert.Contains("source-continuity-gap", rotated.Diagnostics) + Assert.NotEqual(completedTail.Cursor.Generation, rotated.Cursor.Generation) + Assert.Empty rotated.Records + Assert.Contains("turn-identity-unavailable", rotated.Diagnostics) // Only files below the selected Claude projects root are readable. let outside = Path.Combine(home, "session.jsonl") File.WriteAllText(outside, complete) From 3e5faf50f2fb5e29741b2cfbd0047e63d210106b Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Thu, 22 Oct 2026 07:15:52 +0200 Subject: [PATCH 6/9] Compose Claude Code usage capture into coherent113 source The PR edits packaged pnext-item/work-roadmap kit guidance and the CLI, so kit-published-coherence pr-arm requires the coherent-set scalar to lead published 0.112.0. Source only; publication and installed pins remain separate, as for #4793. Co-Authored-By: Claude Opus 5.5 --- Directory.Build.props | 4 +++- registry/CHANGELOG.md | 8 ++++++++ registry/dependencies.yml | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index f2b8c5b7a..1e262581a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -630,8 +630,10 @@ Source readiness only; published110 and installed adoption remain separate. --> + - 0.112.0 + 0.113.0 diff --git a/registry/CHANGELOG.md b/registry/CHANGELOG.md index f36c12817..5d31496d2 100644 --- a/registry/CHANGELOG.md +++ b/registry/CHANGELOG.md @@ -1,5 +1,13 @@ # Registry changelog +## 2026-10-22 — prospective coherent113 Claude Code usage capture (#4801) + +Select SOURCE0.113.0 for CLI/Kit/Drivers over published112 to carry the Claude Code +transcript usage reader, `telemetry usage collect claude --session-file`, passive +`claude-local-transcript/1` capture and the corrected packaged pnext-item/work-roadmap +guidance. Published package version/tag and installed pins remain112; no candidate or +publication is authorized by this source change. + ## 2026-10-21 — prospective coherent112 canonical skill routing (#4789) Select SOURCE0.112.0 for CLI/Kit/Drivers over genuine promoted111, with the distinct diff --git a/registry/dependencies.yml b/registry/dependencies.yml index 6c2fd7877..89e034fa6 100644 --- a/registry/dependencies.yml +++ b/registry/dependencies.yml @@ -3,7 +3,7 @@ # versions are coherent. A `contract-change` issue MUST update this file as part of # its resolution. Human projection: docs/registry/compatibility.md. schemaVersion: 2 # → 2 (.github#1114, SDD#508 step 3): `consumers` becomes "required, may be EMPTY" — a present-but-empty `consumers: []` is now a legal, honest value for a package-bearing contract that nothing restores (the `new-sdd-workspace` scaffolder). Schema growth under #686 / ADR-0015; the FS.GG.SDD.Cli validator pin in contract-coherence.yml advances to 0.13.0 with this bump (publish-before-flip, ADR-0037: SDD published the three-state validator FIRST, in SDD#512/#516). -updated: "2026-10-21" # Changelog moved to registry/CHANGELOG.md (.github#129 / review M4): prepend one dated entry there per change and set this date to match. Kept short deliberately — the typed validator does not read this comment. +updated: "2026-10-22" # Changelog moved to registry/CHANGELOG.md (.github#129 / review M4): prepend one dated entry there per change and set this date to match. Kept short deliberately — the typed validator does not read this comment. repos: fsquint: { name: FsQuint, role: "Independent public Quint–F# decoding, replay and optional tooling" } @@ -967,7 +967,7 @@ contracts: # release416724931 and all16/final33 were independently accepted2026-10-18T22:19:39Z under #4682. # Published source75ab98dd28b1a818cc3986d595bf21e0fe691ec6 is immutable; later source prep is not in that archive. # Installed/discovery, binding5/schema3 migration and consumer/restart/rollback acceptance remain separate. - version: "0.112.0" # SOURCE/PUBLISHED #4789: immutable d5af6a987e915bd0a1b572bcc09ad0d4b2e798b5 is accepted on both feeds; selected SDD/Codex adoption remains separate. PRIOR SOURCE: SOURCE ONLY #4789, published111 retained; prospective skill-routing112 is not publication/adoption. PRIOR SOURCE/PUBLISHED: coherent111 immutable sourcebd60a97a422c8fc8ca0c17b2a9dea4e504b708d2 is published and root-accepted. Exact inactive public111 installation, absolute111 full56 read and selected operator instruction bytes are accepted separately; no global selector/fleet or numerical benefit claim. PRIOR: SOURCE ONLY: #4743 operation-specific admission and source/ref/preflight guidance; normal coherent111 readiness over completed110. Published110/installed pins unchanged. PRIOR SOURCE/PUBLISHED: mandatory Status lifecycle and finite read-only observer, published from immutable source42cd9e7c8505f7cd72d5a22ad424a27af6d51458. Postpublication registry/pin maintenance does not repack that release. Installed instruction/caller adoption and ordinary observer acceptance remain separately owned by #4731/#4730. PRIOR: SOURCE PREPARATION ONLY: mandatory Status lifecycle reconciliation; coherent Kit/Drivers/CLI source successor. Publication and installed adoption remain separately unselected; current published109 custody is unchanged. PRIOR source scalar: immutable published109 source0d85830e7329a2718ee57ff0f1a16e6c751a469c. Later source knowledge/observer records do not repack that artifact. PRIOR: SOURCE PREPARATION ONLY: continuous board clearing, canonical native intake and complete Delivery acceptance plus bounded full-cohort acquisition (#4701/#4702). MINOR receiver-visible behavior; publication/installed/native acceptance pending. Published108 and original journal26 remain immutable. PRIOR SOURCE/PUBLISHED: genuine candidate39233536189 and same-journal forward39238215850 completed33generations/all16effects; promoted release417149016 at f984a361. Actual installed/native qualification remains separate. PRIOR SOURCE PREPARATION: successor planning read-budget repair; publication and installed qualification pending. Published107 remains unchanged. PRIOR HISTORICAL SOURCE PREPARATION: canonical work-board coordinator, explicit outcome/delivery binding5/schema3/inspection3 and integrator2, bounded migration and progress. Source delivery #4677 under #4641; independent coherent107 publication, installed caller adoption and native schema/enrollment/view acceptance remain separate. Accepted binding4/schema2/inspection2 stays unchanged; retained105 qualification is historical scope. Later selector106 observation has unknown change timing and proves neither whole runtime nor instruction discovery. Published106 pins stay unchanged. PRIOR SOURCE/PUBLISHED: exact source 2e42faaa994367b9f50be87439e8fd973ad21501, candidate 39124245029, same-journal forward 39130246438 accepted all 16 effects at final generation 33 and release 416441527. Active installed 0.105 and board binding unchanged; Host receiver adoption remains separate. PRIOR SOURCE PREPARATION: SOURCE PREPARATION ONLY: prospective coherent 0.106.0 over published 0.105.0 for passive native observation; candidate/publication/installation unselected, both-feed collision guards remain required. Published package-version/tag and active board pin stay 0.105.0. PRIOR CURRENT SOURCE/PUBLISHED: coherent-set/v0.105.0, exact candidate e54a59885580c894c8fbc67b0b27af3571ea9883; original candidate39095711219/a1 and publisher resume39098313280/a1 accepted; initial39096861301 remains an incomplete generation14 checkpoint. Maintained developer update and exact82-member installed105 payload correspondence accepted; board migration, binding and consumer acceptance remain separately scoped. PRIOR source0.104.0 is published from immutable candidate 912eba8bbd707dabcbc5011d508c479109010b71; executor 5a2d13d0 is the continuation controller only. HISTORICAL SOURCE PREPARATION: SOURCE PREPARATION ONLY: current programme migration and prospective release-specific .103 suspension; literal utel-rel-22 selection grants no allocation/publication/installed authority. Original .103 tag:intent remains Unknown with all reservations preserved. Published package-version/tag stay0.102.0. PRIOR 0.103 SOURCE PREPARATION ONLY: receiver-first bounded CI continuation and authenticated suite graphs; original utel-rel-21 effects remain unresolved, original0.102/utel-rel-20 recovery is frozen. PRIOR SOURCE/PUBLISHED: coherent-set/v0.101.0 source79051e56b025dadfc6fcaabd58b79e33f2854928, original publisher38094091013/a1; canonical generation33/all16 effects and independent both-feed CLI/Kit/Drivers payloads accepted. Installed adoption, current channel, collector activation and adapter SDK pairing remain separate. PRIOR SOURCE PREPARATION ONLY: exact CI attribution/native association and additive immutable causal receiver; selected utel-rel-19 source rail, packed receiver qualification/publication/adoption pending. Published package-version/tag remain0.100.0; current14 and local receiver-first boundary, no Host dependency. PRIOR SOURCE/PUBLISHED: coherent-set/v0.100.0 at 3ed8ad419a64253ca6f665e9779e5e4d110f50a5; retained original manifest and both-feed payload readbacks verified, stable channel promoted. Installed payload identity82/82 matches; global collector activation and genuine usage unverified, original UTEL19 custody unknown. PRIOR SOURCE ONLY: breaking current receipt ABI, current14 init/restore, explicit13 maintenance and scoped14 dashboard; prospective utel-rel-18, collision/qualification/publication pending. PRIOR SOURCE PREPARATION: 0.99.1 compatible bounded private dispatch-state IO; proposed utel-rel-17. Published frontier0.99.0; no new publication/adoption. PRIOR SOURCE ONLY: EFF schema14, prospective assessment gate and closed Drivers helper inputs. Not published/installed; package frontier remains0.98.0 and immutable utel-rel-15. Independent Host0.5 required for Store14 collection; native pilot/package qualification pending. PRIOR SOURCE/PUBLISHED: verified coherent 0.98.0 at producer 3d4f7e9c6337fb020e269e632653de0faeef6d72, journal utel-rel-15 and publisher 37434982959. PRIOR SOURCE SELECTION: additive schema 13 CI attribution correction and native compact/3 report contract; exact-source integration/qualification remains required. Published frontier remains accepted0.97.1 from99ea75286f5c3cea2a261fef4e5b45cd70378185; consumedutel-rel-13 and historical0.97.2/utel-rel-14 source are preserved. SOURCE/PUBLISHED: compatible equal feature/item telemetry fact identity and native agent binding repairs (PRs 4242/4243/4245); accepted coherent-set/v0.97.1 producer 99ea75286f5c3cea2a261fef4e5b45cd70378185 has both-feed verification. Installed root adoption and the fresh two-fact local cycle are scoped acceptance; historical and unsupported usage remain unknown. PRIOR 0.97.0 SOURCE/PUBLISHED: COORD-BOARD-V2-01.5 product adapter and guidance; publisher 37235030417 promoted exact source 2ab0c0ff9f37bdec9a11ba3604ebdc230711934f with all 16 journal effects verified and both-feed payload readback. Installed product adoption remains separate. PRIOR 0.96.0 SOURCE/PUBLISHED: UTEL-H3 coherent successor carries telemetry CI legacy-default selection repair from PR #4152 (a0044731f432b9f3f7dffa4f9d0a0c85eebb8a1b); publisher 37161212706 promoted exact source f891b5b0723070c67e08d1a87b7d12b0b4d8bebe; installed selections and receiver adoption remain separate. PRIOR 0.95.0 SOURCE/PUBLISHED — MINOR coherent successor for bounded read-only board-v2 inspection and gated organization guidance; publisher 37071597534 promoted exact source 3b5de3367f8647cea0cd9366b8cb11eddf53feae with all 16 protected-journal effects verified; installed qualification and four-target Board adoption remain pending. PRIOR 0.94.0 SOURCE/PUBLISHED — MINOR, Drivers removes the retired Python skill-helper implementations from both mirrored skill roots and the compatibility wrapper after supported callers moved to packaged F# commands; installed-package verification rejects reintroduction; includes protected native learning capture and export accumulated since 0.93.0; immutable coherent-set/v0.94.0 was promoted from source 337b6a1d53571b07ca8e1417e18e52546ad319a7 after exact both-feed readback; receiver adoption remains separate. PRIOR 0.93.0 SOURCE/PUBLISHED — MINOR, supported skill callers use packaged F# telemetry and preflight commands; includes protected native telemetry collection provenance accumulated since 0.92.0; immutable coherent release github:0.93.0 was promoted from source d53d5c4fa0a54894da87e96ae2999288fb280ea5 after protected both-feed readback; no receiver adoption is claimed. PRIOR 0.92.0 SOURCE/PUBLISHED — MINOR, additive bounded read-only `skill telemetry-config discover` for installed workflows; immutable coherent release github:0.92.0 was promoted from source eb0f73186a07daf26e0f7bb5d4c1ee2054a8adaf after exact both-feed readback; no receiver adoption is claimed. PRIOR 0.91.5 SOURCE PREPARED — FSharp.Core 10.1.401 and compatible telemetry/driver updates; package-version remains published 0.91.4 until both-feed promotion. PRIOR 0.91.4 SOURCE/PUBLISHED — coherent telemetry-capable set from f0b1bb8748cbb7b27aeaf7346b8690c82ed03343; PRIOR 0.89.0 SOURCE/PUBLISHED — MINOR, FS.GG.Drivers adds the content-addressed installed routine policy, helper and native-check closure; immutable coherent release github:0.89.0 was promoted from source 535970a06055dfcdbb96aad8726b4d7d981a5b72 after exact both-feed readback. PRIOR 0.88.0 SOURCE/PUBLISHED — MINOR, independently activated private telemetry, source-free scoped dashboard, durable receipt transport, release qualification, and intake-audit hardening. Immutable tags `coord-engine/v0.88.0` and `coherent-set/v0.88.0` resolve the accepted source d77fe195bc4e133ace8763c2158834410ca72bc0. PRIOR 0.87.0 SOURCE PREPARED — MINOR, prospective private SQLite telemetry, repository-owned Codex lifecycle observation, exact-head CI reconciliation, native outcomes, and derived whole-item budget inputs (UTEL-06.1–06.4, .github#3360–#3363). Published from exact source bffc370933ec4f35af2af4acf5f72b5888844365 and promoted after both-feed verification. PRIOR 0.86.1 SOURCE/PUBLISHED — PATCH, routed board drivers reserve the three-round fresh implementer/critic repair chain for strict items so admitted routine work remains reduced through repair (.github#3338); immutable coherent release github:0.86.1 is promoted from source ce6edfd8e3f569867e6809ca3933c6ae65769a1d with content sha256:ccea15d2acd633188f34bdaa9761137538dd834fafa43cda185dbf90c473307c. PRIOR 0.86.0 SOURCE/PUBLISHED — MINOR, reduced one-owner routine route; immutable coherent release github:0.86.0 is promoted from source beb3456ecb2c4b4cadb6bc8dc268598246449aaf with content sha256:01d0c921ab23b6807e1d6da1a9c623cd0cfb5a595bf790b51662746a0681b974. PRIOR 0.85.2 SOURCE/PUBLISHED — PATCH, guarded two-phase implementation landing accepts a missing closing keyword only under an exact typed positive acceptance-receipt obligation and fresh same-item authority, while terminal completion remains reserved for the canonically closing receipt PR (.github#3286); immutable coherent release github:0.85.2 is promoted from source e94f7da34e2c3792a2c532a4969123fd26fd601b with content sha256:3fb04e68d9b90dff5d37f3ad9d0533346cf753444effdb6de5721191557d58fa. PRIOR 0.85.1 SOURCE/PUBLISHED — PATCH, acceptance survives a forward-only, complete, path-disjoint base advance while changed candidates, conflicts, relevant overlap, and unverifiable equivalence remain fail-closed (.github#3274); immutable coherent release github:0.85.1 is promoted from source 503a07d24a6087c549bc47b5322d6f05cce2a6c5 with content sha256:f0f3706c755c767c9f761c993bb01f7a9c52c08cd74d504c1de7322aadaf471c. PRIOR 0.85.0 SOURCE/PUBLISHED — MINOR, human-authorized scope-bound synthetic lifecycle checkpoint with mandatory functional verification and strict post-anchor resumption (.github#3263); immutable coherent release github:0.85.0 is promoted from source 9307b85458b326019415f8bcf6a1d13d0139eb6a with content sha256:95892fd5d1765ec3020168f71b103a1849ae645e00de77f8fcb549ddbd510081. PRIOR 0.84.0 SOURCE/PUBLISHED — MINOR, durable content-addressed private telemetry receipts, automatic digest resolution, and separately reviewed non-counting legacy recovery (.github#3259); immutable coherent release github:0.84.0 is promoted from source 17f400d70db2cdd28efd8d7ce14327f1495411d2 with content sha256:ec226689bf12f9ede6aebab4f1f045cc1bcb24e0c8208a9fcae031387cf776d5. PRIOR 0.83.5 SOURCE/PUBLISHED — PATCH, roadmap acceptance recognizes native FS.GG.SDD.Artifacts/1.5.0 verify and ship stage schemas while retaining exact revision, work, and evidence identity (.github#3255); immutable coherent release github:0.83.5 is promoted from source 97666e7f0193b71fde5642d5950093490fbabbdb with content sha256:3519327ac384e1549a2fed7fc431f47047c63f335341ce3d8eaf8b1b63aa3a9a. PRIOR 0.83.4 SOURCE/PUBLISHED — PATCH, roadmap unit acceptance now permits a single immutable implementation/acceptance PR only under equal identities, derives the repository from applied unit authority, and proves exact one-commit canonical critique ancestry (.github#3251); immutable coherent release github:0.83.4 is promoted from source a3641ca0827187fa4ff693f627f5024dab4093b0 with content sha256:aea555a3e8a6acf9d319b42cf714b605067be23ce2c8b39647780db4a96930bf. PRIOR 0.83.3 SOURCE/PUBLISHED — PATCH, roadmap acceptance uses separately authorable structured-review and immutable-envelope identities and binds SDD observation to the current structured route work ID (.github#3247); immutable coherent release github:0.83.3 is promoted from source 5e4c23790c714b892b0c5efa25b515ae4eaf252e with content sha256:aa95e6038bd0630eb163b0001c2f5628bc0daf71d0da8170f9e6fb6e44697ec2. PRIOR 0.83.2 SOURCE/PUBLISHED — PATCH, live acceptance relies on independently regenerated ignored SDD artifacts while retaining exact-revision observation and canonical comparison (.github#3242); immutable coherent release github:0.83.2 is promoted from source 0697e72f0f5b0d6bcc9728da3589f71d24dde420 with content sha256:40072e5998da0476a0bb7ad177d5c68129268b120d2cf3a2d554dbc7490dc7ed. PRIOR 0.83.1 SOURCE/PUBLISHED — PATCH, ordered partial roadmap catalog acceptance (.github#3233); immutable coherent release github:0.83.1 is promoted from source 2237ab8282433234e0d1af3f4716ef099422e282 with content sha256:43f9d6a386ce2988e1825d0439642e2965c937ee264bec3dca107dcd78ee2c1d. PRIOR 0.83.0 SOURCE/PUBLISHED — MINOR, additive typed roadmap work-unit preparation and atomic acceptance transaction (.github#3210); immutable coherent release github:0.83.0 is promoted from source fe13bf08d82091a3d024583e0315c50d30c59376 with content sha256:0e0df10f52fdd68747739aa6083f7d5b34cdaffd35e6d16976bcfdfa1106ebaa. PRIOR 0.82.0 SOURCE/PUBLISHED — MINOR, deterministic qualification/evidence runner; immutable coherent release github:0.82.0 is promoted from source 3c53e4600110974bb1b22d3522a7d794fd24e3fd with content sha256:20cd31e6a90658237571d37874f6885789217db329ca613d4a5e819432223a0d. PRIOR 0.81.1 SOURCE/PUBLISHED — PATCH, publish-before-adopt completion; packed callers use compiled telemetry and compatibility helpers are removed. PRIOR 0.78.1 SOURCE/PUBLISHED — PATCH, stable. Documentation-only orchestration visualization design plus the auto-publish frontier repair; no engine wire change. PRIOR 0.78.0 SOURCE/PUBLISHED — MINOR, stable. Intake derives Class from the shared board vocabulary and recovers only enumerated legacy drafts after a partial create; the exact predecessor body and authoritative post-PATCH read gate receipt advancement. Packed filing skills remove the unprojectable capability example. package-version is 0.78.0 after immutable dual-feed promotion. PRIOR 0.77.0 SOURCE/PUBLISHED — MINOR. ADR-0079 makes one Accountable Delivery Owner the sole routine authorization boundary; packed pnext-item retains exact-head critique/repair/acceptance evidence under distinct phase identities but requires no external person, account, agent, or approval quorum. PRIOR 0.76.0 SOURCE/PUBLISHED — MINOR. The coherent Kit adds initialize-sdd-workspace as a new receiver-visible member; Drivers and Coord.Cli advance on the shared scalar with no engine wire change. PRIOR 0.75.5 SOURCE/PUBLISHED — PATCH, stable (.github#2983, source PR #2990, merge 34b1fd8b). Three compatible lifecycle repairs ship: successful completed post-merge runs classify correctly, completion provenance preserves the full GraphQL merge OID, and closed delivery reads authoritative issue Paths while retaining unread-versus-undeclared state. Protocol.fs has zero wire commits across the span. PRIOR 0.75.4 SOURCE/PUBLISHED — PATCH, stable (.github#2941, source PR #2967, merge 8d720471). Nine accumulated non-wire engine commits ship with corrected cumulative release notes; Protocol.fs has zero wire commits across the release span. PRIOR 0.75.3 SOURCE/PUBLISHED — PATCH, stable, source 264725f374e3f05da46d7c3089462076a1f9bf7a; the immutable release predates this correction and its embedded notes misdescribe the accumulated changes. PRIOR: 0.74.0 SOURCE/PUBLISHED — MINOR, stable (.github#2876, source PR #2879). Five pre-existing non-wire engine-path commits plus the release-preparation commit are shipped from d4458d8fdfff0c332c80d920202ab0230bd9de0f; Protocol.fs is unchanged across the release span. PRIOR: 0.71.0 SOURCE/PUBLISHED — MINOR, stable (.github#2813, source PR #2814). Forward recovery ships the live stable-predecessor authority from source 3890c8f6b20fcd2c1fdd5b2a9a5356877c217397 while poisoned 0.70.0 remains unpromoted. Previous coherent registry frontier: 0.68.0. PRIOR 0.68.0 SOURCE/PUBLISHED — MINOR, stable (.github#2794, source PR #2803). Four additive exhausted-review/forced-claim commits are shipped with zero Protocol.fs wire commits. Previous coherent registry frontier: 0.67.0. PRIOR 0.67.0 SOURCE/PUBLISHED — MINOR, stable (.github#2756, PR #2792). Durable bounded review-wait receipts and the ordinary full fresh-successor review route are additive receiver-visible semantics. Previous coherent registry frontier: 0.66.0. PRIOR 0.66.0 SOURCE/PUBLISHED — MINOR, stable (.github#2757, PR #2789). The packaged findings-and-filing contract adds the named `disclosed residual` terminal state: measured bound, caller-facing disclosure, executable red pin, and durable authorized decision are conjunctive; a #266 check that cannot fail is explicitly excluded. Previous coherent registry frontier: 0.65.0. PRIOR 0.61.0 SOURCE/PUBLISHED — MINOR, stable. Two receiver-observable legs, either of which carries the line on the criterion the 0.56.0, 0.57.0, 0.59.0 and 0.60.0 entries used (.github#2712, PR #2745, engine commit 73024dc3): the board gains a `Kind:` body-line sentinel with a CLOSED four-value vocabulary — work|anchor|register|directive — in the same grammar as `Paths:`/`Class:`/`Blocked on:`, and a row declaring a NON-`work` kind is EXEMPT FROM THE LIFECYCLE REDUCER ENTIRELY (no projected Status, no persisted watermark, no park, no promotion, no Done), which the scheduler reports through a NEW verdict `not-a-unit-of-work` naming the kind rather than the row's column; and `ready --json` plus the board reads gain two per-row fields, `kind` (null until an operator creates the field) and `commentCount` (observable REGISTER DEPTH, riding the existing board page query as a connection totalCount and selecting no nodes, so the board read costs what it did before). AN ABSENT `Kind:` LINE MEANS `work`, so every row that existed at 0.60.0 behaves exactly as it did — the opposite default from an absent `Class:` line, deliberately. THE WIRE SURFACE DID MOVE HERE, AND ADDITIVELY, which is the honest difference from the 0.59.0 and 0.60.0 entries and is measured rather than asserted: src/FS.GG.Coord.Core/Protocol.fs is 214 insertions/254 deletions across coord-engine/v0.60.0..v0.61.0, but classifying that diff line by line finds ZERO removed type/DU/let/member definitions and exactly ONE added case, `Schedulability.NotAUnitOfWork` — the churn is the projected rule PROSE, not surface removal, so this is a MINOR BY ADDITION and not a MAJOR. THE SPAN IS 32 commits, of which 15 touch the engine paths under `git rev-list --full-history` and only 12 under default history simplification; BOTH numbers are stated because the smaller one is what a reader gets by default, and .github#2743 — the row that ordered this cut — records exactly that merge-vs-squash sensitivity as a real gate defect. Cut under per-cut operator authorisation (.github#2743 Sequencing; the 0.60.0 authorisation explicitly did not extend forward). PRIOR 0.60.0 SOURCE/PUBLISHED — MINOR, stable. Two receiver-visible legs, either of which carries the line on the criterion the 0.56.0, 0.57.0 and 0.59.0 entries used (.github#2645, PR #2650, engine commit aea56a4a): `claim --json` reports differently — `statusWrite` gains a FIFTH value `withheld`, distinct from `failed` (asserts a mutation was sent) and `deferred` (promises `flush`), and `converged` now means agreement with the DERIVED destination rather than with the literal column `In progress` — and the packed kit retires a start-gate `jq` predicate asserting `.status == "In progress"` that receivers copy verbatim. THE WIRE SURFACE IS UNCHANGED and that is measured, not assumed: check-engine-freshness reported 0 of the 2 unreleased engine commits touching src/FS.GG.Coord.Core/Protocol.fs, so `withheld` is a new INHABITANT of an existing reported field, not a new verb, flag, help entry, render name, result name or exit code. Cut by .github#2409's MANUAL path (.github#2713) because nothing automatic can cut it: kit-auto-publish.py:99-100 refuses this candidate `candidate-not-next-patch` — 0.60.0 opens a NEW minor line against a 0.59.0 frontier, failing the first clause and short-circuiting before the sibling-tag block at :101 — which is the rail working by design (.github#2442), verified here by driving decide() over the live facts with a 0.59.1 control that clears that same rail. PRIOR 0.59.0 SOURCE/PUBLISHED — MINOR, stable. Five receiver-visible engine defect fixes (.github#2575/#2662/#2683/#2678/#2694) plus a new reviewer protocol boundary in the packed pnext-item skill (finding-packet contract + independent-review consolidation), which is the 0.57.0 entry's shape. The 290 lines of new .fsi surface are corroboration only: FS.GG.Coord.Core.Operation is IsPackable=false and unreferenced by the CLI, so it reaches no receiver, and Protocol.fs is byte-identical across the span (.github#2648, PR #2706, round-1 finding by critic heron-d444). This cut ABANDONS 0.58.1, whose three tags at a415652f published nothing on either feed (.github#2654); those tags are immutable and are deliberately left alone (.github#1772). PRIOR 0.58.0 — 0.58.1 was never published and must not be read as a prior. + version: "0.113.0" # SOURCE ONLY #4801: Claude Code transcript usage capture; published112 retained. PRIOR: SOURCE/PUBLISHED #4789: immutable d5af6a987e915bd0a1b572bcc09ad0d4b2e798b5 is accepted on both feeds; selected SDD/Codex adoption remains separate. PRIOR SOURCE: SOURCE ONLY #4789, published111 retained; prospective skill-routing112 is not publication/adoption. PRIOR SOURCE/PUBLISHED: coherent111 immutable sourcebd60a97a422c8fc8ca0c17b2a9dea4e504b708d2 is published and root-accepted. Exact inactive public111 installation, absolute111 full56 read and selected operator instruction bytes are accepted separately; no global selector/fleet or numerical benefit claim. PRIOR: SOURCE ONLY: #4743 operation-specific admission and source/ref/preflight guidance; normal coherent111 readiness over completed110. Published110/installed pins unchanged. PRIOR SOURCE/PUBLISHED: mandatory Status lifecycle and finite read-only observer, published from immutable source42cd9e7c8505f7cd72d5a22ad424a27af6d51458. Postpublication registry/pin maintenance does not repack that release. Installed instruction/caller adoption and ordinary observer acceptance remain separately owned by #4731/#4730. PRIOR: SOURCE PREPARATION ONLY: mandatory Status lifecycle reconciliation; coherent Kit/Drivers/CLI source successor. Publication and installed adoption remain separately unselected; current published109 custody is unchanged. PRIOR source scalar: immutable published109 source0d85830e7329a2718ee57ff0f1a16e6c751a469c. Later source knowledge/observer records do not repack that artifact. PRIOR: SOURCE PREPARATION ONLY: continuous board clearing, canonical native intake and complete Delivery acceptance plus bounded full-cohort acquisition (#4701/#4702). MINOR receiver-visible behavior; publication/installed/native acceptance pending. Published108 and original journal26 remain immutable. PRIOR SOURCE/PUBLISHED: genuine candidate39233536189 and same-journal forward39238215850 completed33generations/all16effects; promoted release417149016 at f984a361. Actual installed/native qualification remains separate. PRIOR SOURCE PREPARATION: successor planning read-budget repair; publication and installed qualification pending. Published107 remains unchanged. PRIOR HISTORICAL SOURCE PREPARATION: canonical work-board coordinator, explicit outcome/delivery binding5/schema3/inspection3 and integrator2, bounded migration and progress. Source delivery #4677 under #4641; independent coherent107 publication, installed caller adoption and native schema/enrollment/view acceptance remain separate. Accepted binding4/schema2/inspection2 stays unchanged; retained105 qualification is historical scope. Later selector106 observation has unknown change timing and proves neither whole runtime nor instruction discovery. Published106 pins stay unchanged. PRIOR SOURCE/PUBLISHED: exact source 2e42faaa994367b9f50be87439e8fd973ad21501, candidate 39124245029, same-journal forward 39130246438 accepted all 16 effects at final generation 33 and release 416441527. Active installed 0.105 and board binding unchanged; Host receiver adoption remains separate. PRIOR SOURCE PREPARATION: SOURCE PREPARATION ONLY: prospective coherent 0.106.0 over published 0.105.0 for passive native observation; candidate/publication/installation unselected, both-feed collision guards remain required. Published package-version/tag and active board pin stay 0.105.0. PRIOR CURRENT SOURCE/PUBLISHED: coherent-set/v0.105.0, exact candidate e54a59885580c894c8fbc67b0b27af3571ea9883; original candidate39095711219/a1 and publisher resume39098313280/a1 accepted; initial39096861301 remains an incomplete generation14 checkpoint. Maintained developer update and exact82-member installed105 payload correspondence accepted; board migration, binding and consumer acceptance remain separately scoped. PRIOR source0.104.0 is published from immutable candidate 912eba8bbd707dabcbc5011d508c479109010b71; executor 5a2d13d0 is the continuation controller only. HISTORICAL SOURCE PREPARATION: SOURCE PREPARATION ONLY: current programme migration and prospective release-specific .103 suspension; literal utel-rel-22 selection grants no allocation/publication/installed authority. Original .103 tag:intent remains Unknown with all reservations preserved. Published package-version/tag stay0.102.0. PRIOR 0.103 SOURCE PREPARATION ONLY: receiver-first bounded CI continuation and authenticated suite graphs; original utel-rel-21 effects remain unresolved, original0.102/utel-rel-20 recovery is frozen. PRIOR SOURCE/PUBLISHED: coherent-set/v0.101.0 source79051e56b025dadfc6fcaabd58b79e33f2854928, original publisher38094091013/a1; canonical generation33/all16 effects and independent both-feed CLI/Kit/Drivers payloads accepted. Installed adoption, current channel, collector activation and adapter SDK pairing remain separate. PRIOR SOURCE PREPARATION ONLY: exact CI attribution/native association and additive immutable causal receiver; selected utel-rel-19 source rail, packed receiver qualification/publication/adoption pending. Published package-version/tag remain0.100.0; current14 and local receiver-first boundary, no Host dependency. PRIOR SOURCE/PUBLISHED: coherent-set/v0.100.0 at 3ed8ad419a64253ca6f665e9779e5e4d110f50a5; retained original manifest and both-feed payload readbacks verified, stable channel promoted. Installed payload identity82/82 matches; global collector activation and genuine usage unverified, original UTEL19 custody unknown. PRIOR SOURCE ONLY: breaking current receipt ABI, current14 init/restore, explicit13 maintenance and scoped14 dashboard; prospective utel-rel-18, collision/qualification/publication pending. PRIOR SOURCE PREPARATION: 0.99.1 compatible bounded private dispatch-state IO; proposed utel-rel-17. Published frontier0.99.0; no new publication/adoption. PRIOR SOURCE ONLY: EFF schema14, prospective assessment gate and closed Drivers helper inputs. Not published/installed; package frontier remains0.98.0 and immutable utel-rel-15. Independent Host0.5 required for Store14 collection; native pilot/package qualification pending. PRIOR SOURCE/PUBLISHED: verified coherent 0.98.0 at producer 3d4f7e9c6337fb020e269e632653de0faeef6d72, journal utel-rel-15 and publisher 37434982959. PRIOR SOURCE SELECTION: additive schema 13 CI attribution correction and native compact/3 report contract; exact-source integration/qualification remains required. Published frontier remains accepted0.97.1 from99ea75286f5c3cea2a261fef4e5b45cd70378185; consumedutel-rel-13 and historical0.97.2/utel-rel-14 source are preserved. SOURCE/PUBLISHED: compatible equal feature/item telemetry fact identity and native agent binding repairs (PRs 4242/4243/4245); accepted coherent-set/v0.97.1 producer 99ea75286f5c3cea2a261fef4e5b45cd70378185 has both-feed verification. Installed root adoption and the fresh two-fact local cycle are scoped acceptance; historical and unsupported usage remain unknown. PRIOR 0.97.0 SOURCE/PUBLISHED: COORD-BOARD-V2-01.5 product adapter and guidance; publisher 37235030417 promoted exact source 2ab0c0ff9f37bdec9a11ba3604ebdc230711934f with all 16 journal effects verified and both-feed payload readback. Installed product adoption remains separate. PRIOR 0.96.0 SOURCE/PUBLISHED: UTEL-H3 coherent successor carries telemetry CI legacy-default selection repair from PR #4152 (a0044731f432b9f3f7dffa4f9d0a0c85eebb8a1b); publisher 37161212706 promoted exact source f891b5b0723070c67e08d1a87b7d12b0b4d8bebe; installed selections and receiver adoption remain separate. PRIOR 0.95.0 SOURCE/PUBLISHED — MINOR coherent successor for bounded read-only board-v2 inspection and gated organization guidance; publisher 37071597534 promoted exact source 3b5de3367f8647cea0cd9366b8cb11eddf53feae with all 16 protected-journal effects verified; installed qualification and four-target Board adoption remain pending. PRIOR 0.94.0 SOURCE/PUBLISHED — MINOR, Drivers removes the retired Python skill-helper implementations from both mirrored skill roots and the compatibility wrapper after supported callers moved to packaged F# commands; installed-package verification rejects reintroduction; includes protected native learning capture and export accumulated since 0.93.0; immutable coherent-set/v0.94.0 was promoted from source 337b6a1d53571b07ca8e1417e18e52546ad319a7 after exact both-feed readback; receiver adoption remains separate. PRIOR 0.93.0 SOURCE/PUBLISHED — MINOR, supported skill callers use packaged F# telemetry and preflight commands; includes protected native telemetry collection provenance accumulated since 0.92.0; immutable coherent release github:0.93.0 was promoted from source d53d5c4fa0a54894da87e96ae2999288fb280ea5 after protected both-feed readback; no receiver adoption is claimed. PRIOR 0.92.0 SOURCE/PUBLISHED — MINOR, additive bounded read-only `skill telemetry-config discover` for installed workflows; immutable coherent release github:0.92.0 was promoted from source eb0f73186a07daf26e0f7bb5d4c1ee2054a8adaf after exact both-feed readback; no receiver adoption is claimed. PRIOR 0.91.5 SOURCE PREPARED — FSharp.Core 10.1.401 and compatible telemetry/driver updates; package-version remains published 0.91.4 until both-feed promotion. PRIOR 0.91.4 SOURCE/PUBLISHED — coherent telemetry-capable set from f0b1bb8748cbb7b27aeaf7346b8690c82ed03343; PRIOR 0.89.0 SOURCE/PUBLISHED — MINOR, FS.GG.Drivers adds the content-addressed installed routine policy, helper and native-check closure; immutable coherent release github:0.89.0 was promoted from source 535970a06055dfcdbb96aad8726b4d7d981a5b72 after exact both-feed readback. PRIOR 0.88.0 SOURCE/PUBLISHED — MINOR, independently activated private telemetry, source-free scoped dashboard, durable receipt transport, release qualification, and intake-audit hardening. Immutable tags `coord-engine/v0.88.0` and `coherent-set/v0.88.0` resolve the accepted source d77fe195bc4e133ace8763c2158834410ca72bc0. PRIOR 0.87.0 SOURCE PREPARED — MINOR, prospective private SQLite telemetry, repository-owned Codex lifecycle observation, exact-head CI reconciliation, native outcomes, and derived whole-item budget inputs (UTEL-06.1–06.4, .github#3360–#3363). Published from exact source bffc370933ec4f35af2af4acf5f72b5888844365 and promoted after both-feed verification. PRIOR 0.86.1 SOURCE/PUBLISHED — PATCH, routed board drivers reserve the three-round fresh implementer/critic repair chain for strict items so admitted routine work remains reduced through repair (.github#3338); immutable coherent release github:0.86.1 is promoted from source ce6edfd8e3f569867e6809ca3933c6ae65769a1d with content sha256:ccea15d2acd633188f34bdaa9761137538dd834fafa43cda185dbf90c473307c. PRIOR 0.86.0 SOURCE/PUBLISHED — MINOR, reduced one-owner routine route; immutable coherent release github:0.86.0 is promoted from source beb3456ecb2c4b4cadb6bc8dc268598246449aaf with content sha256:01d0c921ab23b6807e1d6da1a9c623cd0cfb5a595bf790b51662746a0681b974. PRIOR 0.85.2 SOURCE/PUBLISHED — PATCH, guarded two-phase implementation landing accepts a missing closing keyword only under an exact typed positive acceptance-receipt obligation and fresh same-item authority, while terminal completion remains reserved for the canonically closing receipt PR (.github#3286); immutable coherent release github:0.85.2 is promoted from source e94f7da34e2c3792a2c532a4969123fd26fd601b with content sha256:3fb04e68d9b90dff5d37f3ad9d0533346cf753444effdb6de5721191557d58fa. PRIOR 0.85.1 SOURCE/PUBLISHED — PATCH, acceptance survives a forward-only, complete, path-disjoint base advance while changed candidates, conflicts, relevant overlap, and unverifiable equivalence remain fail-closed (.github#3274); immutable coherent release github:0.85.1 is promoted from source 503a07d24a6087c549bc47b5322d6f05cce2a6c5 with content sha256:f0f3706c755c767c9f761c993bb01f7a9c52c08cd74d504c1de7322aadaf471c. PRIOR 0.85.0 SOURCE/PUBLISHED — MINOR, human-authorized scope-bound synthetic lifecycle checkpoint with mandatory functional verification and strict post-anchor resumption (.github#3263); immutable coherent release github:0.85.0 is promoted from source 9307b85458b326019415f8bcf6a1d13d0139eb6a with content sha256:95892fd5d1765ec3020168f71b103a1849ae645e00de77f8fcb549ddbd510081. PRIOR 0.84.0 SOURCE/PUBLISHED — MINOR, durable content-addressed private telemetry receipts, automatic digest resolution, and separately reviewed non-counting legacy recovery (.github#3259); immutable coherent release github:0.84.0 is promoted from source 17f400d70db2cdd28efd8d7ce14327f1495411d2 with content sha256:ec226689bf12f9ede6aebab4f1f045cc1bcb24e0c8208a9fcae031387cf776d5. PRIOR 0.83.5 SOURCE/PUBLISHED — PATCH, roadmap acceptance recognizes native FS.GG.SDD.Artifacts/1.5.0 verify and ship stage schemas while retaining exact revision, work, and evidence identity (.github#3255); immutable coherent release github:0.83.5 is promoted from source 97666e7f0193b71fde5642d5950093490fbabbdb with content sha256:3519327ac384e1549a2fed7fc431f47047c63f335341ce3d8eaf8b1b63aa3a9a. PRIOR 0.83.4 SOURCE/PUBLISHED — PATCH, roadmap unit acceptance now permits a single immutable implementation/acceptance PR only under equal identities, derives the repository from applied unit authority, and proves exact one-commit canonical critique ancestry (.github#3251); immutable coherent release github:0.83.4 is promoted from source a3641ca0827187fa4ff693f627f5024dab4093b0 with content sha256:aea555a3e8a6acf9d319b42cf714b605067be23ce2c8b39647780db4a96930bf. PRIOR 0.83.3 SOURCE/PUBLISHED — PATCH, roadmap acceptance uses separately authorable structured-review and immutable-envelope identities and binds SDD observation to the current structured route work ID (.github#3247); immutable coherent release github:0.83.3 is promoted from source 5e4c23790c714b892b0c5efa25b515ae4eaf252e with content sha256:aa95e6038bd0630eb163b0001c2f5628bc0daf71d0da8170f9e6fb6e44697ec2. PRIOR 0.83.2 SOURCE/PUBLISHED — PATCH, live acceptance relies on independently regenerated ignored SDD artifacts while retaining exact-revision observation and canonical comparison (.github#3242); immutable coherent release github:0.83.2 is promoted from source 0697e72f0f5b0d6bcc9728da3589f71d24dde420 with content sha256:40072e5998da0476a0bb7ad177d5c68129268b120d2cf3a2d554dbc7490dc7ed. PRIOR 0.83.1 SOURCE/PUBLISHED — PATCH, ordered partial roadmap catalog acceptance (.github#3233); immutable coherent release github:0.83.1 is promoted from source 2237ab8282433234e0d1af3f4716ef099422e282 with content sha256:43f9d6a386ce2988e1825d0439642e2965c937ee264bec3dca107dcd78ee2c1d. PRIOR 0.83.0 SOURCE/PUBLISHED — MINOR, additive typed roadmap work-unit preparation and atomic acceptance transaction (.github#3210); immutable coherent release github:0.83.0 is promoted from source fe13bf08d82091a3d024583e0315c50d30c59376 with content sha256:0e0df10f52fdd68747739aa6083f7d5b34cdaffd35e6d16976bcfdfa1106ebaa. PRIOR 0.82.0 SOURCE/PUBLISHED — MINOR, deterministic qualification/evidence runner; immutable coherent release github:0.82.0 is promoted from source 3c53e4600110974bb1b22d3522a7d794fd24e3fd with content sha256:20cd31e6a90658237571d37874f6885789217db329ca613d4a5e819432223a0d. PRIOR 0.81.1 SOURCE/PUBLISHED — PATCH, publish-before-adopt completion; packed callers use compiled telemetry and compatibility helpers are removed. PRIOR 0.78.1 SOURCE/PUBLISHED — PATCH, stable. Documentation-only orchestration visualization design plus the auto-publish frontier repair; no engine wire change. PRIOR 0.78.0 SOURCE/PUBLISHED — MINOR, stable. Intake derives Class from the shared board vocabulary and recovers only enumerated legacy drafts after a partial create; the exact predecessor body and authoritative post-PATCH read gate receipt advancement. Packed filing skills remove the unprojectable capability example. package-version is 0.78.0 after immutable dual-feed promotion. PRIOR 0.77.0 SOURCE/PUBLISHED — MINOR. ADR-0079 makes one Accountable Delivery Owner the sole routine authorization boundary; packed pnext-item retains exact-head critique/repair/acceptance evidence under distinct phase identities but requires no external person, account, agent, or approval quorum. PRIOR 0.76.0 SOURCE/PUBLISHED — MINOR. The coherent Kit adds initialize-sdd-workspace as a new receiver-visible member; Drivers and Coord.Cli advance on the shared scalar with no engine wire change. PRIOR 0.75.5 SOURCE/PUBLISHED — PATCH, stable (.github#2983, source PR #2990, merge 34b1fd8b). Three compatible lifecycle repairs ship: successful completed post-merge runs classify correctly, completion provenance preserves the full GraphQL merge OID, and closed delivery reads authoritative issue Paths while retaining unread-versus-undeclared state. Protocol.fs has zero wire commits across the span. PRIOR 0.75.4 SOURCE/PUBLISHED — PATCH, stable (.github#2941, source PR #2967, merge 8d720471). Nine accumulated non-wire engine commits ship with corrected cumulative release notes; Protocol.fs has zero wire commits across the release span. PRIOR 0.75.3 SOURCE/PUBLISHED — PATCH, stable, source 264725f374e3f05da46d7c3089462076a1f9bf7a; the immutable release predates this correction and its embedded notes misdescribe the accumulated changes. PRIOR: 0.74.0 SOURCE/PUBLISHED — MINOR, stable (.github#2876, source PR #2879). Five pre-existing non-wire engine-path commits plus the release-preparation commit are shipped from d4458d8fdfff0c332c80d920202ab0230bd9de0f; Protocol.fs is unchanged across the release span. PRIOR: 0.71.0 SOURCE/PUBLISHED — MINOR, stable (.github#2813, source PR #2814). Forward recovery ships the live stable-predecessor authority from source 3890c8f6b20fcd2c1fdd5b2a9a5356877c217397 while poisoned 0.70.0 remains unpromoted. Previous coherent registry frontier: 0.68.0. PRIOR 0.68.0 SOURCE/PUBLISHED — MINOR, stable (.github#2794, source PR #2803). Four additive exhausted-review/forced-claim commits are shipped with zero Protocol.fs wire commits. Previous coherent registry frontier: 0.67.0. PRIOR 0.67.0 SOURCE/PUBLISHED — MINOR, stable (.github#2756, PR #2792). Durable bounded review-wait receipts and the ordinary full fresh-successor review route are additive receiver-visible semantics. Previous coherent registry frontier: 0.66.0. PRIOR 0.66.0 SOURCE/PUBLISHED — MINOR, stable (.github#2757, PR #2789). The packaged findings-and-filing contract adds the named `disclosed residual` terminal state: measured bound, caller-facing disclosure, executable red pin, and durable authorized decision are conjunctive; a #266 check that cannot fail is explicitly excluded. Previous coherent registry frontier: 0.65.0. PRIOR 0.61.0 SOURCE/PUBLISHED — MINOR, stable. Two receiver-observable legs, either of which carries the line on the criterion the 0.56.0, 0.57.0, 0.59.0 and 0.60.0 entries used (.github#2712, PR #2745, engine commit 73024dc3): the board gains a `Kind:` body-line sentinel with a CLOSED four-value vocabulary — work|anchor|register|directive — in the same grammar as `Paths:`/`Class:`/`Blocked on:`, and a row declaring a NON-`work` kind is EXEMPT FROM THE LIFECYCLE REDUCER ENTIRELY (no projected Status, no persisted watermark, no park, no promotion, no Done), which the scheduler reports through a NEW verdict `not-a-unit-of-work` naming the kind rather than the row's column; and `ready --json` plus the board reads gain two per-row fields, `kind` (null until an operator creates the field) and `commentCount` (observable REGISTER DEPTH, riding the existing board page query as a connection totalCount and selecting no nodes, so the board read costs what it did before). AN ABSENT `Kind:` LINE MEANS `work`, so every row that existed at 0.60.0 behaves exactly as it did — the opposite default from an absent `Class:` line, deliberately. THE WIRE SURFACE DID MOVE HERE, AND ADDITIVELY, which is the honest difference from the 0.59.0 and 0.60.0 entries and is measured rather than asserted: src/FS.GG.Coord.Core/Protocol.fs is 214 insertions/254 deletions across coord-engine/v0.60.0..v0.61.0, but classifying that diff line by line finds ZERO removed type/DU/let/member definitions and exactly ONE added case, `Schedulability.NotAUnitOfWork` — the churn is the projected rule PROSE, not surface removal, so this is a MINOR BY ADDITION and not a MAJOR. THE SPAN IS 32 commits, of which 15 touch the engine paths under `git rev-list --full-history` and only 12 under default history simplification; BOTH numbers are stated because the smaller one is what a reader gets by default, and .github#2743 — the row that ordered this cut — records exactly that merge-vs-squash sensitivity as a real gate defect. Cut under per-cut operator authorisation (.github#2743 Sequencing; the 0.60.0 authorisation explicitly did not extend forward). PRIOR 0.60.0 SOURCE/PUBLISHED — MINOR, stable. Two receiver-visible legs, either of which carries the line on the criterion the 0.56.0, 0.57.0 and 0.59.0 entries used (.github#2645, PR #2650, engine commit aea56a4a): `claim --json` reports differently — `statusWrite` gains a FIFTH value `withheld`, distinct from `failed` (asserts a mutation was sent) and `deferred` (promises `flush`), and `converged` now means agreement with the DERIVED destination rather than with the literal column `In progress` — and the packed kit retires a start-gate `jq` predicate asserting `.status == "In progress"` that receivers copy verbatim. THE WIRE SURFACE IS UNCHANGED and that is measured, not assumed: check-engine-freshness reported 0 of the 2 unreleased engine commits touching src/FS.GG.Coord.Core/Protocol.fs, so `withheld` is a new INHABITANT of an existing reported field, not a new verb, flag, help entry, render name, result name or exit code. Cut by .github#2409's MANUAL path (.github#2713) because nothing automatic can cut it: kit-auto-publish.py:99-100 refuses this candidate `candidate-not-next-patch` — 0.60.0 opens a NEW minor line against a 0.59.0 frontier, failing the first clause and short-circuiting before the sibling-tag block at :101 — which is the rail working by design (.github#2442), verified here by driving decide() over the live facts with a 0.59.1 control that clears that same rail. PRIOR 0.59.0 SOURCE/PUBLISHED — MINOR, stable. Five receiver-visible engine defect fixes (.github#2575/#2662/#2683/#2678/#2694) plus a new reviewer protocol boundary in the packed pnext-item skill (finding-packet contract + independent-review consolidation), which is the 0.57.0 entry's shape. The 290 lines of new .fsi surface are corroboration only: FS.GG.Coord.Core.Operation is IsPackable=false and unreferenced by the CLI, so it reaches no receiver, and Protocol.fs is byte-identical across the span (.github#2648, PR #2706, round-1 finding by critic heron-d444). This cut ABANDONS 0.58.1, whose three tags at a415652f published nothing on either feed (.github#2654); those tags are immutable and are deliberately left alone (.github#1772). PRIOR 0.58.0 — 0.58.1 was never published and must not be read as a prior. # HISTORICAL PACKAGE: 0.91.2, immutable coherent-set/v0.91.2 from source fc64f351a6c7733c3df6520ad1e1671bfcc1714b; content sha256:a3073f2b92d64048e1b8ee08e76263a1b5d6d56b6c75dd930505aa9eb3fcecd6. Publisher run 35506239965 and protected journal fsgg/v2/journal/release/utel-rel-03 verified all three members on both feeds and promotion. Manifest SHA-256 1f98d1f970810ecd357252663ad0582c97b0dd42008bb3b55b9b585bfa4f4cfa; stable-channel SHA-256 317ff8d08f484ecec5063ce7495da63bc33b18e40707ecb0ae9c46bd158d6984. PRIOR 0.91.1 from source 05e3feadcce3d546a05b2a4e0b1780e8a642a228; content sha256:3a87727ed7178b79e00f904457f19abcff1e7b00b0a93cc593568735eb28aefc. Both feeds verified all three members; producer CLI 0.91.1 adopted on both dev containers. PRIOR 0.91.0 from source 85c356b2c44cfea4b83659b14b6946d64bbd9a22; content sha256:c8b03938aa6357f696ff9ca257315e02f79e0a23ef8b6d87d37430139f2e600c. Prior package-version: 0.90.0. package-version: "0.112.0" # CURRENT PUBLISHED coherent-set/v0.112.0, accepted release419781177/final33; original normalized CLI/Kit/Drivers payloads verified across both feeds. PRIOR: PUBLISHED coherent-set/v0.111.0: candidate39522441055/a1/artifact12312227013; third ordinary invocation39529077063/a1 completed all16effects/gen33, release419029192 accepted2026-10-21. Both-feed receipts, seven assets and all three public producer payloads independently matched. Original failure39524000489 and checkpoint39524948262 retained; no resend/repack. PRIOR: PUBLISHED coherent-set/v0.110.0: original39423302862/a1/artifact12263934322, final39438076230/a1, all16effects/gen33, release418406702 accepted2026-10-20T14:35:18Z. All7native assets and3public producer payloads match; maintained hosted GitHub-feed verification is retained beside the direct user CLI read403. Canonical source pin is not installed/native acceptance (#4731/#4730). PRIOR: PUBLISHED coherent-set/v0.109.0: original39302112260/artifact12210674422, final39317658813, all16effects/final33 and independent native7assets/3public payload readback accepted2026-10-19T20:36:20Z. Installed/native consumer acceptance remains separately owned #4712. PRIOR: PUBLISHED coherent-set/v0.108.0 at f984a3619129c5e9ab68e1291fd080ef77ef9337; independent full-chain/public7asset/3NuGetpayload acceptance2026-10-19T10:56:28Z. PRIOR PUBLISHED coherent-set/v0.107.0 at source75ab98dd; #4682 accepted original39170373582/a1 complete. PRIOR PUBLISHED: coherent-set/v0.106.0, release 416441527, original candidate 2e42faaa994367b9f50be87439e8fd973ad21501/content sha256:351a435c1f162f3ff8ca8e6722d58b34b193b44744a6a207f9bb57f015f8204d. Original 39127872315 remains incomplete generation 16; separately admitted 39130246438 settled Drivers without resend and verified all 16 effects at final generation 33. Both feeds match original normalized payloads; signed NuGet archives differ. Later global selector106 observation has no pre-entry preimage/change timing; whole runtime/discovery, board binding, fleet and receiver acceptance remain separate. PRIOR immutable 0.105.0: PUBLISHED: coherent-set/v0.105.0, candidate e54a59885580c894c8fbc67b0b27af3571ea9883, initial39096861301 stopped at generation14; separately selected39098313280/a1 completed all16/final33 without resending the settled Kit intent, release416229635 promoted/latest; final coherent channel and installed82-file correspondence remain bounded to their original evidence. PRIOR immutable0.104.0: coherent-set/v0.104.0, release416097241, candidate912eba8bbd707dabcbc5011d508c479109010b71/content sha256:86a776fe591b5b98bf189fdf2c47148b1b417551c44f091146a1d6ce1acfd987; continuation39080633461/a1 at controller5a2d13d0 accepted final journal22 generation34/all16 effects. Original39073648848/a1 remains an incomplete checkpoint; original .103 Unknown and all inherited reservations remain. Installed update and private-caller/consumer acceptance are separate. PRIOR 0.102: PUBLISHED: fixed candidate6e9be17bacd288ece103b67ecd5842d37a9c8e50, content sha256:fc16321e011ea616648ccc1dafda00bfc06fa34210fd49ddb008bb56c9ceecf5; original publisher38133108945/a1, continuation38156868958/a1 accepted generation33/all16effects including both feeds and promotion. Installed selector custody and C3 provider acceptance remain separate. PRIOR Published coherent-set/v0.101.0, release408709919; candidate content sha256:e8ed439047f663dfcb34aba1152ffd4c6966a0c3a27be0ebb48eebcf47e26996, source79051e56b025dadfc6fcaabd58b79e33f2854928; all three normalized candidate payloads match both feeds. No installed-adoption or current-channel claim. PRIOR Published coherent-set/v0.100.0, source3ed8ad419a64253ca6f665e9779e5e4d110f50a5; original manifest0b31c416 and both-feed normalized payloads verified, fresh tag/release/feed metadata confirmed2026-10-09. Original operation custody remains unknown. PRIOR Accepted coherent-set/v0.99.0 publisher37566865635, source64e95ebec1a8294e16edaafdb27e6aa96f32c6f7, release405346080; both-feed readbacks accepted by root. PRIOR Verified coherent-set/v0.98.0 publication 37434982959, journal utel-rel-15, producer 3d4f7e9c6337fb020e269e632653de0faeef6d72, content sha256:15a3bc4c133216cde77d1fef5b639d1842588a5754802eaa11b098e7b62c2a06. PRIOR Both-feed publication accepted for coherent-set/v0.97.1 at source 99ea75286f5c3cea2a261fef4e5b45cd70378185; exact-head hosted feed readback also confirms both feeds. PRIOR0.97.0 publication: run 37235030417; coherent-set/v0.97.0, release 403211100, content sha256:b78fd7bdff1251e32c07ffb181c31b8c2009e3174cfe305b0761f5ca8b4e245d. Prior 0.96.0 receipts remain immutable. package-tag: "coherent-set/v0.112.0" # Release419781177, immutable sourced5af6a987e915bd0a1b572bcc09ad0d4b2e798b5. PRIOR: Release419029192, immutable sourcebd60a97a422c8fc8ca0c17b2a9dea4e504b708d2; final manifest asset661069009 SHA2564a1ea7a5423995504013ae0cac88b0c177d8377f1d21dd34f6d8616ac1851f39. Postpublication metadata is newer source, not a rebuilt111artifact or new release. PRIOR: Release418406702, immutable source42cd9e7c8505f7cd72d5a22ad424a27af6d51458; release-manifest asset659550415 SHA256bcae24d71571ab7f0dc26abbbf00beb0abf12718b22e7060838990384b86911f. Original failed publication and gen14/gen16 checkpoints retained; no replay. PRIOR: Release417623644, immutable source0d85830e7329a2718ee57ff0f1a16e6c751a469c. Original partial journals/failures retained; no replay. PRIOR: Release417149016, candidate39233536189/artifact12178009778, original journal26 retained through failure39235248295/checkpoint39235800776 and complete forward39238215850. PRIOR Release416724931 at source75ab98dd28b1a818cc3986d595bf21e0fe691ec6. PRIOR coherent-set/v0.106.0: Exact candidate source 2e42faaa994367b9f50be87439e8fd973ad21501; release 416441527 promoted 2026-10-18T13:18:34Z. Prior coherent-set/v0.105.0 remains immutable. Prior coherent-set/v0.104.0, coherent-set/v0.102.0 and all earlier release identities remain immutable. From 701e6644158fa7bea6509af107f74ae6a5911920 Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Thu, 22 Oct 2026 07:31:45 +0200 Subject: [PATCH 7/9] Complete coherent113 source composition Regenerate the version projections (architecture map, compatibility, publishing-and-deployment inventory), advance CLI PackageReleaseNotes, add the registry and skills changelog entries, and reconcile the publishing-and-deployment digest in skills.yml and the driver manifest, mirroring #4793. Fixes coherence/projection, architecture-map, engine-release-notes and registry-changelog failures. Co-Authored-By: Claude Opus 5.5 --- .../skills/publishing-and-deployment/SKILL.md | 2 +- .../skills/publishing-and-deployment/SKILL.md | 2 +- docs/architecture.md | 2 +- docs/registry/compatibility.md | 2 +- registry/CHANGELOG.md | 2 ++ registry/driver-skill-manifest.json | 6 +++--- registry/skills.CHANGELOG.md | 2 ++ registry/skills.yml | 2 +- src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj | 16 ++-------------- 9 files changed, 14 insertions(+), 22 deletions(-) diff --git a/.agents/skills/publishing-and-deployment/SKILL.md b/.agents/skills/publishing-and-deployment/SKILL.md index 7b3dc3e75..dae565e50 100644 --- a/.agents/skills/publishing-and-deployment/SKILL.md +++ b/.agents/skills/publishing-and-deployment/SKILL.md @@ -34,7 +34,7 @@ Registry release inventory: 18 package-bearing contracts across 9 producers; 16 | `game` | `game-scene-adapter` | `0.17.0` | `0.17.0` | `game:0.17.0` | FS.GG.Game.Render package — Adapter (sim-state -> FS.GG.UI.Scene drawables) | | `audio` | `fs-gg-audio` | `0.6.0` | `0.6.0` | `audio:0.6.0` | FS.GG.Audio.Core/.Host/.Engine/.Elmish/.WebBrowser public .fsi surfaces — AudioEffect vocabulary + IAudioBackend/IMixingBackend seam + mixing Engine + Audio.Cmd Elmish bridge + browser Web Audio host | | `net` | `fs-gg-net` | `0.6.0` | `0.6.0` | `net:0.6.0` | FS.GG.Net.Core/.WebSocket/.WebSocket.Server/.Protobuf/.Grpc/.Elmish public .fsi surfaces — ITransport/IMessageChannel seam + Sequential/Multiplexed correlation + serve/ServerEcho + WebSocket client/server transport + Google.Protobuf/protobuf-net codecs + gRPC lifecycle bridge + Elmish Cmd/Sub | -| `github` | `coord-engine` | `0.112.0` | `0.112.0` | `github:0.112.0` | the `fsgg-coord-engine` CLI verb surface (claim/take/batch/who/widen/set-paths/say/landable/done/release/flush/…) + its exit-code contract, emitted from src/FS.GG.Coord.Core/Protocol.fs; shipped as the FS.GG.Coord.Cli dotnet tool | +| `github` | `coord-engine` | `0.113.0` | `0.112.0` | `github:0.112.0` | the `fsgg-coord-engine` CLI verb surface (claim/take/batch/who/widen/set-paths/say/landable/done/release/flush/…) + its exit-code contract, emitted from src/FS.GG.Coord.Core/Protocol.fs; shipped as the FS.GG.Coord.Cli dotnet tool | | `github` | `telemetry-host` | `0.8.0` | `0.8.0` | `github:0.8.0` | optional Linux x64 FS.GG.Telemetry.Host dotnet tool — authenticated workspace-scoped ingestion, private dashboard, protected native capture and bounded learning export; independently versioned from the github coordination coherent set | | `github` | `new-sdd-workspace` | `0.21.0` | `0.21.0` | `github:0.21.0` | the `new-sdd-workspace` scaffolder CLI (package FS.GG.NewSddWorkspace) — one-command full-stack SDD workspace creation, wrapping the FS.GG.Templates `rendering` provider (ADR-0016); shipped as a dotnet tool | | `templates` | `fs-gg-workspace-template` | `0.19.0` | `0.19.0` | `templates:0.19.0` | FS.GG.Workspace.Template package, eight template configurations and seven `dotnet new` selectors: workspace-provider identities — `fs-gg-console` (provider `console` — minimal F# executable, no npm lane, ADR-0072 §2); `fs-gg-web` (provider `web` — F# ASP.NET Core + plain TypeScript/Vite website, ADR-0071 §3); `fs-gg-fable-game` (provider `fable-game` — F# ASP.NET Core + Fable/Elmish game client, SignalR for connection-oriented real-time traffic + plain HTTP endpoints with explicit versioned DTOs for typed request/response per ADR-0073, consuming the published `fs-gg-game-core-fable-lockstep-v1` profile per ADR-0069); `fs-gg-fable-bindings` (provider `fable-bindings` — Fable interop library over an exactly pinned npm package/declaration closure, ADR-0072 §3, first proved by the unreleased EHotwagner/babylonjsBindings reference) — plus `fs-gg-governance`, the separately registered pre-existing governance overlay template folded into this package at the same rename; `fs-gg-project-knowledge` and `fs-gg-python` are also already packaged. The current and legacy fable-game configurations share one selector. | diff --git a/.claude/skills/publishing-and-deployment/SKILL.md b/.claude/skills/publishing-and-deployment/SKILL.md index 7b3dc3e75..dae565e50 100644 --- a/.claude/skills/publishing-and-deployment/SKILL.md +++ b/.claude/skills/publishing-and-deployment/SKILL.md @@ -34,7 +34,7 @@ Registry release inventory: 18 package-bearing contracts across 9 producers; 16 | `game` | `game-scene-adapter` | `0.17.0` | `0.17.0` | `game:0.17.0` | FS.GG.Game.Render package — Adapter (sim-state -> FS.GG.UI.Scene drawables) | | `audio` | `fs-gg-audio` | `0.6.0` | `0.6.0` | `audio:0.6.0` | FS.GG.Audio.Core/.Host/.Engine/.Elmish/.WebBrowser public .fsi surfaces — AudioEffect vocabulary + IAudioBackend/IMixingBackend seam + mixing Engine + Audio.Cmd Elmish bridge + browser Web Audio host | | `net` | `fs-gg-net` | `0.6.0` | `0.6.0` | `net:0.6.0` | FS.GG.Net.Core/.WebSocket/.WebSocket.Server/.Protobuf/.Grpc/.Elmish public .fsi surfaces — ITransport/IMessageChannel seam + Sequential/Multiplexed correlation + serve/ServerEcho + WebSocket client/server transport + Google.Protobuf/protobuf-net codecs + gRPC lifecycle bridge + Elmish Cmd/Sub | -| `github` | `coord-engine` | `0.112.0` | `0.112.0` | `github:0.112.0` | the `fsgg-coord-engine` CLI verb surface (claim/take/batch/who/widen/set-paths/say/landable/done/release/flush/…) + its exit-code contract, emitted from src/FS.GG.Coord.Core/Protocol.fs; shipped as the FS.GG.Coord.Cli dotnet tool | +| `github` | `coord-engine` | `0.113.0` | `0.112.0` | `github:0.112.0` | the `fsgg-coord-engine` CLI verb surface (claim/take/batch/who/widen/set-paths/say/landable/done/release/flush/…) + its exit-code contract, emitted from src/FS.GG.Coord.Core/Protocol.fs; shipped as the FS.GG.Coord.Cli dotnet tool | | `github` | `telemetry-host` | `0.8.0` | `0.8.0` | `github:0.8.0` | optional Linux x64 FS.GG.Telemetry.Host dotnet tool — authenticated workspace-scoped ingestion, private dashboard, protected native capture and bounded learning export; independently versioned from the github coordination coherent set | | `github` | `new-sdd-workspace` | `0.21.0` | `0.21.0` | `github:0.21.0` | the `new-sdd-workspace` scaffolder CLI (package FS.GG.NewSddWorkspace) — one-command full-stack SDD workspace creation, wrapping the FS.GG.Templates `rendering` provider (ADR-0016); shipped as a dotnet tool | | `templates` | `fs-gg-workspace-template` | `0.19.0` | `0.19.0` | `templates:0.19.0` | FS.GG.Workspace.Template package, eight template configurations and seven `dotnet new` selectors: workspace-provider identities — `fs-gg-console` (provider `console` — minimal F# executable, no npm lane, ADR-0072 §2); `fs-gg-web` (provider `web` — F# ASP.NET Core + plain TypeScript/Vite website, ADR-0071 §3); `fs-gg-fable-game` (provider `fable-game` — F# ASP.NET Core + Fable/Elmish game client, SignalR for connection-oriented real-time traffic + plain HTTP endpoints with explicit versioned DTOs for typed request/response per ADR-0073, consuming the published `fs-gg-game-core-fable-lockstep-v1` profile per ADR-0069); `fs-gg-fable-bindings` (provider `fable-bindings` — Fable interop library over an exactly pinned npm package/declaration closure, ADR-0072 §3, first proved by the unreleased EHotwagner/babylonjsBindings reference) — plus `fs-gg-governance`, the separately registered pre-existing governance overlay template folded into this package at the same rename; `fs-gg-project-knowledge` and `fs-gg-python` are also already packaged. The current and legacy fable-game configurations share one selector. | diff --git a/docs/architecture.md b/docs/architecture.md index 86ad87ee8..47e693c51 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -653,7 +653,7 @@ product's `FS.GG.UI.*` pin), which is a different axis from the template package | `game-scene-adapter` | FS.GG.Game | `0.17.0` | `0.17.0` | | `fs-gg-audio` | FS.GG.Audio | `0.6.0` | `0.6.0` | | `fs-gg-net` | FS.GG.Net | `0.6.0` | `0.6.0` | -| `coord-engine` | FS-GG/.github | `0.112.0` | `0.112.0` | +| `coord-engine` | FS-GG/.github | `0.113.0` | `0.112.0` | | `telemetry-host` | FS-GG/.github | `0.8.0` | `0.8.0` | | `new-sdd-workspace` | FS-GG/.github | `0.21.0` | `0.21.0` | | `fs-gg-workspace-template` | FS.GG.Templates | `0.19.0` | `0.19.0` | diff --git a/docs/registry/compatibility.md b/docs/registry/compatibility.md index 756a7e0f7..36fa5134b 100644 --- a/docs/registry/compatibility.md +++ b/docs/registry/compatibility.md @@ -179,7 +179,7 @@ authored `Version` cells of the Versioned contracts table (#748).* | `fs-gg-audio` | FS.GG.Audio | `0.6.0` | `0.6.0` | | `fs-gg-net` | FS.GG.Net | `0.6.0` | `0.6.0` | | `keyboard-input` | FS.GG.Rendering | `0.5.0` | — | -| `coord-engine` | FS-GG/.github | `0.112.0` | `0.112.0` | +| `coord-engine` | FS-GG/.github | `0.113.0` | `0.112.0` | | `telemetry-host` | FS-GG/.github | `0.8.0` | `0.8.0` | | `new-sdd-workspace` | FS-GG/.github | `0.21.0` | `0.21.0` | | `fs-gg-workspace-template` | FS.GG.Templates | `0.19.0` | `0.19.0` | diff --git a/registry/CHANGELOG.md b/registry/CHANGELOG.md index 5d31496d2..0a7c714b7 100644 --- a/registry/CHANGELOG.md +++ b/registry/CHANGELOG.md @@ -94,6 +94,8 @@ no gate behaviour changes — this is purely how humans record the log. ## Entries +- **2026-10-22** — - **2026-10-22** — PROSPECTIVE COHERENT113 SOURCE (.github; #4801): select source 0.113.0 for CLI/Kit/Drivers to carry Claude Code transcript usage capture and corrected packaged guidance. Published112 and installed pins remain unchanged; no candidate or publication is authorized. + - **2026-10-21** — ACCEPTED COHERENT112 PUBLICATION (.github; #4789): Reconcile CLI/Kit/Drivers publication from immutable source `d5af6a987e915bd0a1b572bcc09ad0d4b2e798b5`: diff --git a/registry/driver-skill-manifest.json b/registry/driver-skill-manifest.json index d5ab09ca3..c530b6975 100644 --- a/registry/driver-skill-manifest.json +++ b/registry/driver-skill-manifest.json @@ -2434,12 +2434,12 @@ { "id": "publishing-and-deployment", "scope": "operator", - "sha256": "32fc6114f11e0d2aff8f13be2cb35d5fd2ddd88dd4187a3b0854f49348083af8", - "tree-sha256": "b901f497817af1c1045a6cfcb560d2c197193b1b8f708e1a3c332791a29742ea", + "sha256": "b2f1c2f206d0c7756023e0d6c4e7d6b13f7c1fa4b43b1292d2af6cc33734acaf", + "tree-sha256": "f19e9a2a4d21ce297bdd7b8cbbb365a8bd61be215386e1309968d24fa5fda0f4", "files": [ { "path": "SKILL.md", - "sha256": "32fc6114f11e0d2aff8f13be2cb35d5fd2ddd88dd4187a3b0854f49348083af8", + "sha256": "b2f1c2f206d0c7756023e0d6c4e7d6b13f7c1fa4b43b1292d2af6cc33734acaf", "executable": false }, { diff --git a/registry/skills.CHANGELOG.md b/registry/skills.CHANGELOG.md index d09ca5556..39459dd82 100644 --- a/registry/skills.CHANGELOG.md +++ b/registry/skills.CHANGELOG.md @@ -31,6 +31,8 @@ advances the pin to that CLI. ## Entries +- **2026-10-22** — SOURCE113 INVENTORY (.github; #4801): regenerate the publishing-and-deployment release inventory and its driver-manifest/skills-registry digest for prospective source 0.113.0; pnext-item/work-roadmap guidance names the working Claude Code transcript usage route. Published112 and installed adoption are unchanged. + - **2026-10-21** — PUBLISHED112 INVENTORY (.github; #4789): reconcile only the generated publishing-and-deployment operator inventory and its existing driver-manifest/skills-registry digest after accepted coherent112 publication. Immutable source d5af and its original packages remain unchanged; selected SDD/Codex instruction adoption is separately qualified. - **2026-10-21** — CANONICAL CURRENT ROUTES (.github; #4789): diff --git a/registry/skills.yml b/registry/skills.yml index a03d86819..d06c60230 100644 --- a/registry/skills.yml +++ b/registry/skills.yml @@ -398,7 +398,7 @@ skills: # publishing-and-deployment — homed beside its owner+predicate siblings and reconciled verbatim from # .github's producer manifest by `--write` (.github#299/.github#1200). The position # and this annotation are generated; the row's bytes are the manifest's. - - { id: publishing-and-deployment,scope: operator,owner: .github, source: .github/.claude/skills/publishing-and-deployment/SKILL.md, sha256: 32fc6114f11e0d2aff8f13be2cb35d5fd2ddd88dd4187a3b0854f49348083af8, materializes-when: "false" } + - { id: publishing-and-deployment,scope: operator,owner: .github, source: .github/.claude/skills/publishing-and-deployment/SKILL.md, sha256: b2f1c2f206d0c7756023e0d6c4e7d6b13f7c1fa4b43b1292d2af6cc33734acaf, materializes-when: "false" } # drive-board-best — homed beside its owner+predicate siblings and reconciled verbatim from # .github's producer manifest by `--write` (.github#299/.github#1200). The position # and this annotation are generated; the row's bytes are the manifest's. diff --git a/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj b/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj index 5d53e0661..2799b78a1 100644 --- a/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj +++ b/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj @@ -130,20 +130,8 @@ bytes under 0.52.0 would make the same version identify different artifacts. Ado coherent set cut from corrected source. All three partial sets are recorded in `registry/dependencies.yml`. - 0.112.0 — Carry current canonical skill routes and the selected SDD adoption contract through the coherent CLI/Kit/Drivers set. -Retire sealed release and legacy intake recipes; distinguish read-only inspection, scoped delivery, compatibility and current recovery authority. -The CLI command/API surface is unchanged. Source, genuine publication, selected SDD materialization and actual Codex discovery/mismatch acceptance remain separate; published111 and historical operation custody are unchanged. - -$(FsggStandingAdvisories) - -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 -https://www.nuget.org/packages/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. - + 0.113.0 — Add Claude Code transcript usage capture: `telemetry usage collect claude --session-file` and passive `claude-local-transcript/1` observations through the existing provider-usage path. +Carry corrected pnext-item/work-roadmap guidance naming the working Claude route. Codex behavior is unchanged; publication, installed adoption and Host ingestion remain separate. true true From c4e3b73fd91bf2bd90ac15231628b2a43477fb4e Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Thu, 22 Oct 2026 07:33:56 +0200 Subject: [PATCH 8/9] Restore standing advisories in CLI release notes Keep the three-part PackageReleaseNotes structure (new 0.113.0 entry, $(FsggStandingAdvisories), served-history pointer) required by check-engine-release-notes, and fix a doubled registry changelog prefix. Co-Authored-By: Claude Opus 5.5 --- registry/CHANGELOG.md | 2 +- src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/registry/CHANGELOG.md b/registry/CHANGELOG.md index 0a7c714b7..6fb6d612c 100644 --- a/registry/CHANGELOG.md +++ b/registry/CHANGELOG.md @@ -94,7 +94,7 @@ no gate behaviour changes — this is purely how humans record the log. ## Entries -- **2026-10-22** — - **2026-10-22** — PROSPECTIVE COHERENT113 SOURCE (.github; #4801): select source 0.113.0 for CLI/Kit/Drivers to carry Claude Code transcript usage capture and corrected packaged guidance. Published112 and installed pins remain unchanged; no candidate or publication is authorized. +- **2026-10-22** — PROSPECTIVE COHERENT113 SOURCE (.github; #4801): select source 0.113.0 for CLI/Kit/Drivers to carry Claude Code transcript usage capture and corrected packaged guidance. Published112 and installed pins remain unchanged; no candidate or publication is authorized. - **2026-10-21** — ACCEPTED COHERENT112 PUBLICATION (.github; #4789): diff --git a/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj b/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj index 2799b78a1..3b0f1eebf 100644 --- a/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj +++ b/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj @@ -131,7 +131,18 @@ coherent set cut from corrected source. All three partial sets are recorded in `registry/dependencies.yml`. 0.113.0 — Add Claude Code transcript usage capture: `telemetry usage collect claude --session-file` and passive `claude-local-transcript/1` observations through the existing provider-usage path. -Carry corrected pnext-item/work-roadmap guidance naming the working Claude route. Codex behavior is unchanged; publication, installed adoption and Host ingestion remain separate. +Carry corrected pnext-item/work-roadmap guidance naming the working Claude route. Codex behavior is unchanged; publication, installed adoption and Host ingestion remain separate; published112 is unchanged. + +$(FsggStandingAdvisories) + +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 +https://www.nuget.org/packages/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. + true true From 3505d16b84cec0596dbbca292a3fb6da2dd3829f Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Thu, 22 Oct 2026 07:50:05 +0200 Subject: [PATCH 9/9] Advance Creator normal-source qualification to coherent113 Mirror #4793: SOURCE_COHERENT_VERSION, NewSddWorkspace release-notes wording and the successor test expectations (0.112.0 joins the stale versions). Fixes new-sdd-workspace-selftest / parse. Co-Authored-By: Claude Opus 5.5 --- scripts/NewSddWorkspace/NewSddWorkspace.fsproj | 2 +- scripts/creator_source_qualification.py | 4 ++-- tests/new-sdd-workspace-successor/run.py | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/NewSddWorkspace/NewSddWorkspace.fsproj b/scripts/NewSddWorkspace/NewSddWorkspace.fsproj index c48069220..a07d43272 100644 --- a/scripts/NewSddWorkspace/NewSddWorkspace.fsproj +++ b/scripts/NewSddWorkspace/NewSddWorkspace.fsproj @@ -20,7 +20,7 @@ 0.21.0 - 0.21.0: expose the existing generic Python provider in the Wizard and forward the bindings descriptor bindingTarget key. Normal source uses coherent112; the independent release route reuses authenticated published coherent110 dependencies. Published Creator0.20 and its genuine108 dependency/effect identities remain immutable. Publication and installed successor adoption require their own acceptance. + 0.21.0: expose the existing generic Python provider in the Wizard and forward the bindings descriptor bindingTarget key. Normal source uses coherent113; the independent release route reuses authenticated published coherent110 dependencies. Published Creator0.20 and its genuine108 dependency/effect identities remain immutable. Publication and installed successor adoption require their own acceptance. new-sdd-workspace FS.GG workspace scaffolder — composes a selectable Standard or Typed SDD lifecycle, a runnable provider workspace, and an optional Governance overlay in one command, with a rich Spectre.Console progress UI. Orchestrates existing published machinery; no FS.GG.Templates checkout required. diff --git a/scripts/creator_source_qualification.py b/scripts/creator_source_qualification.py index 444a7a279..caa5d7aaa 100644 --- a/scripts/creator_source_qualification.py +++ b/scripts/creator_source_qualification.py @@ -1,6 +1,6 @@ """Closed Creator021 normal-source qualification; deliberately grants no release effects. -The normal Creator021 source composition is coherent112. Retained Creator020 source qualification +The normal Creator021 source composition is coherent113. Retained Creator020 source qualification and its separate genuine108 published-dependency mode keep their identities. Creator021 is normal-source only; neither source binding is an installed/publication receipt. """ @@ -16,7 +16,7 @@ class SourceQualificationBinding: SOURCE_020 = SourceQualificationBinding("FS.GG.NewSddWorkspace", "0.20.0", "new-sdd-workspace/v0.20.0") SOURCE_021 = SourceQualificationBinding("FS.GG.NewSddWorkspace", "0.21.0", "new-sdd-workspace/v0.21.0") SOURCE_020_COHERENT_VERSION = "0.110.0" -SOURCE_COHERENT_VERSION = "0.112.0" +SOURCE_COHERENT_VERSION = "0.113.0" def qualification_version(binding): diff --git a/tests/new-sdd-workspace-successor/run.py b/tests/new-sdd-workspace-successor/run.py index c5c1d3cc5..df52f68fb 100644 --- a/tests/new-sdd-workspace-successor/run.py +++ b/tests/new-sdd-workspace-successor/run.py @@ -611,9 +611,9 @@ def pack(selected): board_package_closure(package, 'a' * 40, source_root=root, release_binding=SOURCE_020) - # The selected021 source identity is normal112 only; retained020 above stays exact. + # The selected021 source identity is normal113 only; retained020 above stays exact. nuspec = nuspec.replace(b'0.20.0', b'0.21.0') - next_deps = json.loads(json.dumps(source_deps).replace('0.110.0', '0.112.0')) + next_deps = json.loads(json.dumps(source_deps).replace('0.110.0', '0.113.0')) for target in next_deps['targets'].values(): target['new-sdd-workspace/0.21.0'] = target.pop('new-sdd-workspace/0.20.0') next_members = {**members, 'new-sdd-workspace.deps.json': json.dumps(next_deps).encode()} @@ -621,7 +621,7 @@ def pack(selected): (output / name).write_bytes(body) pack(next_members) result = board_package_closure(package, 'a' * 40, source_root=root, release_binding=SOURCE_021) - self.assertEqual((result['version'], result['coherentVersion']), ('0.21.0', '0.112.0')) + self.assertEqual((result['version'], result['coherentVersion']), ('0.21.0', '0.113.0')) self.assertEqual(result['builtFilesCompared'], len(next_members)) self.assertEqual(result['mode'], 'source-only') self.assertIs(result['releaseEligible'], False) @@ -632,8 +632,8 @@ def pack(selected): forged = type(SOURCE_021)(SOURCE_021.package, SOURCE_021.version, SOURCE_021.tag) with self.assertRaisesRegex(ValueError, 'unknown Creator package binding'): board_package_closure(package, 'a' * 40, source_root=root, release_binding=forged) - for stale_version in ('0.111.0', '0.110.0', '0.109.0', '0.108.0'): - stale_metadata = json.dumps(next_deps).replace('0.112.0', stale_version).encode() + for stale_version in ('0.112.0', '0.111.0', '0.110.0', '0.109.0', '0.108.0'): + stale_metadata = json.dumps(next_deps).replace('0.113.0', stale_version).encode() (output / 'new-sdd-workspace.deps.json').write_bytes(stale_metadata) pack({**next_members, 'new-sdd-workspace.deps.json': stale_metadata}) with self.assertRaisesRegex(ValueError, 'current coherent CLI dependency metadata'): @@ -747,7 +747,7 @@ def test_source_cut_and_candidate_package_names_agree(self): props = ElementTree.parse(ROOT / 'Directory.Build.props') self.assertEqual(next(node.text for node in props.iter('FsggCoherentSetVersion')), SOURCE_COHERENT_VERSION) self.assertEqual(SOURCE_020_COHERENT_VERSION, '0.110.0') - self.assertEqual(SOURCE_COHERENT_VERSION, '0.112.0') + self.assertEqual(SOURCE_COHERENT_VERSION, '0.113.0') self.assertLess(candidate.index("creator-current-coord-dependencies.py preflight"), candidate.index("actions/setup-dotnet")) self.assertIn('creator-current-coord-dependencies.py preflight', candidate)