diff --git a/.github/skills/polyphony-dogfood-recovery/SKILL.md b/.github/skills/polyphony-dogfood-recovery/SKILL.md index 2a3ad6e..5f96f4c 100644 --- a/.github/skills/polyphony-dogfood-recovery/SKILL.md +++ b/.github/skills/polyphony-dogfood-recovery/SKILL.md @@ -115,10 +115,10 @@ edge cases still need manual attention: ### 3.1 · Uncommitted operator edits in root worktrees -`polyphony reset worktrees` refuses to remove a worktree with uncommitted -changes (defense-in-depth — you'd lose work). If the preview reports -`failed_worktrees` with reason `dirty`, stash or commit those edits -first, then re-run. +The projection reset's worktree leg refuses to remove a worktree with +uncommitted changes (defense-in-depth — you'd lose work). If the preview +reports `failed_worktrees` with reason `dirty`, stash or commit those +edits first, then re-run. ```powershell git -C "/root-/feature-" status @@ -141,10 +141,10 @@ git -C checkout -- .twig/config ### 3.3 · Manually-curated work-item state If you've hand-edited tags, fields, or state on the root via twig -between the original run and the reset, `polyphony reset state` advances -the watermark but does NOT roll back those manual edits. Verify the root -+ descendant state matches the desired pre-run baseline before -re-launch: +between the original run and the reset, the projection reset's state +leg advances the watermark but does NOT roll back those manual edits. +Verify the root + descendant state matches the desired pre-run baseline +before re-launch: ```powershell twig show --output json | ConvertFrom-Json | Select state, tags diff --git a/docs/decisions/pattern-strategy-retirement.md b/docs/decisions/pattern-strategy-retirement.md new file mode 100644 index 0000000..bc0fa21 --- /dev/null +++ b/docs/decisions/pattern-strategy-retirement.md @@ -0,0 +1,81 @@ +--- +doc_type: decision +status: accepted +synopsis: Retire the legacy `pattern` reset strategy; projection becomes the only path. Close the residual `sdlc/root` branch-pattern hole that the pattern leg covers today. Split the journal store into an explicit read-only reader for diagnostic surfaces. +--- + +# Retire pattern reset strategy; projection becomes the only path + +**Status:** Accepted +**Date:** 2026-05-24 +**Supersedes prior draft:** This ADR replaces the never-merged `run-inventory.md` draft from the same date. The earlier draft proposed a new `RunInventory` module + verdict vocabulary + manifest-as-expectation-source; rubber-duck review + an empirical investigation of the existing `src/Polyphony/Journal/{Observers,Drift,Reset,Projections}/` infrastructure showed the proposed module duplicated what already ships behind `--strategy projection`. The honest remaining work is narrower than the draft assumed and is captured here. + +## Context + +`polyphony reset root` currently dispatches between two reset strategies (`src/Polyphony/Commands/ResetCommands.Root.cs:26-124`): + +- **`projection`** (default) — `ProjectionResetExecutor` orchestrates: read journal → coverage check → `JournalDriftAnalyzer` reconciles expected (from `CurrentExpectedState.Project`) against observed (from per-kind `IResourceObserver` implementations) → `ProjectionResetPlanner` builds a plan with an externally-mutated guard → per-kind `IResourceDeleter` acts. This is the architectural deepening. +- **`pattern`** (legacy) — `ResetRootPatternCoreAsync` chains six one-leg-at-a-time helpers: `RunPrsAsync`, `RunWorktreesAsync`, `RunBranchesAsync`, `RunFacetsAsync`, `RunManifestAsync`, `RunStateAsync`, each defined in its own partial in `src/Polyphony/Commands/ResetCommands.{Prs,Worktrees,Branches,Facets,Manifest,State}.cs`. Each leg re-derives "what does this root own?" from a hand-rolled regex over `git for-each-ref` (or equivalent), with no shared notion of expected vs found. + +Two bugs in 2026-05 confirmed the structural fragility of the per-leg pattern derivation: + +- **AB#3245** — `polyphony reset worktrees` (pattern leg) emitted `Permission denied` while the worktree was already gone on disk. Patched in-place in the pattern leg via a 3-attempt retry with mid-attempt `Directory.Exists` short-circuit (`src/Polyphony/Commands/ResetCommands.Worktrees.cs:236-301`). +- **AB#3246** — `polyphony reset branches` (pattern leg) missed nested `plan/{root}-{child}` and per-item `sdlc/root/{id}` branches because the leg's name regex didn't recognize them. Patched in-place in the pattern leg via `RootBranchPatterns` (`src/Polyphony/Commands/ResetCommands.cs:83-96`) + `EnumerateRootSdlcBranchesAsync` (`src/Polyphony/Commands/ResetCommands.Branches.cs:273-313`). + +Both fixes were tactical patches to the *pattern* path. The projection path was independently immune to AB#3245 (`GitWorktreeDeleter.RemoveWithRetryAsync` already retries + treats "path is gone" as success — `src/Polyphony/Journal/Reset/Deleters/GitWorktreeDeleter.cs:37-64`) and largely immune to AB#3246 (`GitBranchDeleter` acts on journal-derived IDs directly — `src/Polyphony/Journal/Reset/Deleters/GitBranchDeleter.cs:33-56`). + +One residual hole exists on the projection path: `ResourceObserverSupport.MatchesPolyphonyBranchPattern` (`src/Polyphony/Journal/Observers/ResourceObserverSupport.cs:120-130`) recognizes `feature/{r}`, `plan/{r}`, `plan/{r}-*`, `mg/{r}_*`, `impl/{r}-*`, `evidence/{r}`, `evidence/{r}-*` but **does not** recognize `sdlc/root/{id}`, even though that scheme is still produced by polyphony (`ResetCommands.Branches.cs:273-313` enumerates them). Branches journaled as polyphony-owned are caught via the expected-state projection regardless of `MatchesPolyphonyBranchPattern`; the hole affects only the **discovered-resource** path (orphan refs not in the journal, which is exactly where the pattern leg's enumeration was load-bearing). + +There is no formal deprecation marker (`[Obsolete]`, telemetry, console warning) on the `pattern` strategy today. There is no automatic fallback from projection to pattern; if projection coverage is incomplete the executor returns an error unless the operator passes `--allow-unjournaled` (`ProjectionResetExecutor.cs:35-50`). + +Separately, the journal store opens SQLite as `ReadWriteCreate` and initializes the schema on first use (`JournalStore.OpenConnectionAsync`). Any "diagnostic-only" surface that wants to read the journal currently has no read-only entry point — every reader can also create the file and mutate the schema. + +## Decision + +Make projection the single reset path. Specifically: + +1. **Close the residual `sdlc/root` hole on the projection path.** Add `sdlc/root/{r}` and its descendants to `ResourceObserverSupport.MatchesPolyphonyBranchPattern` so the discovered-resource path in `JournalDriftAnalyzer.FoldDiscovered` catches orphan `sdlc/root/{id}` refs. Add test coverage that exercises the discovered-orphan branch path (currently only the expected-resource branch path is covered in `GitBranchObserver`-aware tests). + +2. **Verify projection covers every resource kind the pattern legs touch.** Produce a comparison: for each pattern leg, identify what it acts on, then confirm that the corresponding `IResourceObserver` + `IResourceDeleter` pair (plus the discovered-resource fall-through) handles the same surface. Any gap blocks deletion. Expected gaps to surface: tag-clearing semantics from `ResetCommands.Facets.cs`, manifest-file removal semantics from `ResetCommands.Manifest.cs`, state-revert semantics from `ResetCommands.State.cs`. + +3. **Delete the pattern strategy.** Remove the `--strategy pattern` option, the `ResetRootPatternCoreAsync` orchestration in `ResetCommands.Root.cs`, and the six per-leg partials in `ResetCommands.{Prs,Worktrees,Branches,Facets,Manifest,State}.cs`. Keep the strategy *parameter* surface for one release as an accepted-but-ignored value if needed for downstream caller compatibility (decided at deletion time based on caller survey). + +4. **Split the journal store into an explicit read-only reader.** Introduce `IJournalReader` (or equivalent) that opens SQLite as `Mode=ReadOnly`, performs no schema init, and surfaces "journal missing" as a typed outcome rather than implicitly creating the database. Re-route diagnostic-only consumers (e.g. drift analysis on already-completed runs, status surfaces) to the reader. The existing read-write `IJournalStore` is unchanged for command-side use. + +This is **deletion + sharpening**, not new architecture. The deepening already shipped via the projection path; what remained was the legacy escape hatch, the residual pattern-recognition hole, and the journal read-mode conflation. + +## Consequences + +- **Operators lose `--strategy pattern`.** Any run whose journal coverage is incomplete must use `--allow-unjournaled` on projection. The discovered-resource path (now extended with `sdlc/root/{id}`) provides the regex-driven fallback that pattern provided, but it runs under the projection executor's coverage gate and externally-mutated guard. +- **`ResetCommands` shrinks dramatically.** Six partial files disappear; `ResetCommands.Root.cs` becomes a thin delegator into `ProjectionResetExecutor`. `ResetCommandsBranchesEnumerationTests.cs` and `ResetCommandsWorktreesRetryTests.cs` need either deletion or migration to exercise the projection equivalents. +- **Single mental model for reset.** "What can a root own?" is answered in exactly one place (`CurrentExpectedState` + `IResourceObserver`s + `MatchesPolyphonyBranchPattern`). The `pattern` path's parallel answer is gone. +- **Read-only journal reader unlocks safer diagnostic surfaces.** Future inventory / status / close-out consumers can read the journal without risk of side-effecting the schema. +- **Risk: a hole in the pattern→projection equivalence verification (step 2) translates into silent regression after pattern deletion.** Mitigation: write the equivalence check as test code, not prose; gate deletion on green tests. + +## Considered alternatives + +1. **New `RunInventory` module with `owned`/`orphan`/`missing`/`disputed` verdict vocabulary, manifest as a second expectation source.** Rejected. The substrate already exists (`JournalDriftAnalyzer` emits `consistent`/`external_delete`/`external_mutation`/`external_create_polyphony_named`); the proposed verdicts were mostly renames. The `disputed` verdict required manifest-as-expectation-source, but the manifest carries run-level decisions (PGs, MGs, rebases, retired MGs), not per-resource ownership claims, so there is no real second source for it to disagree with the journal about. The original draft is captured in git history and `gap-analysis.md` for traceability. + +2. **Deprecate `pattern` with `[Obsolete]` + console warning, schedule deletion in a later release.** Rejected. The deprecation window adds carrying cost (two-path mental model, two test suites, two failure modes) without buying meaningful migration time: the only caller of pattern is the operator-issued reset command, and the alternative (`projection` + `--allow-unjournaled`) is already available. + +3. **Add manifest as a cross-check expectation source for the existing analyzer.** Rejected for this ADR; not justified by the bug evidence. Manifest-vs-journal divergence is a real failure mode in principle, but it has produced zero recorded incidents and modeling it would require a per-kind manifest→resource projection that the current manifest shape (PG/MG-centric) doesn't support cleanly. Reopen if a real incident surfaces. + +4. **Auto-fallback from projection to pattern on coverage failure.** Rejected. Today's behavior (`projection` errors out unless `--allow-unjournaled` is set) is explicit and operator-controllable; an auto-fallback would hide journal-coverage gaps from the operator at the exact moment they need to be visible. + +5. **Keep `pattern` as a permanent supported strategy alongside projection.** Rejected. Two paths means two enumeration disciplines means the AB#3245/3246 class can recur. The whole point of the projection design was to make the bug class structurally impossible; keeping pattern around defeats the point. + +## Relationship to other ADRs + +- **Refines, does not supersede, [`run-reset.md`](run-reset.md)** (accepted, PR 1 of 3 of the reset effort). That ADR introduced the per-root watermark + observer filter + proactive cleanup; this ADR closes out the projection-vs-pattern bifurcation that emerged after it. +- **Continues [`run-epoch-and-reset.md`](run-epoch-and-reset.md)** (draft). The run-epoch + first-class reset verb work assumes a single reset path; deleting `pattern` removes a branch from its design surface. + +## Migration + +Four chunks, scoped as the work items beneath this ADR's parent Issue: + +1. Close residual `sdlc/root` discovered-branch hole + tests. +2. Build the pattern→projection equivalence test suite; surface any gaps as blockers. +3. Delete `pattern` strategy + six legacy `ResetCommands.*.cs` partials; remove or update affected tests. +4. Introduce `IJournalReader` (read-only mode); migrate diagnostic-only consumers. + +Chunks 1 and 4 are independent of each other and of chunk 3. Chunk 2 gates chunk 3. Order: 1 + 4 in parallel, then 2, then 3. diff --git a/docs/decisions/run-epoch-and-reset.md b/docs/decisions/run-epoch-and-reset.md index f58e9a8..15894f3 100644 --- a/docs/decisions/run-epoch-and-reset.md +++ b/docs/decisions/run-epoch-and-reset.md @@ -198,6 +198,14 @@ Call-site inventory (verified by grep, 2026-05-17): ### Reset verb family +> **Superseded (AB#3308, 2026-05-24):** The sub-verb surface enumerated +> below was retired in +> [Pattern strategy retirement](pattern-strategy-retirement.md). The +> projection-based reset shipped in AB#3253 is now the only path, and +> the only public verb is `polyphony reset root` (no `--strategy` flag, +> no per-axis sub-verbs). The historical surface is preserved below for +> context; treat it as accurate-for-its-time, not current. + Six new CLI verbs under `polyphony reset`: ``` diff --git a/docs/decisions/run-reset.md b/docs/decisions/run-reset.md index df52946..c289177 100644 --- a/docs/decisions/run-reset.md +++ b/docs/decisions/run-reset.md @@ -214,6 +214,16 @@ populated by the server — no per-PR write needed. ## PR 2 implementation notes — reset verb family +> **Superseded (AB#3308, 2026-05-24):** The pattern-based sub-verb surface +> documented below was retired in +> [Pattern strategy retirement](pattern-strategy-retirement.md). The +> projection-based reset shipped in AB#3253 is now the only path; the six +> sub-verbs (`reset state`, `reset prs`, `reset worktrees`, +> `reset branches`, `reset facets`, `reset manifest`) no longer exist. +> Operators use `polyphony reset root` directly. The historical sub-verb +> table is preserved below for context; treat it as accurate-for-its-time, +> not current. + Ships six verbs under the `polyphony reset` verb group: | Verb | Role | diff --git a/scripts/Invoke-PolyphonySdlc.ps1 b/scripts/Invoke-PolyphonySdlc.ps1 index 1b82eac..b8202ed 100644 --- a/scripts/Invoke-PolyphonySdlc.ps1 +++ b/scripts/Invoke-PolyphonySdlc.ps1 @@ -314,10 +314,10 @@ if ($Intent -eq 'reset') { } # Auto-detect platform from origin for gh-identity pinning. The reset - # workflow itself does not take a platform input — the verbs resolve - # the platform per-leg (e.g. reset prs reads the manifest + - # .polyphony-config) — but we still need GH_TOKEN exported for the - # PR-abandonment leg when the workspace is on github. + # workflow itself does not take a platform input — the projection reset + # executor resolves the platform internally (the PR-abandonment leg + # reads the manifest + .polyphony-config) — but we still need GH_TOKEN + # exported for that leg when the workspace is on github. $resetPlatform = if ($Platform) { $Platform } else { $resetRemoteUrl = & git remote get-url origin 2>&1 if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($resetRemoteUrl)) { diff --git a/src/Polyphony/Commands/JournalCommands.cs b/src/Polyphony/Commands/JournalCommands.cs index b043ec9..d879f2a 100644 --- a/src/Polyphony/Commands/JournalCommands.cs +++ b/src/Polyphony/Commands/JournalCommands.cs @@ -4,9 +4,9 @@ namespace Polyphony.Commands; [VerbGroup("")] -public sealed partial class JournalCommands(IJournalStore store) +public sealed partial class JournalCommands(IJournalReader store) { - private readonly IJournalStore _store = store; + private readonly IJournalReader _store = store; private static void EmitError(string message, string? path = null) { diff --git a/src/Polyphony/Commands/JournalDriftCommand.cs b/src/Polyphony/Commands/JournalDriftCommand.cs index 0c7f760..4735c80 100644 --- a/src/Polyphony/Commands/JournalDriftCommand.cs +++ b/src/Polyphony/Commands/JournalDriftCommand.cs @@ -10,11 +10,11 @@ namespace Polyphony.Commands; [VerbGroup("")] public sealed class JournalDriftCommand( - IJournalStore store, + IJournalReader store, IWorkItemRepository repository, JournalDriftAnalyzer analyzer) { - private readonly IJournalStore _store = store; + private readonly IJournalReader _store = store; private readonly IWorkItemRepository _repository = repository; private readonly JournalDriftAnalyzer _analyzer = analyzer; diff --git a/src/Polyphony/Commands/JournalHasCommand.cs b/src/Polyphony/Commands/JournalHasCommand.cs index 3e025f3..77fb95b 100644 --- a/src/Polyphony/Commands/JournalHasCommand.cs +++ b/src/Polyphony/Commands/JournalHasCommand.cs @@ -6,7 +6,7 @@ namespace Polyphony.Commands; [VerbGroup("")] -public sealed class JournalHasCommand(IJournalStore store, IServiceProvider services) +public sealed class JournalHasCommand(IJournalReader store, IServiceProvider services) { /// /// Check whether the root journal contains a specific action. diff --git a/src/Polyphony/Commands/JournalOwnedCommand.cs b/src/Polyphony/Commands/JournalOwnedCommand.cs index 5a9f5a9..87adf3f 100644 --- a/src/Polyphony/Commands/JournalOwnedCommand.cs +++ b/src/Polyphony/Commands/JournalOwnedCommand.cs @@ -7,7 +7,7 @@ namespace Polyphony.Commands; [VerbGroup("")] -public sealed class JournalOwnedCommand(IJournalStore store, IServiceProvider services) +public sealed class JournalOwnedCommand(IJournalReader store, IServiceProvider services) { /// /// Return the root journal's current Polyphony-owned resources. diff --git a/src/Polyphony/Commands/JournalQueryCommand.cs b/src/Polyphony/Commands/JournalQueryCommand.cs index dfaedcb..559f84f 100644 --- a/src/Polyphony/Commands/JournalQueryCommand.cs +++ b/src/Polyphony/Commands/JournalQueryCommand.cs @@ -7,7 +7,7 @@ namespace Polyphony.Commands; [VerbGroup("")] -public sealed class JournalQueryCommand(IJournalStore store, IServiceProvider services) +public sealed class JournalQueryCommand(IJournalReader store, IServiceProvider services) { /// /// Query the root journal's projected resource effects. diff --git a/src/Polyphony/Commands/PlanCommands.DetectState.cs b/src/Polyphony/Commands/PlanCommands.DetectState.cs index 9da86d4..0d88d35 100644 --- a/src/Polyphony/Commands/PlanCommands.DetectState.cs +++ b/src/Polyphony/Commands/PlanCommands.DetectState.cs @@ -189,7 +189,7 @@ public async Task DetectState( var prUrl = latestPr.Url ?? string.Empty; // ── 6b. Run-watermark filter (root-root tag). ───────────────────── - // Stamped by `polyphony reset state`; when present, merged PRs + // Stamped by `polyphony reset root`; when present, merged PRs // whose MergedAt <= watermark are artifacts of a prior run and // must NOT count as "complete" — otherwise the redo dispatch // sees the stale merged plan PR, declares the plan complete, diff --git a/src/Polyphony/Commands/ResetCommands.Branches.cs b/src/Polyphony/Commands/ResetCommands.Branches.cs deleted file mode 100644 index 1421731..0000000 --- a/src/Polyphony/Commands/ResetCommands.Branches.cs +++ /dev/null @@ -1,320 +0,0 @@ -using System.Text.Json; -using ConsoleAppFramework; -using Polyphony.Annotations; -using Polyphony.Infrastructure.Processes; -using Polyphony.Journal; -using Polyphony.Journal.Payloads; - -namespace Polyphony.Commands; - -/// -/// polyphony reset branches --root N [--execute] — deletes -/// every polyphony-scoped branch for the root on both origin and the -/// local repo: plan/{N}, nested plan/{N}-*, mg/{N}-*, -/// impl/{N}-*, evidence/{N}-*, feature/{N}, and -/// literal sdlc/root/{id} branches for the root + descendants. -/// -/// Ordering: runs AFTER reset worktrees so no local -/// branch is pinned by a checked-out worktree, and AFTER -/// reset prs so no live PR is left pointing at a vanishing -/// branch (the platform handles that fine, but the human-readable -/// audit trail is cleaner if PR-close logs go first). -/// -/// Per-pattern enumeration: -/// -/// Origin: git ls-remote --heads origin refs/heads/{pattern}. -/// Local: git for-each-ref --format=%(refname:short) refs/heads/{pattern}. -/// -/// Both lists are de-duped and merged so a branch that exists only on -/// one side still gets the side-specific delete. -/// -/// Failure tolerance: per-branch failures (origin push -/// rejected, local branch refused for being checked out) are surfaced -/// as entries; the verb still reports -/// = true. Hard failures -/// (ls-remote crashed for all patterns) set Success = false. -/// -/// Dry-run is the default. Pass --execute to delete. -/// -public sealed partial class ResetCommands -{ - /// - /// Delete every root-scoped branch on origin and locally. - /// - /// Root root work-item ID. - /// Pass to actually delete branches. Without this flag, the verb is dry-run. - /// Cancellation token. - [Command("branches")] - [VerbResult(typeof(ResetBranchesResult))] - [JournaledAction(Action = "reset_branches")] - [MutatesResource(ResourceKind.GitBranch)] - public Task ResetBranches( - int root = RequiredInput.MissingInt, - bool execute = false, - CancellationToken ct = default) - { - if (RequiredInput.HaltIfMissing("reset branches", - ("--root", root == RequiredInput.MissingInt)) is { } halt) - return Task.FromResult(halt); - - return JournalCommandSupport.RunWithCapturedResultAsync( - _journalDecorator, - _runContext, - "reset_branches", - $"root:{root}", - innerCt => ResetBranchesCoreAsync(root, execute, innerCt), - PolyphonyJsonContext.Default.ResetBranchesResult, - (_, result) => new ResetBranchesPayload - { - Root = result?.Root ?? root, - DryRun = result?.DryRun ?? !execute, - Succeeded = result?.Success ?? false, - WasMutated = result is not null && !result.DryRun && result.DeletedBranches.Count > 0, - DeletedBranches = result?.DeletedBranches ?? [], - FailedBranches = result?.FailedBranches ?? [], - Error = result?.Error, - }, - PolyphonyJsonContext.Default.ResetBranchesPayload, - payload => payload.Succeeded, - payload => payload.WasMutated, - SelectResetBranchesEffects, - ct, - rootId: root); - } - - private async Task ResetBranchesCoreAsync( - int root, - bool execute, - CancellationToken ct) - { - ResetBranchesResult result; - try - { - var perBranch = await EnumerateRootBranchesBySideAsync(root, ct).ConfigureAwait(false); - - var deleted = new List(); - var failed = new List(); - - foreach (var (branch, side) in perBranch) - { - ct.ThrowIfCancellationRequested(); - - bool deletedRemote = false; - bool deletedLocal = false; - var failures = new List(); - - if (!execute) - { - deleted.Add(new ResetDeletedBranch - { - Branch = branch, - DeletedRemote = side.HasFlag(BranchSide.Remote), - DeletedLocal = side.HasFlag(BranchSide.Local), - }); - continue; - } - - if (side.HasFlag(BranchSide.Remote)) - { - var r = await _git.DeleteRemoteBranchAsync("origin", branch, ct).ConfigureAwait(false); - if (r.Succeeded) deletedRemote = true; - else failures.Add($"remote: {r.Stderr.Trim()}"); - } - if (side.HasFlag(BranchSide.Local)) - { - var l = await _git.DeleteLocalBranchAsync(branch, force: true, ct).ConfigureAwait(false); - if (l.Succeeded) deletedLocal = true; - else failures.Add($"local: {l.Stderr.Trim()}"); - } - - if (failures.Count == 0) - { - deleted.Add(new ResetDeletedBranch - { - Branch = branch, - DeletedRemote = deletedRemote, - DeletedLocal = deletedLocal, - }); - } - else - { - failed.Add(new ResetFailedBranch - { - Branch = branch, - Scope = FormatScope(side), - Reason = string.Join("; ", failures), - }); - } - } - - result = new ResetBranchesResult - { - Root = root, - Success = true, - DryRun = !execute, - DeletedBranches = deleted, - FailedBranches = failed, - }; - } - catch (OperationCanceledException) { throw; } - catch (Exception ex) - { - result = new ResetBranchesResult - { - Root = root, - Success = false, - DryRun = !execute, - DeletedBranches = [], - FailedBranches = [], - Error = $"Error resetting branches for root #{root}: {ex.Message}", - }; - } - - Emit(result); - return ExitCodes.Success; - } - - [Flags] - private enum BranchSide - { - None = 0, - Local = 1, - Remote = 2, - Both = Local | Remote, - } - - private static string FormatScope(BranchSide side) => side switch - { - BranchSide.Both => "both", - BranchSide.Local => "local", - BranchSide.Remote => "remote", - _ => "none", - }; - - /// - /// Enumerate every root-scoped branch grouped by which side(s) it - /// lives on. Order: pattern order; alphabetical within a pattern. - /// De-dupes across patterns. - /// - private async Task> - EnumerateRootBranchesBySideAsync(int root, CancellationToken ct) - { - var sides = new Dictionary(StringComparer.Ordinal); - var order = new List(); - - foreach (var pattern in RootBranchPatterns(root)) - { - await AccumulateBranchesBySideAsync(pattern, sides, order, ct).ConfigureAwait(false); - } - - foreach (var branch in await EnumerateRootSdlcBranchesAsync(root, ct).ConfigureAwait(false)) - { - await AccumulateBranchesBySideAsync(branch, sides, order, ct).ConfigureAwait(false); - } - - return order.Select(b => (b, sides[b])).ToList(); - } - - private async Task AccumulateBranchesBySideAsync( - string pattern, - Dictionary sides, - List order, - CancellationToken ct) - { - ct.ThrowIfCancellationRequested(); - - IReadOnlyList remoteRaw; - try - { - remoteRaw = await _git.LsRemoteHeadsAsync( - "origin", $"refs/heads/{pattern}", ct).ConfigureAwait(false); - } - catch (ExternalToolException) - { - remoteRaw = []; - } - - foreach (var line in remoteRaw) - { - var idx = line.IndexOf("refs/heads/", StringComparison.Ordinal); - if (idx < 0) continue; - var name = line[(idx + "refs/heads/".Length)..].Trim(); - if (string.IsNullOrEmpty(name)) continue; - if (!sides.ContainsKey(name)) - { - sides[name] = BranchSide.None; - order.Add(name); - } - sides[name] |= BranchSide.Remote; - } - - IReadOnlyList local; - try - { - local = await _git.ListLocalBranchesAsync(pattern, ct).ConfigureAwait(false); - } - catch (ExternalToolException) - { - local = []; - } - - foreach (var name in local) - { - if (string.IsNullOrEmpty(name)) continue; - if (!sides.ContainsKey(name)) - { - sides[name] = BranchSide.None; - order.Add(name); - } - sides[name] |= BranchSide.Local; - } - } - - private async Task> EnumerateRootSdlcBranchesAsync(int root, CancellationToken ct) - { - try - { - var hierarchy = await _walker.WalkAsync(root, maxDepth: 8, ct).ConfigureAwait(false); - if (hierarchy is null) - { - return [$"sdlc/root/{root.ToString(System.Globalization.CultureInfo.InvariantCulture)}"]; - } - - var result = new List(); - var seen = new HashSet(); - - void Collect(HierarchyResult node) - { - if (!seen.Add(node.WorkItemId)) - { - return; - } - - result.Add($"sdlc/root/{node.WorkItemId.ToString(System.Globalization.CultureInfo.InvariantCulture)}"); - - if (node.Children is null) - { - return; - } - - foreach (var child in node.Children) - { - Collect(child); - } - } - - Collect(hierarchy); - return result; - } - catch (OperationCanceledException) { throw; } - catch (Exception) - { - return []; - } - } - - private static void Emit(ResetBranchesResult result) - => Console.WriteLine(JsonSerializer.Serialize( - result, - PolyphonyJsonContext.Default.ResetBranchesResult)); -} diff --git a/src/Polyphony/Commands/ResetCommands.Facets.cs b/src/Polyphony/Commands/ResetCommands.Facets.cs deleted file mode 100644 index 142d1c6..0000000 --- a/src/Polyphony/Commands/ResetCommands.Facets.cs +++ /dev/null @@ -1,289 +0,0 @@ -using System.Text.Json; -using ConsoleAppFramework; -using Polyphony.Annotations; -using Polyphony.Journal; -using Polyphony.Journal.Payloads; -using Polyphony.Tagging; - -namespace Polyphony.Commands; - -/// -/// polyphony reset facets --root N [--execute] — strips the two -/// persisted "planning is already done" tags -/// (polyphony:facets=<csv> and polyphony:planned) -/// from the root and every descendant in scope. -/// -/// Why this exists. The watermark mechanism -/// () can only filter merged-PR observations by -/// merge time. The facet override + planned marker are persisted -/// decisions, not PR observations — they survive watermark advancement -/// and will silently steer the next state classify-lifecycle call -/// to implement-merge-group for a work item whose plan branch -/// has just been thrown away. See docs/decisions/run-reset.md -/// §"Why facets cleanup is separate from watermark" for the root -/// 62286666 incident write-up. -/// -/// Scope. Walks the root subtree via -/// (the planner can stamp facets/planned tags on any plannable parent, -/// not just the root). Items with no targeted tags are silently -/// skipped — only items that actually had a tag to remove appear in -/// . -/// -/// Read-after-write defense. Mirrors -/// : after every per-item -/// patch + twig sync, the verb re-reads the tag set and asserts -/// the targeted tags are absent. A silent ADO eventual-consistency -/// revert surfaces loudly in -/// = false. -/// -/// Per-item failure tolerance. Per the reset-family -/// contract, a single item that fails to patch does NOT halt the walk; -/// it surfaces as a = false -/// entry with a non-null . The -/// verb's overall remains true -/// in that case (it reflects "the walk completed", not "every item -/// succeeded"). A verb-wide failure (sync threw, walk threw) flips -/// to false. -/// -/// Dry-run. Default. Pass --execute to actually -/// patch tags. Dry-run reports the would-be removals so operators can -/// preview the cleanup. -/// -public sealed partial class ResetCommands -{ - /// - /// Strip the persisted planning-completion tags from the root - /// subtree. - /// - /// Root root work-item ID — the head of the subtree to walk. - /// Pass to actually patch tags. Without this flag, the verb runs in dry-run mode and emits the would-be removals without mutating ADO. - /// Cancellation token. - [Command("facets")] - [VerbResult(typeof(ResetFacetsResult))] - [JournaledAction(Action = "reset_facets")] - [MutatesResource(ResourceKind.AdoWorkItemTag)] - public Task ResetFacets( - int root = RequiredInput.MissingInt, - bool execute = false, - CancellationToken ct = default) - { - if (RequiredInput.HaltIfMissing("reset facets", - ("--root", root == RequiredInput.MissingInt)) is { } halt) - return Task.FromResult(halt); - - return JournalCommandSupport.RunWithCapturedResultAsync( - _journalDecorator, - _runContext, - "reset_facets", - $"root:{root}", - innerCt => ResetFacetsCoreAsync(root, execute, innerCt), - PolyphonyJsonContext.Default.ResetFacetsResult, - (_, result) => new ResetFacetsPayload - { - Root = result?.Root ?? root, - DryRun = result?.DryRun ?? !execute, - Succeeded = result?.Success ?? false, - WasMutated = result is not null && !result.DryRun && result.Items.Any(item => item.Verified == true), - ItemsScanned = result?.ItemsScanned ?? 0, - ItemsModified = result?.ItemsModified ?? 0, - TotalFacetTagsRemoved = result?.TotalFacetTagsRemoved ?? 0, - TotalPlannedTagsRemoved = result?.TotalPlannedTagsRemoved ?? 0, - Items = result?.Items ?? [], - Error = result?.Error, - }, - PolyphonyJsonContext.Default.ResetFacetsPayload, - payload => payload.Succeeded, - payload => payload.WasMutated, - SelectResetFacetsEffects, - ct, - rootId: root); - } - - private async Task ResetFacetsCoreAsync( - int root, - bool execute, - CancellationToken ct) - { - ResetFacetsResult result; - try - { - // Sync first so the walk + per-item reads observe a fresh - // local cache. Without this, tags freshly stamped by a - // just-finished prior process may still be staged in twig's - // pending queue and absent from `twig show`. - await _twig.SyncAsync(ct).ConfigureAwait(false); - - // maxDepth 16 is generous for CMMI work-item trees (Epic → - // Scenario → Deliverable → Task Group → Task is 5 levels; - // 16 covers any reasonable nesting + future type additions). - var hierarchy = await _walker.WalkAsync(root, maxDepth: 16, ct).ConfigureAwait(false); - if (hierarchy is null) - { - result = new ResetFacetsResult - { - Root = root, - Success = false, - DryRun = !execute, - Error = $"Root work item {root} not found in twig cache after sync.", - }; - Emit(result); - return ExitCodes.Success; - } - - var allItems = new List(); - FlattenHierarchy(hierarchy, allItems); - - var items = new List(); - var itemsModified = 0; - var totalFacetTagsRemoved = 0; - var totalPlannedTagsRemoved = 0; - var facetsPrefixEq = PolyphonyTags.FacetsPrefix + "="; - - foreach (var item in allItems) - { - ct.ThrowIfCancellationRequested(); - - var tags = TagSet.Parse(item.Tags); - var facetTagsToRemove = tags - .Where(t => t.StartsWith(facetsPrefixEq, StringComparison.OrdinalIgnoreCase)) - .ToList(); - var hasPlannedTag = tags.Contains(PolyphonyTags.Planned); - - if (facetTagsToRemove.Count == 0 && !hasPlannedTag) - continue; // nothing to do for this item - - if (!execute) - { - items.Add(new ResetFacetsItem - { - WorkItemId = item.WorkItemId, - FacetTagsRemoved = facetTagsToRemove, - PlannedTagRemoved = hasPlannedTag, - Verified = null, - }); - itemsModified++; - totalFacetTagsRemoved += facetTagsToRemove.Count; - if (hasPlannedTag) totalPlannedTagsRemoved++; - continue; - } - - try - { - var updated = facetTagsToRemove.Aggregate(tags, (acc, t) => acc.Remove(t)); - if (hasPlannedTag) updated = updated.Remove(PolyphonyTags.Planned); - - await _twig.PatchFieldsAsync(item.WorkItemId, - new Dictionary { ["System.Tags"] = updated.Format() }, - ct).ConfigureAwait(false); - - // Flush the staged patch to ADO before re-reading. - // Same staged-but-never-pushed failure mode as - // BranchCommands.MarkImplMerged (AB#3128 pattern). - await _twig.SyncAsync(ct).ConfigureAwait(false); - - // Read-after-write defense (AB#3189/3191 pattern, - // mirror of BranchCommands.MarkImplMerged): twig - // patch + sync exited 0 but the post-sync cache may - // still report the pre-patch tag set under ADO - // eventual-consistency. Re-read and assert the - // targeted tags are gone — a silent regression here - // would re-introduce the exact bug this verb - // exists to fix. - var verifyTags = await ReadRootTagsAsync(item.WorkItemId, ct).ConfigureAwait(false); - var stillHasFacets = verifyTags.Any(t => - t.StartsWith(facetsPrefixEq, StringComparison.OrdinalIgnoreCase)); - var stillHasPlanned = verifyTags.Contains(PolyphonyTags.Planned); - - if (stillHasFacets || stillHasPlanned) - { - var detail = stillHasFacets && stillHasPlanned - ? "polyphony:facets=* AND polyphony:planned" - : stillHasFacets ? "polyphony:facets=*" : "polyphony:planned"; - items.Add(new ResetFacetsItem - { - WorkItemId = item.WorkItemId, - FacetTagsRemoved = facetTagsToRemove, - PlannedTagRemoved = hasPlannedTag, - Verified = false, - Error = - $"Tag assertion failed for #{item.WorkItemId} after reset facets: " + - $"expected {detail} to be absent, cache reports them still present. " + - $"twig patch + twig sync exited 0 but the change did not persist — " + - $"likely ADO eventual-consistency race or twig push regression.", - }); - continue; - } - - items.Add(new ResetFacetsItem - { - WorkItemId = item.WorkItemId, - FacetTagsRemoved = facetTagsToRemove, - PlannedTagRemoved = hasPlannedTag, - Verified = true, - }); - itemsModified++; - totalFacetTagsRemoved += facetTagsToRemove.Count; - if (hasPlannedTag) totalPlannedTagsRemoved++; - } - catch (OperationCanceledException) { throw; } - catch (Exception ex) - { - items.Add(new ResetFacetsItem - { - WorkItemId = item.WorkItemId, - FacetTagsRemoved = facetTagsToRemove, - PlannedTagRemoved = hasPlannedTag, - Verified = false, - Error = $"Error patching tags on #{item.WorkItemId}: {ex.Message}", - }); - } - } - - result = new ResetFacetsResult - { - Root = root, - Success = true, - DryRun = !execute, - ItemsScanned = allItems.Count, - ItemsModified = itemsModified, - TotalFacetTagsRemoved = totalFacetTagsRemoved, - TotalPlannedTagsRemoved = totalPlannedTagsRemoved, - Items = items, - }; - } - catch (OperationCanceledException) { throw; } - catch (Exception ex) - { - result = new ResetFacetsResult - { - Root = root, - Success = false, - DryRun = !execute, - Error = $"Error walking hierarchy for root #{root}: {ex.Message}", - }; - } - - Emit(result); - return ExitCodes.Success; - } - - /// - /// Depth-first flatten of a tree into a - /// list. Order is parent-then-children so the root is always - /// at index 0 — useful for operators reading the dry-run output. - /// - private static void FlattenHierarchy(HierarchyResult node, List sink) - { - sink.Add(node); - if (node.Children is not null) - { - foreach (var child in node.Children) - FlattenHierarchy(child, sink); - } - } - - private static void Emit(ResetFacetsResult result) - => Console.WriteLine(JsonSerializer.Serialize( - result, - PolyphonyJsonContext.Default.ResetFacetsResult)); -} diff --git a/src/Polyphony/Commands/ResetCommands.JournalEffects.cs b/src/Polyphony/Commands/ResetCommands.JournalEffects.cs index 0282062..b9cf6c5 100644 --- a/src/Polyphony/Commands/ResetCommands.JournalEffects.cs +++ b/src/Polyphony/Commands/ResetCommands.JournalEffects.cs @@ -5,139 +5,13 @@ namespace Polyphony.Commands; public sealed partial class ResetCommands { - private static IReadOnlyList SelectResetPrsEffects(ResetPrsPayload? payload) - { - if (payload is null || !payload.Succeeded || payload.DryRun) - { - return []; - } - - return payload.AbandonedPrs - .Select(pr => new JournalResourceEffect - { - Kind = pr.Url.Contains("dev.azure.com", StringComparison.OrdinalIgnoreCase) ? ResourceKind.AdoPr : ResourceKind.GitHubPr, - Id = pr.Url, - Intent = ResourceIntent.EnsureAbsent, - Mutation = ResourceMutation.DeletedNow, - PolyphonyOwned = true, - Platform = pr.Url.Contains("dev.azure.com", StringComparison.OrdinalIgnoreCase) ? "ado" : "github", - ParentId = $"workitem:{payload.Root}", - Attributes = JournalCommandSupport.CreateAttributes(("pr_number", pr.Number), ("head_branch", pr.HeadBranch), ("repo_slug", payload.RepoSlug)), - }) - .ToArray(); - } - - private static IReadOnlyList SelectResetWorktreesEffects(ResetWorktreesPayload? payload) - { - if (payload is null || !payload.Succeeded || payload.DryRun) - { - return []; - } - - return payload.RemovedWorktrees - .Select(worktree => new JournalResourceEffect - { - Kind = ResourceKind.GitWorktree, - Id = worktree.Path, - Intent = ResourceIntent.EnsureAbsent, - Mutation = ResourceMutation.DeletedNow, - PolyphonyOwned = true, - ParentId = $"workitem:{payload.Root}", - Attributes = JournalCommandSupport.CreateAttributes(("branch", worktree.Branch), ("root_runs_root", payload.RootRunsRoot)), - }) - .ToArray(); - } - - private static IReadOnlyList SelectResetBranchesEffects(ResetBranchesPayload? payload) - { - if (payload is null || !payload.Succeeded || payload.DryRun) - { - return []; - } - - return payload.DeletedBranches - .Select(branch => new JournalResourceEffect - { - Kind = ResourceKind.GitBranch, - Id = branch.Branch, - Intent = ResourceIntent.EnsureAbsent, - Mutation = ResourceMutation.DeletedNow, - PolyphonyOwned = true, - ParentId = $"workitem:{payload.Root}", - Attributes = JournalCommandSupport.CreateAttributes(("deleted_local", branch.DeletedLocal), ("deleted_remote", branch.DeletedRemote)), - }) - .ToArray(); - } - - private static IReadOnlyList SelectResetFacetsEffects(ResetFacetsPayload? payload) - { - if (payload is null || !payload.Succeeded || payload.DryRun) - { - return []; - } - - var effects = new List(); - foreach (var item in payload.Items.Where(item => item.Verified == true)) - { - foreach (var facetTag in item.FacetTagsRemoved) - { - effects.Add(new JournalResourceEffect - { - Kind = ResourceKind.AdoWorkItemTag, - Id = $"{item.WorkItemId}:{facetTag}", - Intent = ResourceIntent.EnsureAbsent, - Mutation = ResourceMutation.DeletedNow, - PolyphonyOwned = true, - Platform = "ado", - ParentId = $"workitem:{item.WorkItemId}", - Attributes = JournalCommandSupport.CreateAttributes(("root_id", payload.Root), ("tag", facetTag)), - }); - } - - if (item.PlannedTagRemoved) - { - effects.Add(new JournalResourceEffect - { - Kind = ResourceKind.AdoWorkItemTag, - Id = $"{item.WorkItemId}:polyphony:planned", - Intent = ResourceIntent.EnsureAbsent, - Mutation = ResourceMutation.DeletedNow, - PolyphonyOwned = true, - Platform = "ado", - ParentId = $"workitem:{item.WorkItemId}", - Attributes = JournalCommandSupport.CreateAttributes(("root_id", payload.Root), ("tag", "polyphony:planned")), - }); - } - } - - return effects; - } - - private static IReadOnlyList SelectResetStateEffects(ResetStatePayload? payload) - { - if (payload is null || !payload.Succeeded || payload.DryRun || string.IsNullOrWhiteSpace(payload.NewWatermark)) - { - return []; - } - - return - [ - new JournalResourceEffect - { - Kind = ResourceKind.AdoWorkItemTag, - Id = $"{payload.Root}:polyphony:run-started-at={payload.NewWatermark}", - Intent = ResourceIntent.EnsurePresent, - Mutation = ResourceMutation.Changed, - PolyphonyOwned = true, - Platform = "ado", - ParentId = $"workitem:{payload.Root}", - Attributes = JournalCommandSupport.CreateAttributes(("previous_watermark", payload.PreviousWatermark), ("removed_duplicate_tags", payload.RemovedDuplicateTags)), - }, - ]; - } - private static IReadOnlyList SelectResetRootEffects(ResetRootPayload? payload) { + // reset_root delegates per-resource deletion to the projection + // executor, which writes its own journal entries via the + // per-kind IResourceDeleter pipeline. The root verb's own + // journal entry records the composite outcome (StepsCompleted / + // StepsFailed) and intentionally emits no resource effects. _ = payload; return []; } diff --git a/src/Polyphony/Commands/ResetCommands.Manifest.cs b/src/Polyphony/Commands/ResetCommands.Manifest.cs deleted file mode 100644 index 4a42ca6..0000000 --- a/src/Polyphony/Commands/ResetCommands.Manifest.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System.Text.Json; -using ConsoleAppFramework; -using Polyphony.Annotations; -using Polyphony.Infrastructure.Processes; - -namespace Polyphony.Commands; - -/// -/// polyphony reset manifest --root N [--execute] — read-only -/// inspection of the run manifest at origin/feature/{N}:.polyphony/run.yaml. -/// -/// Why read-only: the manifest is co-located with the -/// feature branch. deletes -/// feature/{N}, which clears the manifest as a side-effect. -/// There's no second copy of the manifest that needs separate cleanup. -/// This verb exists in PR 2 as an explicit inspection step so the -/// composite () can surface the manifest state -/// to the operator and so the workflow can route on it; --execute -/// is accepted (and ignored) for symmetry with the other reset verbs. -/// -/// If a future PR introduces a partial-reset mode that preserves -/// feature/{N} while clearing the manifest in-place, this verb -/// is where that writer lands. For now it reports -/// documenting why. -/// -/// Failure tolerance: a missing feature branch is reported -/// (not an error), a present branch with a missing manifest blob is -/// reported (not an error). Only an unexpected git failure marks -/// = false. -/// -public sealed partial class ResetCommands -{ - internal const string ManifestPath = ".polyphony/run.yaml"; - - /// - /// Inspect the run manifest for the root. - /// - /// Root root work-item ID. Manifest path is origin/feature/{root}:.polyphony/run.yaml. - /// Accepted for symmetry; this verb is read-only in PR 2 and ignores the flag. - /// Cancellation token. - [Command("manifest")] - [VerbResult(typeof(ResetManifestResult))] - public async Task ResetManifest( - int root = RequiredInput.MissingInt, - bool execute = false, - CancellationToken ct = default) - { - if (RequiredInput.HaltIfMissing("reset manifest", - ("--root", root == RequiredInput.MissingInt)) is { } halt) - return halt; - - var featureBranch = $"feature/{root}"; - - ResetManifestResult result; - try - { - var heads = await _git.LsRemoteHeadsAsync( - "origin", $"refs/heads/{featureBranch}", ct).ConfigureAwait(false); - var branchExists = heads.Any(line => - line.Contains($"refs/heads/{featureBranch}", StringComparison.Ordinal)); - - bool manifestPresent = false; - if (branchExists) - { - // ShowFileAtRefAsync returns null when the path doesn't - // exist at the ref. We need to fetch the ref first to - // ensure origin/feature/{N} is locally resolvable. - try - { - await _git.FetchAsync("origin", $"refs/heads/{featureBranch}:refs/remotes/origin/{featureBranch}", ct) - .ConfigureAwait(false); - } - catch (ExternalToolException) - { - // Fetch failure is non-fatal — fall through and let - // ShowFileAtRefAsync report null on the next step. - } - - var blob = await _git.ShowFileAtRefAsync( - $"origin/{featureBranch}", ManifestPath, ct).ConfigureAwait(false); - manifestPresent = blob is not null; - } - - result = new ResetManifestResult - { - Root = root, - Success = true, - DryRun = !execute, - FeatureBranch = featureBranch, - ManifestPath = ManifestPath, - FeatureBranchExists = branchExists, - ManifestPresent = manifestPresent, - DeferralReason = branchExists - ? "manifest cleared as a side-effect of `polyphony reset branches` " + - $"(deletes {featureBranch})" - : "feature branch already absent; manifest has nothing to clear", - }; - } - catch (OperationCanceledException) { throw; } - catch (Exception ex) - { - result = new ResetManifestResult - { - Root = root, - Success = false, - DryRun = !execute, - FeatureBranch = featureBranch, - ManifestPath = ManifestPath, - FeatureBranchExists = false, - ManifestPresent = false, - Error = $"Error inspecting manifest for root #{root}: {ex.Message}", - }; - } - - Emit(result); - return ExitCodes.Success; - } - - private static void Emit(ResetManifestResult result) - => Console.WriteLine(JsonSerializer.Serialize( - result, - PolyphonyJsonContext.Default.ResetManifestResult)); -} diff --git a/src/Polyphony/Commands/ResetCommands.Prs.cs b/src/Polyphony/Commands/ResetCommands.Prs.cs deleted file mode 100644 index cae808a..0000000 --- a/src/Polyphony/Commands/ResetCommands.Prs.cs +++ /dev/null @@ -1,299 +0,0 @@ -using System.Text.Json; -using ConsoleAppFramework; -using Polyphony.Annotations; -using Polyphony.Infrastructure.Processes; -using Polyphony.Journal; -using Polyphony.Journal.Payloads; - -namespace Polyphony.Commands; - -/// -/// polyphony reset prs --root N [--execute] [--comment "..."] — -/// abandons every OPEN PR targeting any branch in the root's polyphony -/// scope: plan/{N}, nested plan/{N}-*, mg/{N}-*, -/// impl/{N}-*, evidence/{N}-*, feature/{N}, and -/// literal sdlc/root/{id} branches for the root + descendants. -/// -/// Branch enumeration runs against origin (git ls-remote --heads -/// origin refs/heads/{pattern}) — we don't trust local branch state -/// because the operator may have a stale checkout. PR enumeration runs -/// per-concrete-branch via -/// with state: "open", then each open PR is closed via -/// with the -/// supplied --comment (or a default polyphony-reset comment). -/// -/// Cross-platform: GitHub PRs become state: CLOSED; -/// ADO PRs become status: abandoned. Both are reversible from the -/// platform UI if the operator changes their mind — this verb does -/// nothing irreversible to the PR record. -/// -/// Dry-run is the default. Pass --execute to actually -/// close. Dry-run still enumerates so the operator sees the would-be -/// abandon list. -/// -/// Failure tolerance: a single PR the platform refuses to -/// close (404, transient network, etc.) becomes a -/// entry but does NOT mark the verb as -/// failed. Hard failures (identity resolution crashed, ls-remote -/// failed) set = false. -/// -public sealed partial class ResetCommands -{ - /// - /// Default closing comment posted on each abandoned PR. Polyphony- - /// recognisable so operators can audit reset activity from the - /// platform's PR history view. - /// - internal const string DefaultResetComment = - "Closed by `polyphony reset prs` — this PR's root is being reset for redispatch."; - - /// - /// Abandon every open polyphony PR for the root. - /// - /// Root root work-item ID. - /// Pass to actually close PRs. Without this flag, the verb is dry-run. - /// Optional override for the closing comment posted on each PR. Defaults to . - /// Cancellation token. - [Command("prs")] - [VerbResult(typeof(ResetPrsResult))] - [JournaledAction(Action = "reset_prs")] - [MutatesResource(ResourceKind.GitHubPr)] - [MutatesResource(ResourceKind.AdoPr)] - public Task ResetPrs( - int root = RequiredInput.MissingInt, - bool execute = false, - string comment = "", - CancellationToken ct = default) - { - if (RequiredInput.HaltIfMissing("reset prs", - ("--root", root == RequiredInput.MissingInt)) is { } halt) - return Task.FromResult(halt); - - return JournalCommandSupport.RunWithCapturedResultAsync( - _journalDecorator, - _runContext, - "reset_prs", - $"root:{root}", - innerCt => ResetPrsCoreAsync(root, execute, comment, innerCt), - PolyphonyJsonContext.Default.ResetPrsResult, - (_, result) => new ResetPrsPayload - { - Root = result?.Root ?? root, - DryRun = result?.DryRun ?? !execute, - Succeeded = result?.Success ?? false, - WasMutated = result is not null && !result.DryRun && result.AbandonedPrs.Count > 0, - RepoSlug = result?.RepoSlug ?? string.Empty, - AbandonedPrs = result?.AbandonedPrs ?? [], - FailedPrs = result?.FailedPrs ?? [], - Error = result?.Error, - }, - PolyphonyJsonContext.Default.ResetPrsPayload, - payload => payload.Succeeded, - payload => payload.WasMutated, - SelectResetPrsEffects, - ct, - rootId: root); - } - - private async Task ResetPrsCoreAsync( - int root, - bool execute, - string comment, - CancellationToken ct) - { - var commentToPost = string.IsNullOrWhiteSpace(comment) ? DefaultResetComment : comment; - - ResetPrsResult result; - try - { - var identity = await _planObserver - .TryResolveRepoIdentityAsync(null, null, null, null, ct) - .ConfigureAwait(false); - - if (identity is null) - { - result = new ResetPrsResult - { - Root = root, - Success = false, - DryRun = !execute, - Error = - "Could not resolve repo identity. " + - "Run from a worktree of a polyphony-onboarded repo with an origin remote configured.", - }; - Emit(result); - return ExitCodes.Success; - } - - var slug = Sdlc.Observers.PullRequestReader.BuildRepoSlug(identity); - - // Enumerate concrete branches for each root pattern. - var branches = await EnumerateRootBranchesAsync(root, ct).ConfigureAwait(false); - - var abandoned = new List(); - var failed = new List(); - - foreach (var branch in branches) - { - ct.ThrowIfCancellationRequested(); - - IReadOnlyList openPrs; - try - { - openPrs = await _pullRequestReader.ListByHeadAsync( - identity, branch, "open", limit: null, ct).ConfigureAwait(false); - } - catch (Exception listEx) - { - failed.Add(new ResetFailedPr - { - Number = 0, - HeadBranch = branch, - Url = string.Empty, - Reason = $"PR enumeration failed: {listEx.Message}", - }); - continue; - } - - foreach (var pr in openPrs) - { - ct.ThrowIfCancellationRequested(); - var prUrl = pr.Url ?? Sdlc.Observers.PullRequestReader.BuildPrUrl(identity, pr.Number); - - if (!execute) - { - abandoned.Add(new ResetAbandonedPr - { - Number = pr.Number, - HeadBranch = branch, - Url = prUrl, - }); - continue; - } - - bool closed; - try - { - closed = await _pullRequestReader.CloseAsync( - identity, pr.Number, commentToPost, ct).ConfigureAwait(false); - } - catch (Exception closeEx) - { - failed.Add(new ResetFailedPr - { - Number = pr.Number, - HeadBranch = branch, - Url = prUrl, - Reason = $"Close threw: {closeEx.Message}", - }); - continue; - } - - if (closed) - { - abandoned.Add(new ResetAbandonedPr - { - Number = pr.Number, - HeadBranch = branch, - Url = prUrl, - }); - } - else - { - failed.Add(new ResetFailedPr - { - Number = pr.Number, - HeadBranch = branch, - Url = prUrl, - Reason = "Platform reported a non-success outcome (already closed, 404, or transient error).", - }); - } - } - } - - result = new ResetPrsResult - { - Root = root, - Success = true, - DryRun = !execute, - RepoSlug = slug, - AbandonedPrs = abandoned, - FailedPrs = failed, - }; - } - catch (OperationCanceledException) { throw; } - catch (Exception ex) - { - result = new ResetPrsResult - { - Root = root, - Success = false, - DryRun = !execute, - Error = $"Error resetting PRs for root #{root}: {ex.Message}", - }; - } - - Emit(result); - return ExitCodes.Success; - } - - /// - /// Resolve every concrete branch on origin that matches any of the - /// root's polyphony patterns. Returns a de-duped list in stable order - /// (pattern order, then alphabetical within a pattern). - /// - internal async Task> EnumerateRootBranchesAsync(int root, CancellationToken ct) - { - var seen = new HashSet(StringComparer.Ordinal); - var result = new List(); - foreach (var pattern in RootBranchPatterns(root)) - { - await AccumulateConcreteRemoteBranchesAsync(pattern, seen, result, ct).ConfigureAwait(false); - } - - foreach (var branch in await EnumerateRootSdlcBranchesAsync(root, ct).ConfigureAwait(false)) - { - await AccumulateConcreteRemoteBranchesAsync(branch, seen, result, ct).ConfigureAwait(false); - } - return result; - } - - private async Task AccumulateConcreteRemoteBranchesAsync( - string pattern, - HashSet seen, - List result, - CancellationToken ct) - { - ct.ThrowIfCancellationRequested(); - IReadOnlyList heads; - try - { - heads = await _git.LsRemoteHeadsAsync( - "origin", $"refs/heads/{pattern}", ct).ConfigureAwait(false); - } - catch (ExternalToolException) - { - // Transient network / permission failure on a single - // pattern — skip it. The other patterns may still - // succeed. The caller's per-branch enumeration error - // path will surface PR-list issues separately. - return; - } - - foreach (var line in heads) - { - // Each ls-remote line is "\trefs/heads/". - // Find the refs/heads/ suffix and strip the prefix. - var idx = line.IndexOf("refs/heads/", StringComparison.Ordinal); - if (idx < 0) continue; - var branch = line[(idx + "refs/heads/".Length)..].Trim(); - if (string.IsNullOrEmpty(branch)) continue; - if (seen.Add(branch)) result.Add(branch); - } - } - - private static void Emit(ResetPrsResult result) - => Console.WriteLine(JsonSerializer.Serialize( - result, - PolyphonyJsonContext.Default.ResetPrsResult)); -} diff --git a/src/Polyphony/Commands/ResetCommands.Root.cs b/src/Polyphony/Commands/ResetCommands.Root.cs index 8da4866..4f15ad7 100644 --- a/src/Polyphony/Commands/ResetCommands.Root.cs +++ b/src/Polyphony/Commands/ResetCommands.Root.cs @@ -26,7 +26,6 @@ public sealed partial class ResetCommands public Task ResetRoot( int root = RequiredInput.MissingInt, bool execute = false, - string strategy = ProjectionResetStrategy.Projection, bool allowUnjournaled = false, bool forceMutated = false, bool skipState = false, @@ -44,7 +43,7 @@ public Task ResetRoot( _runContext, "reset_root", JournalCommandSupport.WorkItemTarget(root), - innerCt => ResetRootCoreAsync(root, execute, strategy, allowUnjournaled, forceMutated, skipState, comment, innerCt), + innerCt => ResetRootCoreAsync(root, execute, allowUnjournaled, forceMutated, skipState, comment, innerCt), PolyphonyJsonContext.Default.ResetRootResult, (_, result) => new ResetRootPayload { @@ -69,209 +68,28 @@ public Task ResetRoot( private async Task ResetRootCoreAsync( int root, bool execute, - string strategy, bool allowUnjournaled, bool forceMutated, bool skipState, string comment, CancellationToken ct) { - ResetRootResult result; - if (string.Equals(strategy, ProjectionResetStrategy.Projection, StringComparison.OrdinalIgnoreCase)) - { - var executor = _projectionResetExecutor - ?? throw new InvalidOperationException("Projection reset executor is not configured."); - result = await executor.ExecuteAsync( - root, - new ProjectionResetExecutionOptions - { - Execute = execute, - AllowUnjournaled = allowUnjournaled, - ForceMutated = forceMutated, - SkipState = skipState, - Comment = comment, - }, - ct).ConfigureAwait(false); - } - else if (string.Equals(strategy, ProjectionResetStrategy.Pattern, StringComparison.OrdinalIgnoreCase)) - { - result = await ResetRootPatternCoreAsync(root, execute, skipState, comment, ct).ConfigureAwait(false); - } - else - { - result = new ResetRootResult + var executor = _projectionResetExecutor + ?? throw new InvalidOperationException("Projection reset executor is not configured."); + + var result = await executor.ExecuteAsync( + root, + new ProjectionResetExecutionOptions { - Root = root, - Success = false, - DryRun = !execute, - Strategy = strategy, - Coverage = ProjectionResetCoverage.None, - FallbackUsed = false, - StepsCompleted = [], - StepsFailed = [], - AttemptedTargets = [], - DeletedTargets = [], - FailedTargets = [], - RemainingResetTargets = [], - BlockedMutatedTargets = [], - StateSkipped = skipState, - Error = $"Unsupported reset strategy '{strategy}'. Expected 'projection' or 'pattern'.", - }; - } + Execute = execute, + AllowUnjournaled = allowUnjournaled, + ForceMutated = forceMutated, + SkipState = skipState, + Comment = comment, + }, + ct).ConfigureAwait(false); Console.WriteLine(JsonSerializer.Serialize(result, PolyphonyJsonContext.Default.ResetRootResult)); return ExitCodes.Success; } - - private async Task ResetRootPatternCoreAsync( - int root, - bool execute, - bool skipState, - string comment, - CancellationToken ct) - { - var stepsCompleted = new List(); - var stepsFailed = new List(); - ResetPrsResult? prs = null; - ResetWorktreesResult? worktrees = null; - ResetBranchesResult? branches = null; - ResetFacetsResult? facets = null; - ResetManifestResult? manifest = null; - ResetStateResult? state = null; - string? haltReason = null; - - try - { - prs = await RunPrsAsync(root, execute, comment, ct).ConfigureAwait(false); - if (prs.Success) stepsCompleted.Add("prs"); - else { stepsFailed.Add("prs"); haltReason = $"prs: {prs.Error}"; } - - if (haltReason is null) - { - worktrees = await RunWorktreesAsync(root, execute, ct).ConfigureAwait(false); - if (worktrees.Success) stepsCompleted.Add("worktrees"); - else { stepsFailed.Add("worktrees"); haltReason = $"worktrees: {worktrees.Error}"; } - } - - if (haltReason is null) - { - branches = await RunBranchesAsync(root, execute, ct).ConfigureAwait(false); - if (branches.Success) stepsCompleted.Add("branches"); - else { stepsFailed.Add("branches"); haltReason = $"branches: {branches.Error}"; } - } - - if (haltReason is null) - { - facets = await RunFacetsAsync(root, execute, ct).ConfigureAwait(false); - if (facets.Success) stepsCompleted.Add("facets"); - else { stepsFailed.Add("facets"); haltReason = $"facets: {facets.Error}"; } - } - - if (haltReason is null) - { - manifest = await RunManifestAsync(root, execute, ct).ConfigureAwait(false); - if (manifest.Success) stepsCompleted.Add("manifest"); - else { stepsFailed.Add("manifest"); haltReason = $"manifest: {manifest.Error}"; } - } - - if (haltReason is null && !skipState) - { - state = await RunStateAsync(root, execute, ct).ConfigureAwait(false); - if (state.Success) stepsCompleted.Add("state"); - else { stepsFailed.Add("state"); haltReason = $"state: {state.Error}"; } - } - } - catch (OperationCanceledException) - { - throw; - } - catch (Exception ex) - { - haltReason = $"pattern reset threw: {ex.Message}"; - } - - return new ResetRootResult - { - Root = root, - Success = stepsFailed.Count == 0 && haltReason is null, - DryRun = !execute, - Strategy = ProjectionResetStrategy.Pattern, - Coverage = ProjectionResetCoverage.None, - FallbackUsed = false, - StepsCompleted = stepsCompleted, - StepsFailed = stepsFailed, - AttemptedTargets = [], - DeletedTargets = [], - FailedTargets = [], - RemainingResetTargets = [], - BlockedMutatedTargets = [], - Prs = prs, - Worktrees = worktrees, - Branches = branches, - Facets = facets, - Manifest = manifest, - State = state, - StateSkipped = skipState, - Error = haltReason, - }; - } - - private async Task RunPrsAsync(int root, bool execute, string comment, CancellationToken ct) - { - var json = await CaptureAsync(() => ResetPrs(root, execute, comment, ct)).ConfigureAwait(false); - return JsonSerializer.Deserialize(json, PolyphonyJsonContext.Default.ResetPrsResult) - ?? throw new InvalidOperationException("reset prs returned unparseable JSON"); - } - - private async Task RunWorktreesAsync(int root, bool execute, CancellationToken ct) - { - var json = await CaptureAsync(() => ResetWorktrees(root, execute, ct)).ConfigureAwait(false); - return JsonSerializer.Deserialize(json, PolyphonyJsonContext.Default.ResetWorktreesResult) - ?? throw new InvalidOperationException("reset worktrees returned unparseable JSON"); - } - - private async Task RunBranchesAsync(int root, bool execute, CancellationToken ct) - { - var json = await CaptureAsync(() => ResetBranches(root, execute, ct)).ConfigureAwait(false); - return JsonSerializer.Deserialize(json, PolyphonyJsonContext.Default.ResetBranchesResult) - ?? throw new InvalidOperationException("reset branches returned unparseable JSON"); - } - - private async Task RunFacetsAsync(int root, bool execute, CancellationToken ct) - { - var json = await CaptureAsync(() => ResetFacets(root, execute, ct)).ConfigureAwait(false); - return JsonSerializer.Deserialize(json, PolyphonyJsonContext.Default.ResetFacetsResult) - ?? throw new InvalidOperationException("reset facets returned unparseable JSON"); - } - - private async Task RunManifestAsync(int root, bool execute, CancellationToken ct) - { - var json = await CaptureAsync(() => ResetManifest(root, execute, ct)).ConfigureAwait(false); - return JsonSerializer.Deserialize(json, PolyphonyJsonContext.Default.ResetManifestResult) - ?? throw new InvalidOperationException("reset manifest returned unparseable JSON"); - } - - private async Task RunStateAsync(int root, bool execute, CancellationToken ct) - { - var json = await CaptureAsync(() => ResetState(root, execute, ct)).ConfigureAwait(false); - return JsonSerializer.Deserialize(json, PolyphonyJsonContext.Default.ResetStateResult) - ?? throw new InvalidOperationException("reset state returned unparseable JSON"); - } - - private static async Task CaptureAsync(Func> action) - { - var prior = Console.Out; - using var writer = new StringWriter(); - try - { - Console.SetOut(writer); - _ = await action().ConfigureAwait(false); - } - finally - { - Console.SetOut(prior); - } - - return writer.ToString().Trim(); - } } diff --git a/src/Polyphony/Commands/ResetCommands.State.cs b/src/Polyphony/Commands/ResetCommands.State.cs deleted file mode 100644 index 55756b5..0000000 --- a/src/Polyphony/Commands/ResetCommands.State.cs +++ /dev/null @@ -1,253 +0,0 @@ -using System.Globalization; -using System.Text.Json; -using ConsoleAppFramework; -using Polyphony.Annotations; -using Polyphony.Journal; -using Polyphony.Journal.Payloads; -using Polyphony.Tagging; - -namespace Polyphony.Commands; - -/// -/// polyphony reset state --root N [--execute] — stamps the -/// per-root run-watermark tag (polyphony:run-started-at=<ISO-8601>) -/// on the root work item. -/// -/// This is the ONE writer of the watermark. The read side -/// (, -/// ) consults the watermark to distinguish -/// "satisfied by the current run" from "satisfied by any prior run" -/// — see docs/decisions/run-reset.md. -/// -/// Semantics: -/// -/// Removes every existing polyphony:run-started-at=* -/// tag from the root before adding a fresh one (defense -/// against duplicate tags from a prior reset bug or operator -/// hand-edit). Duplicate count is reported via -/// RemovedDuplicateTags. -/// Always stamps the current UTC time formatted via -/// -/// (millisecond precision). -/// Not idempotent in the strict "no change" sense — every call -/// advances the watermark. That's intentional: the verb's whole -/// purpose is to bump it. -/// -/// -/// Dry-run is the default. Pass --execute to actually -/// write. The dry-run envelope reports the would-be tag value and the -/// previous watermark so operators can preview the change. -/// -/// Read-after-write defense (mirror of -/// ): after the patch + sync, -/// the verb re-reads the tag set and asserts the freshly-written -/// watermark is present and parses back to a value strictly greater -/// than the previous watermark (if any). A silent ADO eventual- -/// consistency revert is surfaced loudly. -/// -public sealed partial class ResetCommands -{ - /// - /// Stamp the run-watermark tag on the root. - /// - /// Root root work-item ID — the work item that carries the watermark. - /// Pass to perform the write. Without this flag, the verb runs in dry-run mode and emits the would-be outcome without mutating ADO. - /// Cancellation token. - [Command("state")] - [VerbResult(typeof(ResetStateResult))] - [JournaledAction(Action = "reset_state")] - [MutatesResource(ResourceKind.AdoWorkItemTag)] - public Task ResetState( - int root = RequiredInput.MissingInt, - bool execute = false, - CancellationToken ct = default) - { - if (RequiredInput.HaltIfMissing("reset state", - ("--root", root == RequiredInput.MissingInt)) is { } halt) - return Task.FromResult(halt); - - return JournalCommandSupport.RunWithCapturedResultAsync( - _journalDecorator, - _runContext, - "reset_state", - JournalCommandSupport.WorkItemTarget(root), - innerCt => ResetStateCoreAsync(root, execute, innerCt), - PolyphonyJsonContext.Default.ResetStateResult, - (_, result) => new ResetStatePayload - { - Root = result?.Root ?? root, - DryRun = result?.DryRun ?? !execute, - Succeeded = result?.Success ?? false, - WasMutated = result is not null && !result.DryRun && result.Success, - PreviousWatermark = result?.PreviousWatermark, - NewWatermark = result?.NewWatermark, - RemovedDuplicateTags = result?.RemovedDuplicateTags ?? 0, - Error = result?.Error, - }, - PolyphonyJsonContext.Default.ResetStatePayload, - payload => payload.Succeeded, - payload => payload.WasMutated, - SelectResetStateEffects, - ct, - rootId: root, - workItemId: root); - } - - private async Task ResetStateCoreAsync( - int root, - bool execute, - CancellationToken ct) - { - ResetStateResult result; - try - { - await _twig.SyncAsync(ct).ConfigureAwait(false); - - var currentTags = await ReadRootTagsAsync(root, ct).ConfigureAwait(false); - var previousWatermark = PolyphonyTags.ReadRunStartedAt(currentTags); - var previousWatermarkText = previousWatermark is { } pw - ? FormatWatermark(pw) - : null; - - // Strip every existing run-started-at=* tag — there should be - // at most one, but if a prior reset bug or operator hand-edit - // left duplicates we want to converge on a single canonical - // entry. - var prefixEq = PolyphonyTags.RunStartedAtPrefix + "="; - var duplicates = currentTags - .Where(t => t.StartsWith(prefixEq, StringComparison.Ordinal)) - .ToList(); - - var newInstant = DateTimeOffset.UtcNow; - var newTag = PolyphonyTags.RunStartedAt(newInstant); - var newWatermarkText = FormatWatermark(newInstant); - - if (!execute) - { - result = new ResetStateResult - { - Root = root, - Success = true, - DryRun = true, - PreviousWatermark = previousWatermarkText, - NewWatermark = newWatermarkText, - RemovedDuplicateTags = Math.Max(0, duplicates.Count - 1), - }; - Emit(result); - return ExitCodes.Success; - } - - var stripped = duplicates.Aggregate(currentTags, (acc, t) => acc.Remove(t)); - var updated = stripped.Add(newTag); - - await _twig.PatchFieldsAsync(root, - new Dictionary { ["System.Tags"] = updated.Format() }, - ct).ConfigureAwait(false); - await _twig.SyncAsync(ct).ConfigureAwait(false); - - // Read-after-write: assert the watermark made it into the - // cache. AB#3189/3191 pattern from mark-impl-merged. - var verifyTags = await ReadRootTagsAsync(root, ct).ConfigureAwait(false); - var verifyWatermark = PolyphonyTags.ReadRunStartedAt(verifyTags); - - if (verifyWatermark is null) - { - result = new ResetStateResult - { - Root = root, - Success = false, - DryRun = false, - PreviousWatermark = previousWatermarkText, - NewWatermark = newWatermarkText, - RemovedDuplicateTags = duplicates.Count, - Error = - $"Watermark assertion failed for #{root} after reset state: " + - $"twig patch + sync exited 0 but no polyphony:run-started-at tag is " + - $"present in the cache — likely ADO eventual-consistency race or " + - $"twig push regression.", - }; - Emit(result); - return ExitCodes.Success; - } - - // Stamp drift > 60s would indicate the cache is returning a - // truly-stale value — almost certainly an eventual-consistency - // race. Surface so operators can rerun reset state. - var drift = (newInstant - verifyWatermark.Value).Duration(); - if (drift > TimeSpan.FromMinutes(1)) - { - result = new ResetStateResult - { - Root = root, - Success = false, - DryRun = false, - PreviousWatermark = previousWatermarkText, - NewWatermark = newWatermarkText, - RemovedDuplicateTags = duplicates.Count, - Error = - $"Watermark stamp drifted by {drift.TotalSeconds:F0}s for #{root} " + - $"after reset state: expected ~{newWatermarkText}, " + - $"cache reports {FormatWatermark(verifyWatermark.Value)}. " + - $"Likely ADO eventual-consistency race; re-run reset state.", - }; - Emit(result); - return ExitCodes.Success; - } - - result = new ResetStateResult - { - Root = root, - Success = true, - DryRun = false, - PreviousWatermark = previousWatermarkText, - NewWatermark = FormatWatermark(verifyWatermark.Value), - RemovedDuplicateTags = Math.Max(0, duplicates.Count - 1), - }; - } - catch (OperationCanceledException) { throw; } - catch (Exception ex) - { - result = new ResetStateResult - { - Root = root, - Success = false, - DryRun = !execute, - Error = $"Error stamping watermark on #{root}: {ex.Message}", - }; - } - - Emit(result); - return ExitCodes.Success; - } - - /// - /// Read the root's tag set via twig show. Mirrors - /// BranchCommands.ReadTagsAsync (re-implemented here to keep - /// this partial self-contained). - /// - private async Task ReadRootTagsAsync(int root, CancellationToken ct) - { - var item = await _twig.ShowAsync(root, ct).ConfigureAwait(false) - ?? throw new InvalidOperationException( - $"Root work item {root} not found in twig cache after sync."); - - var raw = item["tags"]?.GetValue() - ?? item["fields"]?["System.Tags"]?.GetValue(); - return TagSet.Parse(raw); - } - - /// - /// Canonical operator-facing serialisation of a watermark instant — - /// matches the tag format (ms precision, UTC, ISO-8601). Used in - /// envelope output and diagnostic strings so the human-readable - /// timestamp is consistent with what landed in the tag. - /// - private static string FormatWatermark(DateTimeOffset instant) => - instant.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ", - CultureInfo.InvariantCulture); - - private static void Emit(ResetStateResult result) - => Console.WriteLine(JsonSerializer.Serialize( - result, - PolyphonyJsonContext.Default.ResetStateResult)); -} diff --git a/src/Polyphony/Commands/ResetCommands.Worktrees.cs b/src/Polyphony/Commands/ResetCommands.Worktrees.cs deleted file mode 100644 index 9ffc981..0000000 --- a/src/Polyphony/Commands/ResetCommands.Worktrees.cs +++ /dev/null @@ -1,307 +0,0 @@ -using System.Text.Json; -using ConsoleAppFramework; -using Polyphony.Annotations; -using Polyphony.Infrastructure.Worktrees; -using Polyphony.Journal; -using Polyphony.Journal.Payloads; - -namespace Polyphony.Commands; - -/// -/// polyphony reset worktrees --root N [--execute] — removes -/// every git worktree rooted under {runs_root}/root-{N}/ and -/// then removes the (now-empty) root directory itself. -/// -/// Why this exists at all (vs. just letting the workflow re-use -/// worktrees): a partial run can leave the worktree's branch in a state -/// that git worktree add on the next run refuses to overwrite, -/// and detached worktrees pin local branches that -/// reset branches would otherwise sweep. Removing the whole -/// root-{N}/ tree gives the redispatch a clean slate. -/// -/// Ordering (per docs/decisions/run-reset.md): runs -/// AFTER reset prs and BEFORE reset branches, so that -/// branch deletion finds no checked-out worktree pinning the branch. -/// -/// Force removal: every worktree is removed with -/// --force. Polyphony worktrees are scratch space — losing -/// uncommitted changes inside a reset operation is the documented -/// contract. Operators who want to preserve in-progress work must -/// abort the reset BEFORE running this verb. -/// -/// Failure tolerance: a worktree that git refuses to -/// remove (locked, missing, permissions) is surfaced as a -/// entry; the verb still reports -/// = true. Directory deletion -/// failure (after worktrees gone) is tolerated and reported via -/// = false; the -/// verb still succeeds. -/// -public sealed partial class ResetCommands -{ - /// - /// Remove every root-scoped git worktree. - /// - /// Root root work-item ID. Used to compute {runs_root}/root-{N}/. - /// Pass to actually remove worktrees. Without this flag, the verb is dry-run. - /// Cancellation token. - [Command("worktrees")] - [VerbResult(typeof(ResetWorktreesResult))] - [JournaledAction(Action = "reset_worktrees")] - [MutatesResource(ResourceKind.GitWorktree)] - public Task ResetWorktrees( - int root = RequiredInput.MissingInt, - bool execute = false, - CancellationToken ct = default) - { - if (RequiredInput.HaltIfMissing("reset worktrees", - ("--root", root == RequiredInput.MissingInt)) is { } halt) - return Task.FromResult(halt); - - return JournalCommandSupport.RunWithCapturedResultAsync( - _journalDecorator, - _runContext, - "reset_worktrees", - $"root:{root}", - innerCt => ResetWorktreesCoreAsync(root, execute, innerCt), - PolyphonyJsonContext.Default.ResetWorktreesResult, - (_, result) => new ResetWorktreesPayload - { - Root = result?.Root ?? root, - DryRun = result?.DryRun ?? !execute, - Succeeded = result?.Success ?? false, - WasMutated = result is not null && !result.DryRun && (result.RemovedWorktrees.Count > 0 || result.RootDirDeleted), - RootRunsRoot = result?.RootRunsRoot ?? string.Empty, - RemovedWorktrees = result?.RemovedWorktrees ?? [], - FailedWorktrees = result?.FailedWorktrees ?? [], - RootDirDeleted = result?.RootDirDeleted ?? false, - Error = result?.Error, - }, - PolyphonyJsonContext.Default.ResetWorktreesPayload, - payload => payload.Succeeded, - payload => payload.WasMutated, - SelectResetWorktreesEffects, - ct, - rootId: root); - } - - private async Task ResetWorktreesCoreAsync( - int root, - bool execute, - CancellationToken ct) - { - ResetWorktreesResult result; - try - { - var commonDir = await _git.GetCommonDirAsync(ct).ConfigureAwait(false) - ?? throw new InvalidOperationException( - "git rev-parse --git-common-dir returned empty; not inside a git repo?"); - - var (runsRoot, _) = RunsRootResolver.Resolve(commonDir); - var rootRunsRoot = Path.Combine(runsRoot, $"root-{root}"); - - var listResult = await _git.WorktreeListAsync(ct).ConfigureAwait(false); - if (!listResult.Succeeded) - { - result = new ResetWorktreesResult - { - Root = root, - Success = false, - DryRun = !execute, - RootRunsRoot = rootRunsRoot, - RemovedWorktrees = [], - FailedWorktrees = [], - RootDirDeleted = false, - Error = - $"git worktree list --porcelain failed (exit {listResult.ExitCode}): " + - $"{listResult.Stderr.Trim()}", - }; - Emit(result); - return ExitCodes.Success; - } - - var entries = WorktreeCommands.ParsePorcelain(listResult.Stdout); - var rootEntries = entries - .Where(e => !string.IsNullOrEmpty(e.Path) - && PathBoundary.IsSameOrSubpath(rootRunsRoot, e.Path)) - .ToList(); - - var removed = new List(); - var failed = new List(); - - foreach (var entry in rootEntries) - { - ct.ThrowIfCancellationRequested(); - if (!execute) - { - removed.Add(new ResetRemovedWorktree - { - Path = entry.Path, - Branch = entry.Branch, - }); - continue; - } - - var (worktreeRemoved, lastError) = await TryRemoveWorktreeWithRetryAsync(entry.Path, ct) - .ConfigureAwait(false); - if (worktreeRemoved) - { - removed.Add(new ResetRemovedWorktree - { - Path = entry.Path, - Branch = entry.Branch, - }); - } - else - { - failed.Add(new ResetFailedWorktree - { - Path = entry.Path, - Branch = entry.Branch, - Reason = lastError ?? "git worktree remove failed after retries.", - }); - } - } - - if (execute) - { - try - { - await _git.WorktreePruneAsync(ct).ConfigureAwait(false); - } - catch (OperationCanceledException) { throw; } - catch (Exception) - { - // Best-effort cleanup only. - } - } - - // After all worktrees are gone (or in dry-run mode), tear - // down the root-{N} directory itself so the next dispatch - // starts clean. Dry-run skips the delete but still reports - // whether the directory currently exists. - bool dirDeleted = false; - if (Directory.Exists(rootRunsRoot)) - { - if (execute) - { - dirDeleted = await TryDeleteDirectoryWithRetryAsync(rootRunsRoot, ct).ConfigureAwait(false); - } - // Dry-run: dirDeleted stays false, RootDirExists implicit. - } - else - { - // Already absent. - dirDeleted = true; - } - - result = new ResetWorktreesResult - { - Root = root, - Success = true, - DryRun = !execute, - RootRunsRoot = rootRunsRoot, - RemovedWorktrees = removed, - FailedWorktrees = failed, - RootDirDeleted = dirDeleted, - }; - } - catch (OperationCanceledException) { throw; } - catch (Exception ex) - { - result = new ResetWorktreesResult - { - Root = root, - Success = false, - DryRun = !execute, - RootRunsRoot = string.Empty, - RemovedWorktrees = [], - FailedWorktrees = [], - RootDirDeleted = false, - Error = $"Error resetting worktrees for root #{root}: {ex.Message}", - }; - } - - Emit(result); - return ExitCodes.Success; - } - - private static readonly TimeSpan[] RemoveRetryBackoff = - [ - TimeSpan.FromMilliseconds(200), - TimeSpan.FromMilliseconds(500), - TimeSpan.FromMilliseconds(1000), - ]; - - private async Task<(bool removed, string? lastError)> TryRemoveWorktreeWithRetryAsync( - string path, - CancellationToken ct) - { - string? lastError = null; - - for (var attempt = 0; attempt < RemoveRetryBackoff.Length; attempt++) - { - ct.ThrowIfCancellationRequested(); - - var removeResult = await _git.WorktreeRemoveAsync(path, force: true, ct) - .ConfigureAwait(false); - if (removeResult.Succeeded) - { - return (true, null); - } - - lastError = $"git worktree remove exited {removeResult.ExitCode}: {removeResult.Stderr.Trim()}"; - if (!Directory.Exists(path)) - { - return (true, null); - } - - await Task.Delay(RemoveRetryBackoff[attempt], ct).ConfigureAwait(false); - if (!Directory.Exists(path)) - { - return (true, null); - } - } - - var finalExists = Directory.Exists(path); - return (!finalExists, finalExists ? lastError : null); - } - - private static async Task TryDeleteDirectoryWithRetryAsync(string path, CancellationToken ct) - { - for (var attempt = 0; attempt < RemoveRetryBackoff.Length; attempt++) - { - ct.ThrowIfCancellationRequested(); - if (!Directory.Exists(path)) - { - return true; - } - - try - { - Directory.Delete(path, recursive: true); - if (!Directory.Exists(path)) - { - return true; - } - } - catch (IOException) - { - // Race with another process holding a file handle; retry. - } - catch (UnauthorizedAccessException) - { - // Another process may still be releasing a handle; retry. - } - - await Task.Delay(RemoveRetryBackoff[attempt], ct).ConfigureAwait(false); - } - - return !Directory.Exists(path); - } - - private static void Emit(ResetWorktreesResult result) - => Console.WriteLine(JsonSerializer.Serialize( - result, - PolyphonyJsonContext.Default.ResetWorktreesResult)); -} diff --git a/src/Polyphony/Commands/ResetCommands.cs b/src/Polyphony/Commands/ResetCommands.cs index dad7a75..122a6a3 100644 --- a/src/Polyphony/Commands/ResetCommands.cs +++ b/src/Polyphony/Commands/ResetCommands.cs @@ -14,34 +14,22 @@ namespace Polyphony.Commands; /// observer filter shipped in PR 1 /// (). /// -/// The full design lives in docs/decisions/run-reset.md; -/// each verb's doc-comment summarises the contract specific to that -/// step. Common contract across the whole family: +/// Post-AB#3308 the verb group is a single verb, +/// , delegating to +/// . The full design lives in +/// docs/decisions/run-reset.md and the strategy-retirement +/// rationale in docs/decisions/pattern-strategy-retirement.md. /// /// -/// Dry-run default. Every verb runs in dry-run mode unless -/// the caller passes --execute. Dry-run emits the -/// would-be outcome envelope with no mutations. -/// Routing-style envelope. Always exits 0. Callers route +/// Dry-run default. Runs in dry-run mode unless the +/// caller passes --execute. +/// Routing-style envelope. Always exits 0; callers route /// on Success + Error in the JSON payload. -/// Per-item failure tolerance. A handful of failed items -/// (a PR the platform refuses to abandon, a worktree git can't -/// remove) does not poison the run — those surface as entries in -/// the per-step Failed* list with the verb still -/// reporting Success = true. Hard failures (identity -/// resolution crashed, twig sync blew up) set Success = -/// false. -/// Idempotent. Re-running any verb after a partial run -/// must converge on the same terminal state. The state writer -/// () is the single source of truth for -/// the watermark; the others are purely best-effort sweeps. +/// Idempotent. Re-running converges on the same terminal +/// state; the projection executor's coverage gate ensures +/// partial runs leave the system "still mid-reset" rather than +/// half-cleaned. /// -/// -/// Composite ordering (see ): -/// PRs → worktrees → branches → manifest → state. The state stamp lands -/// LAST so that a crash anywhere in the cleanup chain leaves the system -/// "still mid-reset" rather than "watermark advanced but PRs/branches -/// still leak past it". /// [VerbGroup("reset")] public sealed partial class ResetCommands( @@ -64,35 +52,16 @@ public sealed partial class ResetCommands( private readonly JournaledActionDecorator _journalDecorator = JournalCommandSupport.ResolveDecorator(journalDecorator); /// - /// Canonical root-scoped branch prefix set for ref classes whose - /// root scope can be expressed as a simple pattern. Used by - /// reset prs and reset branches alongside the separate - /// descendant-aware sdlc/root/{id} literal enumeration. - /// - /// Patterns are passed to git ls-remote --heads origin {pattern} - /// where refs/heads/ is prepended; for purely-local enumeration - /// the patterns are used with git for-each-ref. + /// Canonical PR-closure comment posted by the projection reset + /// executor's PR deleters ( + /// and ) + /// when no operator-supplied --comment override is in play. /// - /// The trailing -* on impl/mg/evidence accommodates the - /// {root}-{item} and {root}-{pgPath} shapes documented - /// in docs/decisions/branch-model.md. + /// Surfaces in the platform's PR history view so reviewers + /// understand why polyphony abandoned the PR rather than merging + /// it. /// - internal static IReadOnlyList RootBranchPatterns(int root) - { - var rootStr = root.ToString(System.Globalization.CultureInfo.InvariantCulture); - return [ - $"plan/{rootStr}", - $"plan/{rootStr}-*", - // MG branches use `_` between root_id and mg_path (see - // docs/decisions/branch-model.md §Branch names: `mg/{root_id}_{mg_path}`). - // The `_` is unambiguous because mg_id segments match - // `^[a-z][a-z0-9-]{0,30}$`, which excludes `_`. Earlier - // revisions used `-` here, which silently failed to match - // any MG branch and left mg/* refs on origin after reset. - $"mg/{rootStr}_*", - $"impl/{rootStr}-*", - $"evidence/{rootStr}-*", - $"feature/{rootStr}", - ]; - } + internal const string DefaultResetComment = + "Closed by `polyphony reset root` — this PR's root is being reset for redispatch."; } + diff --git a/src/Polyphony/Infrastructure/PolyphonyServiceRegistration.cs b/src/Polyphony/Infrastructure/PolyphonyServiceRegistration.cs index 177adb0..8a8265e 100644 --- a/src/Polyphony/Infrastructure/PolyphonyServiceRegistration.cs +++ b/src/Polyphony/Infrastructure/PolyphonyServiceRegistration.cs @@ -52,6 +52,7 @@ public static IServiceCollection AddPolyphonyServices( services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/Polyphony/Journal/IJournalReader.cs b/src/Polyphony/Journal/IJournalReader.cs new file mode 100644 index 0000000..8ee45c6 --- /dev/null +++ b/src/Polyphony/Journal/IJournalReader.cs @@ -0,0 +1,26 @@ +namespace Polyphony.Journal; + +/// +/// Read-only view of the journal database. Implementations MUST NOT +/// create, schema-initialize, or otherwise mutate the underlying SQLite +/// file. Use this contract for diagnostic surfaces +/// (polyphony journal {query,owned,has,drift}) and any other +/// consumer that only reads the journal — depending on +/// from a read-only path risks side-effecting +/// the schema, defeating the diagnostic invariant. +/// +/// +/// The companion writer interface extends this +/// reader, so production code that already holds an +/// IJournalStore continues to work. New code that only reads +/// should depend on so the DI container can +/// route it to the read-only implementation. +/// +public interface IJournalReader +{ + string DatabasePath { get; } + + Task> QueryAsync(JournalQuery query, CancellationToken ct); + + Task ExportAsync(string destinationPath, CancellationToken ct); +} diff --git a/src/Polyphony/Journal/JournalQueryRunner.cs b/src/Polyphony/Journal/JournalQueryRunner.cs new file mode 100644 index 0000000..ef3cc3f --- /dev/null +++ b/src/Polyphony/Journal/JournalQueryRunner.cs @@ -0,0 +1,170 @@ +using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using Microsoft.Data.Sqlite; + +namespace Polyphony.Journal; + +/// +/// Shared read-side SQL for both (writer + +/// reader) and (read-only). Lives outside +/// either implementation so the SELECT layout has exactly one definition. +/// +internal static class JournalQueryRunner +{ + public static async Task> QueryAsync( + SqliteConnection connection, + JournalQuery query, + CancellationToken ct) + { + ArgumentNullException.ThrowIfNull(connection); + ArgumentNullException.ThrowIfNull(query); + + await using var command = connection.CreateCommand(); + var sql = new StringBuilder( + "SELECT id, run_id, root_id, work_item_id, action, target, started_at, finished_at, outcome, error_code, error_message, payload_json FROM actions WHERE 1 = 1"); + + if (query.WorkItemId is { } workItemId) + { + sql.Append(" AND work_item_id = $workItemId"); + command.Parameters.AddWithValue("$workItemId", workItemId); + } + + if (query.RootId is { } rootId) + { + sql.Append(" AND root_id = $rootId"); + command.Parameters.AddWithValue("$rootId", rootId); + } + + if (!string.IsNullOrWhiteSpace(query.RunId)) + { + sql.Append(" AND run_id = $runId"); + command.Parameters.AddWithValue("$runId", query.RunId); + } + + if (!string.IsNullOrWhiteSpace(query.Action)) + { + sql.Append(" AND action = $action"); + command.Parameters.AddWithValue("$action", query.Action); + } + + if (query.Since is { } since) + { + sql.Append(" AND started_at >= $since"); + command.Parameters.AddWithValue("$since", since); + } + + if (query.Until is { } until) + { + sql.Append(" AND started_at <= $until"); + command.Parameters.AddWithValue("$until", until); + } + + sql.Append(" ORDER BY started_at ASC, id ASC;"); + command.CommandText = sql.ToString(); + + var results = new List(); + await using (var reader = await command.ExecuteReaderAsync(ct).ConfigureAwait(false)) + { + while (await reader.ReadAsync(ct).ConfigureAwait(false)) + { + results.Add(new JournalEntry + { + Id = reader.GetInt64(0), + RunId = reader.GetString(1), + RootId = reader.IsDBNull(2) ? null : reader.GetInt32(2), + WorkItemId = reader.IsDBNull(3) ? null : reader.GetInt32(3), + Action = reader.GetString(4), + Target = reader.GetString(5), + StartedAt = reader.GetInt64(6), + FinishedAt = reader.IsDBNull(7) ? null : reader.GetInt64(7), + Outcome = reader.IsDBNull(8) ? null : JournalOutcomeCodec.Parse(reader.GetString(8)), + ErrorCode = reader.IsDBNull(9) ? null : reader.GetString(9), + ErrorMessage = reader.IsDBNull(10) ? null : reader.GetString(10), + PayloadJson = reader.IsDBNull(11) ? null : reader.GetString(11), + Effects = [], + }); + } + } + + if (results.Count == 0) + { + return results; + } + + var effectsByEntryId = await LoadEffectsAsync(connection, results.Select(entry => entry.Id).ToArray(), ct).ConfigureAwait(false); + for (var index = 0; index < results.Count; index++) + { + var entry = results[index]; + results[index] = entry with + { + Effects = effectsByEntryId.TryGetValue(entry.Id, out var entryEffects) + ? entryEffects + : [], + }; + } + + return results; + } + + private static async Task>> LoadEffectsAsync( + SqliteConnection connection, + IReadOnlyList actionIds, + CancellationToken ct) + { + var byEntryId = new Dictionary>(); + if (actionIds.Count == 0) + { + return []; + } + + await using var command = connection.CreateCommand(); + var sql = new StringBuilder( + "SELECT journal_entry_id, kind, resource_id, intent, mutation, polyphony_owned, platform, parent_id, attributes_json FROM journal_effects WHERE journal_entry_id IN ("); + for (var index = 0; index < actionIds.Count; index++) + { + if (index > 0) + { + sql.Append(", "); + } + + var parameterName = $"$id{index}"; + sql.Append(parameterName); + command.Parameters.AddWithValue(parameterName, actionIds[index]); + } + + sql.Append(") ORDER BY journal_entry_id ASC, id ASC;"); + command.CommandText = sql.ToString(); + + await using var reader = await command.ExecuteReaderAsync(ct).ConfigureAwait(false); + while (await reader.ReadAsync(ct).ConfigureAwait(false)) + { + var journalEntryId = reader.GetInt64(0); + var effect = new JournalResourceEffect + { + Kind = reader.GetString(1), + Id = reader.GetString(2), + Intent = ResourceIntentCodec.Parse(reader.GetString(3)), + Mutation = ResourceMutationCodec.Parse(reader.GetString(4)), + PolyphonyOwned = reader.GetInt64(5) != 0, + Platform = reader.IsDBNull(6) ? null : reader.GetString(6), + ParentId = reader.IsDBNull(7) ? null : reader.GetString(7), + Attributes = reader.IsDBNull(8) ? null : DeserializeAttributes(reader.GetString(8)), + }; + + if (!byEntryId.TryGetValue(journalEntryId, out var entryEffects)) + { + entryEffects = []; + byEntryId[journalEntryId] = entryEffects; + } + + entryEffects.Add(effect); + } + + return byEntryId.ToDictionary(pair => pair.Key, pair => (IReadOnlyList)pair.Value); + } + + private static JsonObject DeserializeAttributes(string json) + => JsonNode.Parse(json) as JsonObject + ?? throw new JsonException("Journal effect attributes must deserialize to a JSON object."); +} diff --git a/src/Polyphony/Journal/JournalReader.cs b/src/Polyphony/Journal/JournalReader.cs new file mode 100644 index 0000000..5df8ca7 --- /dev/null +++ b/src/Polyphony/Journal/JournalReader.cs @@ -0,0 +1,92 @@ +using Microsoft.Data.Sqlite; + +namespace Polyphony.Journal; + +/// +/// Read-only journal accessor. Opens the SQLite file with +/// Mode=ReadOnly, performs no schema initialization, and surfaces +/// "journal missing" as a typed exception rather than silently creating +/// the database. Use this for diagnostic surfaces that must not +/// side-effect the journal (drift analysis, owned-resource reports, +/// arbitrary user-issued queries). +/// +/// +/// Mirrors 's read path but never touches the +/// schema. The shared SQL lives in so +/// the SELECT layout stays in one place. +/// +public sealed class JournalReader : IJournalReader +{ + private readonly string _databasePath; + + public JournalReader(IJournalLocator locator) + : this(locator.ResolveJournalPath()) + { + } + + internal JournalReader(string databasePath) + { + ArgumentException.ThrowIfNullOrWhiteSpace(databasePath); + _databasePath = Path.GetFullPath(databasePath); + } + + public string DatabasePath => _databasePath; + + public async Task> QueryAsync(JournalQuery query, CancellationToken ct) + { + ArgumentNullException.ThrowIfNull(query); + + await using var connection = await OpenConnectionAsync(ct).ConfigureAwait(false); + return await JournalQueryRunner.QueryAsync(connection, query, ct).ConfigureAwait(false); + } + + public async Task ExportAsync(string destinationPath, CancellationToken ct) + { + ArgumentException.ThrowIfNullOrWhiteSpace(destinationPath); + + var destination = Path.GetFullPath(destinationPath); + var destinationDirectory = Path.GetDirectoryName(destination); + if (!string.IsNullOrEmpty(destinationDirectory)) + Directory.CreateDirectory(destinationDirectory); + + if (File.Exists(destination)) + File.Delete(destination); + + await using var sourceConnection = await OpenConnectionAsync(ct).ConfigureAwait(false); + await using var destinationConnection = new SqliteConnection($"Data Source={destination};Mode=ReadWriteCreate;Pooling=False"); + await destinationConnection.OpenAsync(ct).ConfigureAwait(false); + ct.ThrowIfCancellationRequested(); + sourceConnection.BackupDatabase(destinationConnection); + } + + private async Task OpenConnectionAsync(CancellationToken ct) + { + if (!File.Exists(_databasePath)) + { + throw new JournalMissingException(_databasePath); + } + + var connection = new SqliteConnection($"Data Source={_databasePath};Mode=ReadOnly;Pooling=False"); + await connection.OpenAsync(ct).ConfigureAwait(false); + return connection; + } +} + +/// +/// Raised by when the journal database file +/// does not exist. Distinct from a connection-error so diagnostic +/// surfaces can surface "no journal for this root" as a first-class +/// outcome instead of either creating an empty database (the previous +/// behavior of using from a read path) or +/// returning a misleading empty result set. +/// +public sealed class JournalMissingException : Exception +{ + public JournalMissingException(string databasePath) + : base($"Journal database not found at '{databasePath}'.") + { + DatabasePath = databasePath; + } + + public string DatabasePath { get; } +} diff --git a/src/Polyphony/Journal/JournalStore.cs b/src/Polyphony/Journal/JournalStore.cs index 6df6b60..78a7a31 100644 --- a/src/Polyphony/Journal/JournalStore.cs +++ b/src/Polyphony/Journal/JournalStore.cs @@ -5,10 +5,8 @@ namespace Polyphony.Journal; -public interface IJournalStore +public interface IJournalStore : IJournalReader { - string DatabasePath { get; } - Task RecordStartAsync(JournalEntryStart entry, CancellationToken ct); Task RecordEndAsync( long actionId, @@ -18,8 +16,6 @@ Task RecordEndAsync( string? payloadJson, IReadOnlyList? effects, CancellationToken ct); - Task> QueryAsync(JournalQuery query, CancellationToken ct); - Task ExportAsync(string destinationPath, CancellationToken ct); } public sealed class JournalStore : IJournalStore @@ -119,91 +115,7 @@ public async Task> QueryAsync(JournalQuery query, Ca ArgumentNullException.ThrowIfNull(query); await using var connection = await OpenConnectionAsync(ct).ConfigureAwait(false); - await using var command = connection.CreateCommand(); - var sql = new StringBuilder( - "SELECT id, run_id, root_id, work_item_id, action, target, started_at, finished_at, outcome, error_code, error_message, payload_json FROM actions WHERE 1 = 1"); - - if (query.WorkItemId is { } workItemId) - { - sql.Append(" AND work_item_id = $workItemId"); - command.Parameters.AddWithValue("$workItemId", workItemId); - } - - if (query.RootId is { } rootId) - { - sql.Append(" AND root_id = $rootId"); - command.Parameters.AddWithValue("$rootId", rootId); - } - - if (!string.IsNullOrWhiteSpace(query.RunId)) - { - sql.Append(" AND run_id = $runId"); - command.Parameters.AddWithValue("$runId", query.RunId); - } - - if (!string.IsNullOrWhiteSpace(query.Action)) - { - sql.Append(" AND action = $action"); - command.Parameters.AddWithValue("$action", query.Action); - } - - if (query.Since is { } since) - { - sql.Append(" AND started_at >= $since"); - command.Parameters.AddWithValue("$since", since); - } - - if (query.Until is { } until) - { - sql.Append(" AND started_at <= $until"); - command.Parameters.AddWithValue("$until", until); - } - - sql.Append(" ORDER BY started_at ASC, id ASC;"); - command.CommandText = sql.ToString(); - - var results = new List(); - await using (var reader = await command.ExecuteReaderAsync(ct).ConfigureAwait(false)) - { - while (await reader.ReadAsync(ct).ConfigureAwait(false)) - { - results.Add(new JournalEntry - { - Id = reader.GetInt64(0), - RunId = reader.GetString(1), - RootId = reader.IsDBNull(2) ? null : reader.GetInt32(2), - WorkItemId = reader.IsDBNull(3) ? null : reader.GetInt32(3), - Action = reader.GetString(4), - Target = reader.GetString(5), - StartedAt = reader.GetInt64(6), - FinishedAt = reader.IsDBNull(7) ? null : reader.GetInt64(7), - Outcome = reader.IsDBNull(8) ? null : JournalOutcomeCodec.Parse(reader.GetString(8)), - ErrorCode = reader.IsDBNull(9) ? null : reader.GetString(9), - ErrorMessage = reader.IsDBNull(10) ? null : reader.GetString(10), - PayloadJson = reader.IsDBNull(11) ? null : reader.GetString(11), - Effects = [], - }); - } - } - - if (results.Count == 0) - { - return results; - } - - var effectsByEntryId = await LoadEffectsAsync(connection, results.Select(entry => entry.Id).ToArray(), ct).ConfigureAwait(false); - for (var index = 0; index < results.Count; index++) - { - var entry = results[index]; - results[index] = entry with - { - Effects = effectsByEntryId.TryGetValue(entry.Id, out var entryEffects) - ? entryEffects - : [], - }; - } - - return results; + return await JournalQueryRunner.QueryAsync(connection, query, ct).ConfigureAwait(false); } public async Task ExportAsync(string destinationPath, CancellationToken ct) @@ -291,70 +203,9 @@ INSERT INTO journal_effects( await command.ExecuteNonQueryAsync(ct).ConfigureAwait(false); } - private static async Task>> LoadEffectsAsync( - SqliteConnection connection, - IReadOnlyList actionIds, - CancellationToken ct) - { - var byEntryId = new Dictionary>(); - if (actionIds.Count == 0) - { - return []; - } - - await using var command = connection.CreateCommand(); - var sql = new StringBuilder( - "SELECT journal_entry_id, kind, resource_id, intent, mutation, polyphony_owned, platform, parent_id, attributes_json FROM journal_effects WHERE journal_entry_id IN ("); - for (var index = 0; index < actionIds.Count; index++) - { - if (index > 0) - { - sql.Append(", "); - } - - var parameterName = $"$id{index}"; - sql.Append(parameterName); - command.Parameters.AddWithValue(parameterName, actionIds[index]); - } - - sql.Append(") ORDER BY journal_entry_id ASC, id ASC;"); - command.CommandText = sql.ToString(); - - await using var reader = await command.ExecuteReaderAsync(ct).ConfigureAwait(false); - while (await reader.ReadAsync(ct).ConfigureAwait(false)) - { - var journalEntryId = reader.GetInt64(0); - var effect = new JournalResourceEffect - { - Kind = reader.GetString(1), - Id = reader.GetString(2), - Intent = ResourceIntentCodec.Parse(reader.GetString(3)), - Mutation = ResourceMutationCodec.Parse(reader.GetString(4)), - PolyphonyOwned = reader.GetInt64(5) != 0, - Platform = reader.IsDBNull(6) ? null : reader.GetString(6), - ParentId = reader.IsDBNull(7) ? null : reader.GetString(7), - Attributes = reader.IsDBNull(8) ? null : DeserializeAttributes(reader.GetString(8)), - }; - - if (!byEntryId.TryGetValue(journalEntryId, out var entryEffects)) - { - entryEffects = []; - byEntryId[journalEntryId] = entryEffects; - } - - entryEffects.Add(effect); - } - - return byEntryId.ToDictionary(pair => pair.Key, pair => (IReadOnlyList)pair.Value); - } - private static string? SerializeAttributes(JsonObject? attributes) => attributes is null ? null : JsonSerializer.Serialize(attributes, PolyphonyJsonContext.Default.JsonObject); - private static JsonObject DeserializeAttributes(string json) - => JsonNode.Parse(json) as JsonObject - ?? throw new JsonException("Journal effect attributes must deserialize to a JSON object."); - private static async Task ExecuteNonQueryAsync(SqliteConnection connection, string sql, CancellationToken ct) { await using var command = connection.CreateCommand(); diff --git a/src/Polyphony/Journal/Observers/ResourceObserverSupport.cs b/src/Polyphony/Journal/Observers/ResourceObserverSupport.cs index 616130d..ab840f5 100644 --- a/src/Polyphony/Journal/Observers/ResourceObserverSupport.cs +++ b/src/Polyphony/Journal/Observers/ResourceObserverSupport.cs @@ -117,6 +117,38 @@ public static string StripRefsHeadsPrefix(string value) ?? GetStringAttribute(attributes, "sha") ?? GetStringAttribute(attributes, "commit_sha"); + /// + /// Returns true when is a polyphony-style + /// branch attributable to from the branch name alone. + /// + /// + /// Recognized schemes (all defined in + /// docs/decisions/branch-model.md): + /// + /// feature/{r} + /// plan/{r}, plan/{r}-{descendant} + /// mg/{r}_{mg_path} + /// impl/{r}-{item} + /// evidence/{r}, evidence/{r}-{item} + /// sdlc/root/{r} — the root's own per-item SDLC branch. + /// + /// + /// Known gap (intentional): the sdlc/root/{id} scheme is also + /// produced for every descendant work item under the root (see + /// ResetCommands.Branches.EnumerateRootSdlcBranchesAsync). For an + /// orphan sdlc/root/{child_id} branch — i.e. one not in the journal + /// — attributing it to a specific root requires walking the work-item + /// hierarchy, which this matcher (operating on the branch name only) + /// cannot do. Journaled sdlc/root/{child_id} branches are caught + /// regardless via the expected-resource path in + /// GitBranchObserver.ObserveAsync; only the orphan-descendant case + /// is uncovered here. If the pattern→projection equivalence suite + /// (AB#3307) surfaces real incidents of orphan descendant sdlc/root + /// branches, thread a hierarchy-resolved HashSet<int> of + /// in-scope work-item ids through ResourceObservationRequest and + /// add an overload here. + /// + /// public static bool MatchesPolyphonyBranchPattern(int rootId, string branchName) { var prefix = rootId.ToString(CultureInfo.InvariantCulture); @@ -126,7 +158,8 @@ public static bool MatchesPolyphonyBranchPattern(int rootId, string branchName) || branchName.StartsWith($"mg/{prefix}_", StringComparison.Ordinal) || branchName.StartsWith($"impl/{prefix}-", StringComparison.Ordinal) || string.Equals(branchName, $"evidence/{prefix}", StringComparison.Ordinal) - || branchName.StartsWith($"evidence/{prefix}-", StringComparison.Ordinal); + || branchName.StartsWith($"evidence/{prefix}-", StringComparison.Ordinal) + || string.Equals(branchName, $"sdlc/root/{prefix}", StringComparison.Ordinal); } public static JsonObject CreateActualAttributes(params (string Name, object? Value)[] values) diff --git a/src/Polyphony/Journal/Payloads/ResetBranchesPayload.cs b/src/Polyphony/Journal/Payloads/ResetBranchesPayload.cs deleted file mode 100644 index 149729d..0000000 --- a/src/Polyphony/Journal/Payloads/ResetBranchesPayload.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Polyphony.Journal.Payloads; - -public sealed record ResetBranchesPayload -{ - public required int Root { get; init; } - public required bool DryRun { get; init; } - public required bool Succeeded { get; init; } - public required bool WasMutated { get; init; } - public required IReadOnlyList DeletedBranches { get; init; } - public required IReadOnlyList FailedBranches { get; init; } - public string? Error { get; init; } -} diff --git a/src/Polyphony/Journal/Payloads/ResetFacetsPayload.cs b/src/Polyphony/Journal/Payloads/ResetFacetsPayload.cs deleted file mode 100644 index 7f80afa..0000000 --- a/src/Polyphony/Journal/Payloads/ResetFacetsPayload.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Polyphony.Journal.Payloads; - -public sealed record ResetFacetsPayload -{ - public required int Root { get; init; } - public required bool DryRun { get; init; } - public required bool Succeeded { get; init; } - public required bool WasMutated { get; init; } - public required int ItemsScanned { get; init; } - public required int ItemsModified { get; init; } - public required int TotalFacetTagsRemoved { get; init; } - public required int TotalPlannedTagsRemoved { get; init; } - public required IReadOnlyList Items { get; init; } - public string? Error { get; init; } -} diff --git a/src/Polyphony/Journal/Payloads/ResetPrsPayload.cs b/src/Polyphony/Journal/Payloads/ResetPrsPayload.cs deleted file mode 100644 index 27619de..0000000 --- a/src/Polyphony/Journal/Payloads/ResetPrsPayload.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Polyphony.Journal.Payloads; - -public sealed record ResetPrsPayload -{ - public required int Root { get; init; } - public required bool DryRun { get; init; } - public required bool Succeeded { get; init; } - public required bool WasMutated { get; init; } - public required string RepoSlug { get; init; } - public required IReadOnlyList AbandonedPrs { get; init; } - public required IReadOnlyList FailedPrs { get; init; } - public string? Error { get; init; } -} diff --git a/src/Polyphony/Journal/Payloads/ResetStatePayload.cs b/src/Polyphony/Journal/Payloads/ResetStatePayload.cs deleted file mode 100644 index 902ad73..0000000 --- a/src/Polyphony/Journal/Payloads/ResetStatePayload.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Polyphony.Journal.Payloads; - -public sealed record ResetStatePayload -{ - public required int Root { get; init; } - public required bool DryRun { get; init; } - public required bool Succeeded { get; init; } - public required bool WasMutated { get; init; } - public string? PreviousWatermark { get; init; } - public string? NewWatermark { get; init; } - public required int RemovedDuplicateTags { get; init; } - public string? Error { get; init; } -} diff --git a/src/Polyphony/Journal/Payloads/ResetWorktreesPayload.cs b/src/Polyphony/Journal/Payloads/ResetWorktreesPayload.cs deleted file mode 100644 index 3d8cccd..0000000 --- a/src/Polyphony/Journal/Payloads/ResetWorktreesPayload.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Polyphony.Journal.Payloads; - -public sealed record ResetWorktreesPayload -{ - public required int Root { get; init; } - public required bool DryRun { get; init; } - public required bool Succeeded { get; init; } - public required bool WasMutated { get; init; } - public required string RootRunsRoot { get; init; } - public required IReadOnlyList RemovedWorktrees { get; init; } - public required IReadOnlyList FailedWorktrees { get; init; } - public required bool RootDirDeleted { get; init; } - public string? Error { get; init; } -} diff --git a/src/Polyphony/Journal/Reset/ProjectionResetExecutor.cs b/src/Polyphony/Journal/Reset/ProjectionResetExecutor.cs index fc21d30..f6325bc 100644 --- a/src/Polyphony/Journal/Reset/ProjectionResetExecutor.cs +++ b/src/Polyphony/Journal/Reset/ProjectionResetExecutor.cs @@ -169,9 +169,7 @@ private static ResetRootResult CreateResult( Root = rootId, Success = string.IsNullOrWhiteSpace(error), DryRun = !options.Execute, - Strategy = ProjectionResetStrategy.Projection, Coverage = coverage, - FallbackUsed = false, AttemptedTargets = attemptedTargets, DeletedTargets = deletedTargets, FailedTargets = failedTargets, @@ -286,9 +284,3 @@ public sealed record ProjectionResetExecutionOptions public bool SkipState { get; init; } public string Comment { get; init; } = string.Empty; } - -public static class ProjectionResetStrategy -{ - public const string Projection = "projection"; - public const string Pattern = "pattern"; -} diff --git a/src/Polyphony/Models/ResetBranchesResult.cs b/src/Polyphony/Models/ResetBranchesResult.cs deleted file mode 100644 index 8fde2eb..0000000 --- a/src/Polyphony/Models/ResetBranchesResult.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace Polyphony; - -/// -/// Output envelope for polyphony reset branches --root N — deletes -/// all polyphony branches for the root (local + origin) across the prefix -/// set plan/{N}, mg/{N}-*, impl/{N}-*, -/// evidence/{N}-*, feature/{N}. -/// -/// Routing-style envelope: always exits 0; per-branch failures show -/// up as entries in with the verb still -/// reporting = true. A true failure (e.g. ls-remote -/// crashed) sets = false. -/// -public sealed record ResetBranchesResult -{ - public required int Root { get; init; } - public required bool Success { get; init; } - public required bool DryRun { get; init; } - - /// Branches that were successfully deleted (local + origin). - public IReadOnlyList DeletedBranches { get; init; } = []; - - /// Branches the git command refused to delete (e.g. checked out, missing, force-required without --execute). - public IReadOnlyList FailedBranches { get; init; } = []; - - public string? Error { get; init; } -} - -/// One branch that was deleted (or would be in dry-run). -public sealed record ResetDeletedBranch -{ - /// Branch name (no refs/heads/ or origin/ prefix). - public required string Branch { get; init; } - - /// True when a local copy was present and deleted. - public required bool DeletedLocal { get; init; } - - /// True when an origin copy was present and deleted. - public required bool DeletedRemote { get; init; } -} - -/// One branch deletion that failed. -public sealed record ResetFailedBranch -{ - public required string Branch { get; init; } - - /// "local" | "remote" | "both" - public required string Scope { get; init; } - - /// Short operator-facing diagnostic. - public required string Reason { get; init; } -} diff --git a/src/Polyphony/Models/ResetFacetsResult.cs b/src/Polyphony/Models/ResetFacetsResult.cs deleted file mode 100644 index 0563ab9..0000000 --- a/src/Polyphony/Models/ResetFacetsResult.cs +++ /dev/null @@ -1,108 +0,0 @@ -namespace Polyphony; - -/// -/// Output envelope for polyphony reset facets --root N — strips -/// the two persisted "planning is already done" tags from the root -/// and every descendant in scope: -/// -/// -/// polyphony:facets=<csv> — the per-item facet -/// override stamped by -/// when the architect declared root_facets in plan -/// front-matter. While present, Sdlc.RequirementInputResolver -/// overrides the type-config default facet set and the work item -/// skips the plannable facet on classify-lifecycle. -/// polyphony:planned — the bare "this item has been -/// planned" marker stamped on plan-merge by -/// ; consulted by -/// the plan-level workflow's resume-detection gate -/// (Sdlc.Observers.PlanObserver). -/// -/// -/// The watermark mechanism (polyphony:run-started-at) can -/// only filter PR-based observations by merge time; it cannot demote a -/// persisted planning decision. So when an operator throws away a plan -/// branch via , the -/// matching facet/planned tags would survive on the work item and steer -/// the next classify-lifecycle call away from plan-level — -/// reproducing the root 62286666 incident -/// (docs/decisions/run-reset.md §"Why facets cleanup is separate -/// from watermark"). -/// -/// Routing-style envelope: always exits 0. Per-item failures -/// surface in as entries with -/// = false and a non-null ; the verb -/// continues across siblings. reflects "the walk -/// itself completed" — a verb-wide failure (twig sync crashed, -/// hierarchy walk threw) flips to false with -/// populated. Use this to mirror the -/// / -/// per-item-failure tolerance. -/// -public sealed record ResetFacetsResult -{ - /// Root root work-item ID (mirrors --root). - public required int Root { get; init; } - - /// True when the walk and per-item processing completed without a verb-wide error. - public required bool Success { get; init; } - - /// True when this was a dry-run preview (no writes performed). - public required bool DryRun { get; init; } - - /// Number of work items visited in the root subtree (root + descendants). - public int ItemsScanned { get; init; } - - /// - /// Number of items that had at least one targeted tag to remove. In - /// dry-run mode this is the count of items that WOULD be modified; - /// in execute mode it is the count of items where the patch + - /// read-after-write verification succeeded. - /// - public int ItemsModified { get; init; } - - /// Total count of polyphony:facets=* tags removed across all items. - public int TotalFacetTagsRemoved { get; init; } - - /// Total count of polyphony:planned tags removed across all items. - public int TotalPlannedTagsRemoved { get; init; } - - /// - /// Per-item entries — one per work item that had at least one tag - /// to remove. Items with no targeted tags are silently skipped and - /// do NOT appear here (keeps the envelope small for deep trees). - /// - public IReadOnlyList Items { get; init; } = []; - - /// Error message when is false. - public string? Error { get; init; } -} - -/// -/// Per-item result inside a . One entry -/// per work item where at least one polyphony:facets=* or -/// polyphony:planned tag was present. -/// -public sealed record ResetFacetsItem -{ - /// The work item ID this entry describes. - public required int WorkItemId { get; init; } - - /// The verbatim polyphony:facets=* tag values removed (preserves casing). - public required IReadOnlyList FacetTagsRemoved { get; init; } - - /// True when the polyphony:planned bare tag was present and removed. - public required bool PlannedTagRemoved { get; init; } - - /// - /// Null in dry-run (no write performed, no verification). In execute - /// mode: true when the read-after-write check confirmed the targeted - /// tags are absent; false when the patch + sync exited 0 but the - /// tags still appear in the post-sync cache (ADO eventual-consistency - /// race — same defense as ). - /// - public bool? Verified { get; init; } - - /// Error message when this item failed to be processed. Null on success. - public string? Error { get; init; } -} diff --git a/src/Polyphony/Models/ResetManifestResult.cs b/src/Polyphony/Models/ResetManifestResult.cs deleted file mode 100644 index 935523f..0000000 --- a/src/Polyphony/Models/ResetManifestResult.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace Polyphony; - -/// -/// Output envelope for polyphony reset manifest --root N — reports -/// on the per-root run manifest at -/// feature/{N}:.polyphony/run.yaml. -/// -/// The manifest is co-located with the feature branch, so deletion -/// is effected by reset branches (which deletes -/// feature/{N}). This verb exists as part of the spec-promised -/// reset family for two reasons: -/// -/// -/// It surfaces the manifest's state for operator inspection -/// (does a manifest exist? what generation does it claim?). -/// It provides a stable hook for PR 3's reset-root.yaml workflow -/// and any future need to clear the manifest without nuking the -/// whole feature branch (e.g. partial-reset scenarios). -/// -/// -/// Current behavior: read-only inspection. When the root feature -/// branch + manifest are present, and -/// describe what's there. Actual clearing -/// is deferred to reset branches. PR 3 may extend this verb to -/// perform an isolated commit-and-push that removes only the manifest -/// file from the feature branch. -/// -/// Routing-style envelope: always exits 0. -/// -public sealed record ResetManifestResult -{ - public required int Root { get; init; } - public required bool Success { get; init; } - public required bool DryRun { get; init; } - - /// Conventional branch carrying the manifest — feature/{N}. - public required string FeatureBranch { get; init; } - - /// Conventional manifest path within the feature branch. - public required string ManifestPath { get; init; } - - /// True when the feature branch exists on origin. - public bool FeatureBranchExists { get; init; } - - /// True when a .polyphony/run.yaml blob exists at the tip of . - public bool ManifestPresent { get; init; } - - /// - /// Always emitted: a hint about which other reset verb (or workflow - /// step) will actually clear the manifest. Read-only verb today. - /// - public string DeferralReason { get; init; } = string.Empty; - - public string? Error { get; init; } -} diff --git a/src/Polyphony/Models/ResetPrsResult.cs b/src/Polyphony/Models/ResetPrsResult.cs deleted file mode 100644 index de4c5f0..0000000 --- a/src/Polyphony/Models/ResetPrsResult.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace Polyphony; - -/// -/// Output envelope for polyphony reset prs --root N — abandons all -/// OPEN polyphony PRs targeting branches under the root's scope -/// (plan/{N}, mg/{N}-*, impl/{N}-*, -/// evidence/{N}-*, feature/{N}). -/// -/// Routing-style envelope: the verb always exits 0; callers route on -/// + . Per-PR failures do NOT mark -/// the verb as failed — they show up as entries in -/// with the verb still reporting = true. A true -/// failure (e.g. identity-resolution failure, twig-sync crash) sets -/// = false and populates . -/// -public sealed record ResetPrsResult -{ - /// Root root work-item ID (mirrors --root). - public required int Root { get; init; } - - /// True when enumeration + abandon completed (per-PR failures permitted). - public required bool Success { get; init; } - - /// True when this was a dry-run preview (no abandons performed). - public required bool DryRun { get; init; } - - /// - /// Platform-neutral repo slug for diagnostics — e.g. - /// polyphonyrequiem/polyphony (GitHub) or - /// org/project/repository (ADO). Empty string when identity - /// resolution failed. - /// - public string RepoSlug { get; init; } = string.Empty; - - /// PRs that were successfully abandoned (or would be in dry-run). - public IReadOnlyList AbandonedPrs { get; init; } = []; - - /// PRs the platform reported as un-abandonable (already closed, 404, network, etc.). - public IReadOnlyList FailedPrs { get; init; } = []; - - /// Error message when is false. - public string? Error { get; init; } -} - -/// One PR that was abandoned (or would be in dry-run). -public sealed record ResetAbandonedPr -{ - /// PR number on the platform. - public required int Number { get; init; } - - /// Source branch the PR targets (e.g. plan/62286666). - public required string HeadBranch { get; init; } - - /// Canonical platform web URL for the PR. - public required string Url { get; init; } -} - -/// One PR the platform refused to abandon. -public sealed record ResetFailedPr -{ - /// PR number on the platform. - public required int Number { get; init; } - - /// Source branch the PR targets. - public required string HeadBranch { get; init; } - - /// Canonical platform web URL for the PR. - public required string Url { get; init; } - - /// - /// Short diagnostic. Operator-facing — e.g. "platform reported failure", - /// "exception: ...". - /// - public required string Reason { get; init; } -} diff --git a/src/Polyphony/Models/ResetRootResult.cs b/src/Polyphony/Models/ResetRootResult.cs index 6de7e52..28ea4e8 100644 --- a/src/Polyphony/Models/ResetRootResult.cs +++ b/src/Polyphony/Models/ResetRootResult.cs @@ -5,9 +5,7 @@ public sealed record ResetRootResult public required int Root { get; init; } public required bool Success { get; init; } public required bool DryRun { get; init; } - public required string Strategy { get; init; } public required string Coverage { get; init; } - public required bool FallbackUsed { get; init; } public IReadOnlyList StepsCompleted { get; init; } = []; public IReadOnlyList StepsFailed { get; init; } = []; public IReadOnlyList AttemptedTargets { get; init; } = []; @@ -15,12 +13,6 @@ public sealed record ResetRootResult public IReadOnlyList FailedTargets { get; init; } = []; public IReadOnlyList RemainingResetTargets { get; init; } = []; public IReadOnlyList BlockedMutatedTargets { get; init; } = []; - public ResetPrsResult? Prs { get; init; } - public ResetWorktreesResult? Worktrees { get; init; } - public ResetBranchesResult? Branches { get; init; } - public ResetFacetsResult? Facets { get; init; } - public ResetManifestResult? Manifest { get; init; } - public ResetStateResult? State { get; init; } public bool StateSkipped { get; init; } public string? Error { get; init; } } diff --git a/src/Polyphony/Models/ResetStateResult.cs b/src/Polyphony/Models/ResetStateResult.cs deleted file mode 100644 index a9f338a..0000000 --- a/src/Polyphony/Models/ResetStateResult.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace Polyphony; - -/// -/// Output envelope for polyphony reset state --root N — stamps the -/// per-root run-watermark tag (polyphony:run-started-at=<ISO-8601>) -/// on the root work item. -/// -/// This is the ONLY writer of the watermark. Read-side filtering lives -/// in + -/// ; see -/// docs/decisions/run-reset.md for the full design. -/// -/// Routing-style envelope: the verb always exits 0; callers route on -/// + . -/// -public sealed record ResetStateResult -{ - /// Root root work-item ID (mirrors --root). - public required int Root { get; init; } - - /// True when the watermark was successfully stamped (or already correct in dry-run). - public required bool Success { get; init; } - - /// True when this was a dry-run preview (no writes performed). - public required bool DryRun { get; init; } - - /// - /// The previous watermark value parsed from the root's tag set, formatted - /// as ISO-8601 UTC. Null when no prior polyphony:run-started-at - /// tag existed. - /// - public string? PreviousWatermark { get; init; } - - /// - /// The newly-stamped watermark value (UTC). Always emitted when - /// is true — even in dry-run mode, this is the - /// value that would have been written. - /// - public string? NewWatermark { get; init; } - - /// - /// Number of duplicate polyphony:run-started-at tags that were - /// removed before stamping the fresh value. Normally 0; non-zero - /// indicates an earlier reset bug or operator hand-edit. - /// - public int RemovedDuplicateTags { get; init; } - - /// Error message when is false. - public string? Error { get; init; } -} diff --git a/src/Polyphony/Models/ResetWorktreesResult.cs b/src/Polyphony/Models/ResetWorktreesResult.cs deleted file mode 100644 index 7b11b2a..0000000 --- a/src/Polyphony/Models/ResetWorktreesResult.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace Polyphony; - -/// -/// Output envelope for polyphony reset worktrees --root N — removes -/// all linked worktrees under {runs_root}/root-{N}/ via -/// git worktree remove --force, then deletes the root directory -/// tree. -/// -/// Routing-style envelope: always exits 0; per-worktree failures -/// show up as entries in with the verb still -/// reporting = true. -/// -public sealed record ResetWorktreesResult -{ - public required int Root { get; init; } - public required bool Success { get; init; } - public required bool DryRun { get; init; } - - /// - /// Resolved {runs_root}/root-{N}/ path — what the verb scanned - /// for worktrees. Empty when resolution failed. - /// - public string RootRunsRoot { get; init; } = string.Empty; - - /// Worktrees that were removed (or would be in dry-run). - public IReadOnlyList RemovedWorktrees { get; init; } = []; - - /// Worktrees that git refused to remove. - public IReadOnlyList FailedWorktrees { get; init; } = []; - - /// - /// True when the root-{N}/ directory was deleted after all - /// worktrees were removed. False when worktrees remain, the directory - /// was never present, or this is a dry-run. - /// - public bool RootDirDeleted { get; init; } - - public string? Error { get; init; } -} - -public sealed record ResetRemovedWorktree -{ - public required string Path { get; init; } - public string? Branch { get; init; } -} - -public sealed record ResetFailedWorktree -{ - public required string Path { get; init; } - public string? Branch { get; init; } - public required string Reason { get; init; } -} diff --git a/src/Polyphony/PolyphonyJsonContext.cs b/src/Polyphony/PolyphonyJsonContext.cs index 5917ec1..3179e28 100644 --- a/src/Polyphony/PolyphonyJsonContext.cs +++ b/src/Polyphony/PolyphonyJsonContext.cs @@ -61,11 +61,6 @@ namespace Polyphony; [JsonSerializable(typeof(WorktreeRemovePayload))] [JsonSerializable(typeof(WorktreeInitRootPayload))] [JsonSerializable(typeof(WorktreeGcPayload))] -[JsonSerializable(typeof(ResetPrsPayload))] -[JsonSerializable(typeof(ResetWorktreesPayload))] -[JsonSerializable(typeof(ResetBranchesPayload))] -[JsonSerializable(typeof(ResetFacetsPayload))] -[JsonSerializable(typeof(ResetStatePayload))] [JsonSerializable(typeof(ResetRootPayload))] [JsonSerializable(typeof(PrCreateFeaturePrPayload))] [JsonSerializable(typeof(PrCreateFeatureAdoPayload))] @@ -285,28 +280,11 @@ namespace Polyphony; [JsonSerializable(typeof(ArchivistOutput))] [JsonSerializable(typeof(ResearchWriteArticlesResult))] [JsonSerializable(typeof(WrittenArticle))] -// Reset-family verbs (docs/decisions/run-reset.md) -[JsonSerializable(typeof(ResetStateResult))] -[JsonSerializable(typeof(ResetPrsResult))] -[JsonSerializable(typeof(ResetAbandonedPr))] -[JsonSerializable(typeof(ResetFailedPr))] -[JsonSerializable(typeof(ResetBranchesResult))] -[JsonSerializable(typeof(ResetDeletedBranch))] -[JsonSerializable(typeof(ResetFailedBranch))] -[JsonSerializable(typeof(ResetWorktreesResult))] -[JsonSerializable(typeof(ResetRemovedWorktree))] -[JsonSerializable(typeof(ResetFailedWorktree))] -[JsonSerializable(typeof(ResetManifestResult))] -[JsonSerializable(typeof(ResetFacetsResult))] -[JsonSerializable(typeof(ResetFacetsItem))] +// Reset-family verbs (docs/decisions/run-reset.md; +// docs/decisions/pattern-strategy-retirement.md) [JsonSerializable(typeof(ResetRootResult))] [JsonSerializable(typeof(IReadOnlyList))] [JsonSerializable(typeof(IReadOnlyList))] -[JsonSerializable(typeof(ResetStatePayload))] -[JsonSerializable(typeof(ResetPrsPayload))] -[JsonSerializable(typeof(ResetWorktreesPayload))] -[JsonSerializable(typeof(ResetBranchesPayload))] -[JsonSerializable(typeof(ResetFacetsPayload))] [JsonSerializable(typeof(ResetRootPayload))] // ADO auth chain DTOs (port of twig's MSAL refresh-token methodology) [JsonSerializable(typeof(JwtAccessTokenPayload))] diff --git a/src/Polyphony/Sdlc/Observers/PlanObserver.cs b/src/Polyphony/Sdlc/Observers/PlanObserver.cs index 265a8ba..58c4bfe 100644 --- a/src/Polyphony/Sdlc/Observers/PlanObserver.cs +++ b/src/Polyphony/Sdlc/Observers/PlanObserver.cs @@ -912,7 +912,7 @@ public async Task IsParentSeededAsync(int itemId, string plannedTag, Cance /// /// /// The tag lives on the root work item (the only writer is - /// polyphony reset state). Reading via the same + /// polyphony reset root). Reading via the same /// twig show primitive that /// uses keeps the two tag reads on a single twig surface. /// diff --git a/src/Polyphony/Tagging/PolyphonyTags.cs b/src/Polyphony/Tagging/PolyphonyTags.cs index 9f2e84f..1060e1f 100644 --- a/src/Polyphony/Tagging/PolyphonyTags.cs +++ b/src/Polyphony/Tagging/PolyphonyTags.cs @@ -126,7 +126,7 @@ public static bool HasImplMergedInMg(TagSet tags, string mergeGroupKey) /// /// Tag-name prefix for the "this root's current run started at this /// ISO-8601 UTC instant" marker, stamped on the root by - /// polyphony reset state (and re-stamped on every subsequent + /// polyphony reset root (and re-stamped on every subsequent /// reset). Observers consume it as a watermark — any merged PR whose /// MergedAt is at or before this instant is treated as an /// artifact of a prior run and is filtered out of satisfaction diff --git a/tests/Polyphony.Tests/Commands/PatternProjectionEquivalenceTests.cs b/tests/Polyphony.Tests/Commands/PatternProjectionEquivalenceTests.cs new file mode 100644 index 0000000..7b435f3 --- /dev/null +++ b/tests/Polyphony.Tests/Commands/PatternProjectionEquivalenceTests.cs @@ -0,0 +1,332 @@ +using Polyphony.Commands; +using Polyphony.Journal; +using Polyphony.Journal.Observers; +using Polyphony.Journal.Projections; +using Polyphony.Journal.Reset; +using Polyphony.Journal.Reset.Deleters; +using Shouldly; +using Xunit; + +namespace Polyphony.Tests.Commands; + +/// +/// Catalog + matcher invariants for the projection reset path +/// (post-AB#3308). These tests began life as the AB#3307 pattern → +/// projection equivalence gate; the pattern leg is now retired +/// (docs/decisions/pattern-strategy-retirement.md), and what +/// remains is the structural verification that the projection +/// catalog covers every resource kind the legacy pattern legs touched: +/// +/// +/// Catalog phases preserve the historical pattern-leg +/// ordering (prs → worktrees → branches → facets → +/// manifest → state). The order is the documented reset +/// sequence in docs/decisions/run-reset.md; it is now +/// enforced solely through . +/// +/// Catalog phase routing. Each resource kind a pattern +/// leg used to act on routes to exactly one catalog phase, with +/// the AdoWorkItemTag facets-vs-state split discriminated by +/// tag-id shape (polyphony:planned / +/// polyphony:facets for facets, +/// polyphony:run-started-at for state). +/// Catalog excluded kinds cover historical pattern +/// non-coverage. Every kind the pattern leg never touched +/// (PR comments, votes, work-item state, git tags) is recorded +/// in with a +/// rationale. +/// Branch-name matcher recognizes every historical +/// pattern-leg enumeration shape. Every branch name the +/// retired RootBranchPatterns helper + the descendant +/// sdlc/root/{id} enumeration would have produced is +/// recognized by +/// +/// on the discovered-resource path (the AB#3306 fix). +/// +/// +/// One behavioural fixture +/// () +/// drives end-to-end with +/// a synthetic journal containing one entry per reset-relevant kind, +/// asserting that the production observer + deleter set reports +/// . If a future deleter +/// or observer registration regresses, this fixture catches it. +/// +public sealed class PatternProjectionEquivalenceTests +{ + private const string LegPrs = "prs"; + private const string LegWorktrees = "worktrees"; + private const string LegBranches = "branches"; + private const string LegFacets = "facets"; + private const string LegManifest = "manifest"; + private const string LegState = "state"; + + private const int FixtureRoot = 1234; + + [Fact] + public void Catalog_PhasesMirrorPatternLegsInOrder() + { + var catalogPhases = ProjectionResetCatalog.OrderedPhases.Select(p => p.Name).ToArray(); + var patternLegs = new[] { LegPrs, LegWorktrees, LegBranches, LegFacets, LegManifest, LegState }; + + catalogPhases.ShouldBe(patternLegs); + } + + [Theory] + [InlineData(LegPrs, ResourceKind.GitHubPr, "owner/repo#42")] + [InlineData(LegPrs, ResourceKind.AdoPr, "dev.azure.com/org/proj/_apis/git/repositories/repo/pullRequests/42")] + [InlineData(LegWorktrees, ResourceKind.GitWorktree, "/tmp/worktree-1234")] + [InlineData(LegBranches, ResourceKind.GitBranch, "feature/1234")] + [InlineData(LegBranches, ResourceKind.GitBranch, "sdlc/root/1234")] + [InlineData(LegFacets, ResourceKind.AdoWorkItemTag, "1234:polyphony:planned")] + [InlineData(LegFacets, ResourceKind.AdoWorkItemTag, "1234:polyphony:facets=plannable,implementable")] + [InlineData(LegManifest, ResourceKind.ManifestFile, ".polyphony/run.yaml")] + [InlineData(LegManifest, ResourceKind.PlanFile, "plans/plan-1234.yaml")] + [InlineData(LegManifest, ResourceKind.LockFile, ".polyphony/lock")] + [InlineData(LegState, ResourceKind.AdoWorkItemTag, "1234:polyphony:run-started-at=2026-05-24T00:00:00.000Z")] + public void Catalog_RoutesPatternLegResourceToCorrectPhase(string expectedPhase, string kind, string id) + { + var resource = MakeResource(kind, id); + + var matchingPhases = ProjectionResetCatalog.OrderedPhases + .Where(p => p.Matches(resource)) + .ToArray(); + + matchingPhases.ShouldHaveSingleItem( + $"Resource ({kind}, {id}) should route to exactly one catalog phase " + + $"but matched: [{string.Join(", ", matchingPhases.Select(p => p.Name))}]"); + matchingPhases[0].Name.ShouldBe(expectedPhase); + } + + [Theory] + [InlineData(ResourceKind.GitTag, "polyphony-run-1234")] + [InlineData(ResourceKind.GitHubPrComment, "owner/repo#42#comment-1")] + [InlineData(ResourceKind.AdoPrComment, "pr-42#comment-1")] + [InlineData(ResourceKind.AdoPrVote, "pr-42#voter-1")] + [InlineData(ResourceKind.AdoWorkItem, "1234")] + [InlineData(ResourceKind.AdoWorkItemState, "1234#state=Active")] + public void Catalog_ExcludesKindsPatternLegNeverDeleted(string kind, string id) + { + var resource = MakeResource(kind, id); + + ProjectionResetCatalog.OrderedPhases + .Any(p => p.Matches(resource)) + .ShouldBeFalse($"Kind '{kind}' should not be reset-relevant (pattern leg never deleted it)."); + + ProjectionResetCatalog.ExcludedKinds + .ShouldContainKey(kind, $"Kind '{kind}' should be recorded in ExcludedKinds with a rationale."); + ProjectionResetCatalog.ExcludedKinds[kind].ShouldNotBeNullOrWhiteSpace(); + } + + /// + /// Mirrors the pattern leg's RootBranchPatterns + /// (:80-97) plus the separate + /// EnumerateRootSdlcBranchesAsync output + /// (ResetCommands.Branches.cs:273-313). Every concrete + /// branch name the pattern leg's git-for-each-ref query could + /// return MUST be recognized by the projection's + /// discovered-resource matcher; otherwise the projection would + /// silently drop orphan refs that pattern caught. + /// + [Theory] + [InlineData("feature/1234")] + [InlineData("plan/1234")] + [InlineData("plan/1234-5678")] + [InlineData("mg/1234_data-layer")] + [InlineData("mg/1234_data-layer_migrations")] + [InlineData("impl/1234-5678")] + [InlineData("evidence/1234")] + [InlineData("evidence/1234-5678")] + [InlineData("sdlc/root/1234")] + public void Matcher_RecognizesEveryBranchNameThePatternLegCouldEnumerate(string branchName) + { + ResourceObserverSupport.MatchesPolyphonyBranchPattern(FixtureRoot, branchName) + .ShouldBeTrue($"Pattern leg would enumerate '{branchName}' but projection matcher does not recognize it."); + } + + [Theory] + [InlineData("feature/9999")] + [InlineData("plan/9999-5678")] + [InlineData("mg/9999_data-layer")] + [InlineData("main")] + [InlineData("user/dangreen/wip")] + [InlineData("sdlc/root/9999")] + public void Matcher_DoesNotMisattributeOtherRootsBranches(string branchName) + { + ResourceObserverSupport.MatchesPolyphonyBranchPattern(FixtureRoot, branchName) + .ShouldBeFalse($"Branch '{branchName}' belongs to a different root or is not polyphony-owned; matcher must not claim it for root {FixtureRoot}."); + } + + /// + /// End-to-end coverage check. Feed + /// a journal whose + /// effects span every pattern-leg kind, using the same observer + /// and deleter set as production DI + /// (PolyphonyServiceRegistration.cs:65-122). The report + /// must come back ; + /// any missing observer or deleter would surface here before + /// pattern deletion can mask it. + /// + [Fact] + public void Coverage_ReportsCompleteForRepresentativeFixture() + { + var entries = BuildRepresentativeFixtureJournal(); + + var observerKinds = ProductionObserverKinds(); + var deleterKinds = ProductionDeleterKinds(); + + var observers = observerKinds.Select(k => (IResourceObserver)new StubObserver(k)); + var deleters = deleterKinds.Select(k => (IResourceDeleter)new StubDeleter(k)); + + var analyzer = new ProjectionResetCoverageAnalyzer(observers, deleters); + var report = analyzer.Analyze(entries); + + report.MissingObservers.ShouldBeEmpty( + $"Production DI does not register an IResourceObserver for: [{string.Join(", ", report.MissingObservers)}]"); + report.MissingDeleters.ShouldBeEmpty( + $"Production DI does not register an IResourceDeleter for: [{string.Join(", ", report.MissingDeleters)}]"); + report.MissingEffectsActions.ShouldBeEmpty( + $"Fixture journal entries missing effects (test-fixture bug, not production bug): [{string.Join(", ", report.MissingEffectsActions)}]"); + report.Coverage.ShouldBe(ProjectionResetCoverage.Complete); + } + + /// + /// The pattern leg deletes branches enumerated from + /// RootBranchPatterns + EnumerateRootSdlcBranchesAsync; + /// projection's deletes branches the + /// drift fold reports as polyphony-owned. The two must converge on + /// the same branch name set for any given fixture. This test + /// asserts the mapping at the matcher level (the unit that + /// determines what the drift fold considers polyphony-owned for + /// discovered orphan refs) — a real fixture-level diff requires a + /// full executor wiring, which the + /// suite already exercises. + /// + [Fact] + public void Equivalence_PatternLegEnumerationIsSubsetOfMatcherRecognition() + { + var patternEnumeratedNames = new[] + { + $"plan/{FixtureRoot}", + $"plan/{FixtureRoot}-5678", + $"mg/{FixtureRoot}_data-layer", + $"impl/{FixtureRoot}-5678", + $"evidence/{FixtureRoot}-5678", + $"feature/{FixtureRoot}", + $"sdlc/root/{FixtureRoot}", + }; + + var unrecognized = patternEnumeratedNames + .Where(name => !ResourceObserverSupport.MatchesPolyphonyBranchPattern(FixtureRoot, name)) + .ToArray(); + + unrecognized.ShouldBeEmpty( + $"Pattern leg would delete these branches but projection's discovered-resource matcher would not: [{string.Join(", ", unrecognized)}]"); + } + + private static ProjectedResourceState MakeResource(string kind, string id) => new() + { + Key = new ResourceKey { Kind = kind, Id = id }, + Action = "fixture", + StartedAt = 1_000, + Intent = Polyphony.Journal.ResourceIntent.EnsurePresent, + Mutation = Polyphony.Journal.ResourceMutation.CreatedNow, + PolyphonyOwned = true, + }; + + private static IReadOnlyList BuildRepresentativeFixtureJournal() + { + var effects = new (string Kind, string Id)[] + { + (ResourceKind.GitHubPr, "owner/repo#42"), + (ResourceKind.AdoPr, "dev.azure.com/org/proj/_apis/git/repositories/repo/pullRequests/42"), + (ResourceKind.GitWorktree, "/tmp/worktree-1234"), + (ResourceKind.GitBranch, $"feature/{FixtureRoot}"), + (ResourceKind.AdoWorkItemTag, $"{FixtureRoot}:polyphony:planned"), + (ResourceKind.AdoWorkItemTag, $"{FixtureRoot}:polyphony:run-started-at=2026-05-24T00:00:00.000Z"), + (ResourceKind.ManifestFile, ".polyphony/run.yaml"), + (ResourceKind.PlanFile, $"plans/plan-{FixtureRoot}.yaml"), + (ResourceKind.LockFile, ".polyphony/lock"), + }; + + var id = 0; + return effects + .Select(e => new JournalEntry + { + Id = ++id, + RunId = "fixture-run", + RootId = FixtureRoot, + WorkItemId = FixtureRoot, + Action = $"fixture_{e.Kind}", + Target = e.Id, + StartedAt = 1_000 + id, + FinishedAt = 1_001 + id, + Outcome = JournalOutcome.Success, + Effects = + [ + new JournalResourceEffect + { + Kind = e.Kind, + Id = e.Id, + Intent = Polyphony.Journal.ResourceIntent.EnsurePresent, + Mutation = Polyphony.Journal.ResourceMutation.CreatedNow, + PolyphonyOwned = true, + }, + ], + }) + .ToList(); + } + + private static IReadOnlyList ProductionObserverKinds() => + [ + ResourceKind.GitBranch, + ResourceKind.GitHubPr, + ResourceKind.AdoPr, + ResourceKind.AdoWorkItem, + ResourceKind.AdoWorkItemState, + ResourceKind.AdoWorkItemTag, + ResourceKind.GitWorktree, + ResourceKind.ManifestFile, + ResourceKind.PlanFile, + ResourceKind.LockFile, + ]; + + private static IReadOnlyList ProductionDeleterKinds() => + [ + ResourceKind.GitBranch, + ResourceKind.GitWorktree, + ResourceKind.GitHubPr, + ResourceKind.AdoPr, + ResourceKind.AdoWorkItemTag, + ResourceKind.ManifestFile, + ResourceKind.PlanFile, + ResourceKind.LockFile, + ]; + + private sealed class StubObserver(string kind) : IResourceObserver + { + public string Kind { get; } = kind; + public bool CanObserve => true; + public string? DeferredReason => null; + + public Task ObserveAsync(ResourceObservationRequest request, CancellationToken ct) + => Task.FromResult(new ResourceObservationBatch + { + Kind = Kind, + Observations = [], + DiscoveredResources = [], + }); + } + + private sealed class StubDeleter(string kind) : IResourceDeleter + { + public string Kind { get; } = kind; + + public Task DeleteAsync( + ProjectedResourceState resource, + ObservedResourceState? observation, + ResourceDeletionContext context, + CancellationToken ct) + => Task.FromResult(new ResourceDeleteOutcome { Success = true, Deleted = true }); + } +} diff --git a/tests/Polyphony.Tests/Commands/Phase3CommandsJournalTests.cs b/tests/Polyphony.Tests/Commands/Phase3CommandsJournalTests.cs index 1869ea0..3579b27 100644 --- a/tests/Polyphony.Tests/Commands/Phase3CommandsJournalTests.cs +++ b/tests/Polyphony.Tests/Commands/Phase3CommandsJournalTests.cs @@ -85,37 +85,6 @@ public async Task WorktreeAdd_WithRef_WritesJournalEntry() effect.PolyphonyOwned.ShouldBeTrue(); } - [Fact] - public async Task ResetState_Execute_WritesJournalEntry() - { - var (cmd, runner, store) = CreateResetCommand(); - StubSync(runner); - StubTagsRoundTrip(runner, 100, "polyphony:root; polyphony:run-started-at=2024-01-01T00:00:00.000Z"); - - var (exitCode, _) = await CaptureConsoleAsync(() => cmd.ResetState(root: 100, execute: true)); - var entries = await store.QueryAsync(new JournalQuery { Action = "reset_state" }, CancellationToken.None); - - exitCode.ShouldBe(ExitCodes.Success); - entries.Count.ShouldBe(1); - var entry = entries[0]; - entry.Target.ShouldBe("workitem:100"); - entry.Outcome.ShouldBe(JournalOutcome.Success); - - var payload = JsonSerializer.Deserialize(entry.PayloadJson!, PolyphonyJsonContext.Default.ResetStatePayload); - payload.ShouldNotBeNull(); - payload.Root.ShouldBe(100); - payload.DryRun.ShouldBeFalse(); - payload.NewWatermark.ShouldNotBeNullOrWhiteSpace(); - - entry.Effects.Count.ShouldBe(1); - var effect = entry.Effects[0]; - effect.Kind.ShouldBe(ResourceKind.AdoWorkItemTag); - effect.Id.ShouldStartWith("100:polyphony:run-started-at="); - effect.Intent.ShouldBe(ResourceIntent.EnsurePresent); - effect.Mutation.ShouldBe(ResourceMutation.Changed); - effect.PolyphonyOwned.ShouldBeTrue(); - } - private (PlanCommands Command, FakeProcessRunner Runner, JournalStore Store) CreatePlanCommand(string runId = "run-journal") { var runner = new FakeProcessRunner(); @@ -150,21 +119,6 @@ public async Task ResetState_Execute_WritesJournalEntry() return (command, runner, store); } - private (ResetCommands Command, FakeProcessRunner Runner, JournalStore Store) CreateResetCommand(string runId = "run-journal") - { - var runner = new FakeProcessRunner(); - var twig = new TwigClient(runner); - var git = new GitClient(runner); - var gh = new GhClient(runner); - var store = CreateJournalStore(); - var pullRequestReader = new PullRequestReader(gh, null); - var resolver = new RepoIdentityResolver(git); - var planObserver = new PlanObserver(git, gh, new ThrowingAdoClient(), twig, resolver); - var walker = new HierarchyWalker(Config, Repository); - var command = new ResetCommands(twig, git, pullRequestReader, planObserver, walker, new RunContext(runId), new JournaledActionDecorator(store)); - return (command, runner, store); - } - private JournalStore CreateJournalStore() { var dir = Path.Combine(_scratchRoot, Guid.NewGuid().ToString("N")); @@ -197,42 +151,6 @@ private static void StubCreateChild(FakeProcessRunner runner, int newId) => runner.WhenStartsWith("twig", ["new"], new ProcessResult(0, $$"""{"id":{{newId}},"title":"Created"}""", "")); - private static void StubTagsRoundTrip(FakeProcessRunner runner, int workItemId, string initialTags) - { - var state = new[] { initialTags }; - - runner.WhenAsync( - (e, a) => e == "twig" - && a.Count >= 4 - && a[0] == "show" - && a[1] == workItemId.ToString() - && a[^1] == "json", - (_, _) => - { - var encoded = JsonEncodedText.Encode(state[0]).Value; - var json = $$"""{"id":{{workItemId}},"tags":"{{encoded}}"}"""; - return Task.FromResult(new ProcessResult(0, json, "")); - }); - - runner.WhenAsync( - (e, a) => e == "twig" - && a.Count >= 5 - && a[0] == "patch" - && a[1] == "--id" - && a[2] == workItemId.ToString() - && a[3] == "--json", - (args, _) => - { - using var doc = JsonDocument.Parse(args[4]); - if (doc.RootElement.TryGetProperty("System.Tags", out var tagsEl)) - { - state[0] = tagsEl.GetString() ?? state[0]; - } - - return Task.FromResult(new ProcessResult(0, "{}", "")); - }); - } - public override void Dispose() { base.Dispose(); diff --git a/tests/Polyphony.Tests/Commands/ResetCommandsBranchesEnumerationTests.cs b/tests/Polyphony.Tests/Commands/ResetCommandsBranchesEnumerationTests.cs deleted file mode 100644 index 59bd911..0000000 --- a/tests/Polyphony.Tests/Commands/ResetCommandsBranchesEnumerationTests.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System.Text.Json; -using Polyphony.Commands; -using Polyphony.Infrastructure.Processes; -using Polyphony.Routing; -using Polyphony.Sdlc.Observers; -using Polyphony.Tests.Infrastructure.Processes; -using Polyphony.Tests.Stubs; -using Polyphony.Tests.TestFixtures; -using Shouldly; -using Xunit; - -namespace Polyphony.Tests.Commands; - -public sealed class ResetCommandsBranchesEnumerationTests : CommandTestBase -{ - private (ResetCommands Command, FakeProcessRunner Runner) CreateCommand() - { - var runner = new FakeProcessRunner(); - var twig = new TwigClient(runner); - var git = new GitClient(runner); - var gh = new GhClient(runner); - var pullRequestReader = new PullRequestReader(gh, null); - var resolver = new RepoIdentityResolver(git); - var planObserver = new PlanObserver(git, gh, new ThrowingAdoClient(), twig, resolver); - var walker = new HierarchyWalker(Config, Repository); - - return (new ResetCommands(twig, git, pullRequestReader, planObserver, walker), runner); - } - - private static void StubBranchEnumeration(FakeProcessRunner runner) - { - var branchesByPattern = new Dictionary(StringComparer.Ordinal) - { - ["refs/heads/plan/100"] = ["plan/100"], - ["refs/heads/plan/100-*"] = ["plan/100-101", "plan/100-102"], - ["refs/heads/sdlc/root/100"] = ["sdlc/root/100"], - ["refs/heads/sdlc/root/101"] = ["sdlc/root/101"], - ["refs/heads/sdlc/root/102"] = ["sdlc/root/102"], - ["refs/heads/sdlc/root/103"] = ["sdlc/root/103"], - ["refs/heads/sdlc/root/999"] = ["sdlc/root/999"], - }; - - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 4 && a[0] == "ls-remote" && a[1] == "--heads", - (a, _) => - { - var pattern = a[3]; - var stdout = branchesByPattern.TryGetValue(pattern, out var branches) - ? string.Join("\n", branches.Select(branch => $"sha\trefs/heads/{branch}")) + "\n" - : string.Empty; - return Task.FromResult(new ProcessResult(0, stdout, string.Empty)); - }); - - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 1 && a[0] == "for-each-ref", - (_, _) => Task.FromResult(new ProcessResult(0, string.Empty, string.Empty))); - } - - private async Task SeedHierarchyAsync() - { - var Root = new WorkItemBuilder() - .WithId(100) - .WithType("Epic") - .WithTitle("Root") - .WithState("Doing") - .Build(); - var child101 = new WorkItemBuilder() - .WithId(101) - .WithType("Issue") - .WithTitle("Child 101") - .WithState("To Do") - .WithParentId(100) - .Build(); - var child102 = new WorkItemBuilder() - .WithId(102) - .WithType("Issue") - .WithTitle("Child 102") - .WithState("To Do") - .WithParentId(100) - .Build(); - var descendant103 = new WorkItemBuilder() - .WithId(103) - .WithType("Task") - .WithTitle("Descendant 103") - .WithState("To Do") - .WithParentId(101) - .Build(); - - await SeedAsync(Root, child101, child102, descendant103); - } - - [Fact] - public async Task ResetBranches_DryRun_EnumeratesNestedPlanAndDescendantSdlcBranches() - { - await SeedHierarchyAsync(); - var (cmd, runner) = CreateCommand(); - StubBranchEnumeration(runner); - - var (exitCode, output) = await CaptureConsoleAsync(() => cmd.ResetBranches(root: 100, execute: false)); - - exitCode.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetBranchesResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.DryRun.ShouldBeTrue(); - - var branches = result.DeletedBranches.Select(x => x.Branch).ToList(); - branches.ShouldContain("plan/100"); - branches.ShouldContain("plan/100-101"); - branches.ShouldContain("plan/100-102"); - branches.ShouldContain("sdlc/root/100"); - branches.ShouldContain("sdlc/root/101"); - branches.ShouldContain("sdlc/root/102"); - branches.ShouldContain("sdlc/root/103"); - branches.ShouldNotContain("sdlc/root/999"); - - runner.Invocations.ShouldContain(i => - i.Executable == "git" - && i.Arguments.Count >= 4 - && i.Arguments[0] == "ls-remote" - && i.Arguments[3] == "refs/heads/sdlc/root/103"); - runner.Invocations.ShouldNotContain(i => - i.Executable == "git" - && i.Arguments.Count >= 4 - && i.Arguments[0] == "ls-remote" - && i.Arguments[3] == "refs/heads/sdlc/root/999"); - } - - [Fact] - public async Task EnumerateRootBranchesAsync_IncludesOnlyRootAndDescendantSdlcBranches() - { - await SeedHierarchyAsync(); - var (cmd, runner) = CreateCommand(); - StubBranchEnumeration(runner); - - var branches = await cmd.EnumerateRootBranchesAsync(100, CancellationToken.None); - - branches.ShouldContain("plan/100-101"); - branches.ShouldContain("plan/100-102"); - branches.ShouldContain("sdlc/root/100"); - branches.ShouldContain("sdlc/root/101"); - branches.ShouldContain("sdlc/root/102"); - branches.ShouldContain("sdlc/root/103"); - branches.ShouldNotContain("sdlc/root/999"); - - runner.Invocations.ShouldContain(i => - i.Executable == "git" - && i.Arguments.Count >= 4 - && i.Arguments[0] == "ls-remote" - && i.Arguments[3] == "refs/heads/sdlc/root/103"); - runner.Invocations.ShouldNotContain(i => - i.Executable == "git" - && i.Arguments.Count >= 4 - && i.Arguments[0] == "ls-remote" - && i.Arguments[3] == "refs/heads/sdlc/root/999"); - } -} diff --git a/tests/Polyphony.Tests/Commands/ResetCommandsTests.cs b/tests/Polyphony.Tests/Commands/ResetCommandsTests.cs deleted file mode 100644 index 18ee440..0000000 --- a/tests/Polyphony.Tests/Commands/ResetCommandsTests.cs +++ /dev/null @@ -1,631 +0,0 @@ -using System.Text.Json; -using Polyphony.Commands; -using Polyphony.Infrastructure.Processes; -using Polyphony.Routing; -using Polyphony.Journal.Reset; -using Polyphony.Sdlc.Observers; -using Polyphony.Tests.Infrastructure.Processes; -using Polyphony.Tests.Stubs; -using Polyphony.Tests.TestFixtures; -using Shouldly; -using Xunit; - -namespace Polyphony.Tests.Commands; - -/// -/// Round-trip tests for the polyphony reset verb family — -/// reset state, reset prs, reset branches, -/// reset worktrees, reset manifest, and the -/// legacy-pattern composite path used by reset root --strategy pattern. -/// -/// Mirrors the stubbing pattern from -/// : real -/// / / -/// over a , so the verbs exercise the -/// same shell-out boundary they hit in production. -/// -public sealed class ResetCommandsTests : CommandTestBase -{ - private (ResetCommands Command, FakeProcessRunner Runner) CreateCommand() - { - var runner = new FakeProcessRunner(); - var twig = new TwigClient(runner); - var git = new GitClient(runner); - var gh = new GhClient(runner); - var pullRequestReader = new PullRequestReader(gh, null); - var resolver = new RepoIdentityResolver(git); - var planObserver = new PlanObserver(git, gh, new ThrowingAdoClient(), twig, resolver); - var walker = new HierarchyWalker(Config, Repository); - - var cmd = new ResetCommands(twig, git, pullRequestReader, planObserver, walker); - return (cmd, runner); - } - - private static void StubSync(FakeProcessRunner runner) - => runner.WhenExact("twig", ["sync", "--output", "json"], new ProcessResult(0, "{}", "")); - - /// - /// Stubs twig show {id} + twig patch --id {id} as a - /// round-trip — mirrors the helper in - /// BranchCommandsMarkImplMergedTests so reset state observes the - /// patched tag through twig the same way production does. - /// - private static void StubTagsRoundTrip(FakeProcessRunner runner, int workItemId, string initialTags) - { - var state = new[] { initialTags }; - - runner.WhenAsync( - (e, a) => e == "twig" - && a.Count >= 4 - && a[0] == "show" - && a[1] == workItemId.ToString() - && a[^1] == "json", - (_, _) => - { - var encoded = JsonEncodedText.Encode(state[0]).Value; - var json = $$"""{"id":{{workItemId}},"tags":"{{encoded}}"}"""; - return Task.FromResult(new ProcessResult(0, json, "")); - }); - - runner.WhenAsync( - (e, a) => e == "twig" - && a.Count >= 5 - && a[0] == "patch" - && a[1] == "--id" - && a[2] == workItemId.ToString() - && a[3] == "--json", - (args, _) => - { - try - { - using var doc = JsonDocument.Parse(args[4]); - if (doc.RootElement.TryGetProperty("System.Tags", out var tagsEl)) - { - state[0] = tagsEl.GetString() ?? state[0]; - } - } - catch (JsonException) { /* fall through */ } - return Task.FromResult(new ProcessResult(0, "{}", "")); - }); - } - - /// - /// Stub git remote get-url origin + git rev-parse so - /// PlanObserver.TryResolveRepoIdentityAsync resolves to a GitHub repo - /// without needing a real working tree. - /// - private static void StubGitHubIdentity(FakeProcessRunner runner, string slug = "owner/repo") - { - runner.WhenExact("git", ["remote", "get-url", "origin"], - new ProcessResult(0, $"https://github.com/{slug}.git\n", "")); - runner.WhenExact("git", ["rev-parse", "--path-format=absolute", "--git-common-dir"], - new ProcessResult(0, "C:/fake/.git\n", "")); - runner.WhenExact("git", ["rev-parse", "--show-toplevel"], - new ProcessResult(0, "C:/fake\n", "")); - } - - // ---------- reset state ----------------------------------------------- - - [Fact] - public async Task ResetState_MissingRoot_Halts() - { - var (cmd, _) = CreateCommand(); - var (exit, _) = await CaptureConsoleAsync(() => cmd.ResetState()); - exit.ShouldBe(ExitCodes.RoutingFailure); - } - - [Fact] - public async Task ResetState_DryRun_DoesNotInvokePatch() - { - var (cmd, runner) = CreateCommand(); - StubSync(runner); - StubTagsRoundTrip(runner, 100, "polyphony:root"); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetState(root: 100, execute: false)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetStateResult); - result.ShouldNotBeNull(); - result.Root.ShouldBe(100); - result.Success.ShouldBeTrue(); - result.DryRun.ShouldBeTrue(); - result.NewWatermark.ShouldNotBeNullOrEmpty(); - runner.Invocations.ShouldNotContain(i => - i.Executable == "twig" && i.Arguments.Count > 0 && i.Arguments[0] == "patch"); - } - - [Fact] - public async Task ResetState_Execute_StampsWatermarkAndReportsPrevious() - { - var (cmd, runner) = CreateCommand(); - StubSync(runner); - StubTagsRoundTrip(runner, 100, - "polyphony:root; polyphony:run-started-at=2024-01-01T00:00:00.000Z"); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetState(root: 100, execute: true)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetStateResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.DryRun.ShouldBeFalse(); - result.PreviousWatermark.ShouldStartWith("2024-01-01T00:00:00"); - // New watermark must be a parseable ISO-8601 instant. - DateTimeOffset.Parse(result.NewWatermark!).ShouldBeGreaterThan(DateTimeOffset.MinValue); - // Verify the patch was actually issued. - runner.Invocations.ShouldContain(i => - i.Executable == "twig" - && i.Arguments.Count > 0 - && i.Arguments[0] == "patch"); - } - - [Fact] - public async Task ResetState_DuplicateTags_StripsAllButOne() - { - var (cmd, runner) = CreateCommand(); - StubSync(runner); - StubTagsRoundTrip(runner, 100, - "polyphony:root; polyphony:run-started-at=2024-01-01T00:00:00.000Z; polyphony:run-started-at=2024-02-01T00:00:00.000Z"); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetState(root: 100, execute: true)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetStateResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - // Two original tags → strip them all, leave one fresh. Duplicates removed = total - 1. - result.RemovedDuplicateTags.ShouldBe(1); - } - - // ---------- reset branches -------------------------------------------- - - [Fact] - public async Task ResetBranches_DryRun_DoesNotInvokeDelete() - { - var (cmd, runner) = CreateCommand(); - // Stub ls-remote to return one match for plan/100. - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 3 && a[0] == "ls-remote" && a[1] == "--heads", - (a, _) => - { - // a[2]="origin", a[3]=pattern. - var pattern = a.Count > 3 ? a[3] : string.Empty; - if (pattern == "refs/heads/plan/100") - { - return Task.FromResult(new ProcessResult(0, - "deadbeef\trefs/heads/plan/100\n", "")); - } - return Task.FromResult(new ProcessResult(0, "", "")); - }); - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 1 && a[0] == "for-each-ref", - (_, _) => Task.FromResult(new ProcessResult(0, "", ""))); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetBranches(root: 100, execute: false)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetBranchesResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.DryRun.ShouldBeTrue(); - result.DeletedBranches.Count.ShouldBe(1); - result.DeletedBranches[0].Branch.ShouldBe("plan/100"); - result.DeletedBranches[0].DeletedRemote.ShouldBeTrue(); - // No actual delete commands. - runner.Invocations.ShouldNotContain(i => - i.Executable == "git" - && i.Arguments.Count >= 1 - && (i.Arguments[0] == "branch" || (i.Arguments[0] == "push" && i.Arguments.Contains("--delete")))); - } - - /// - /// Regression for the MG branch-pattern delimiter bug: the root - /// branch-pattern table must use `_` between root_id and mg_path - /// (per docs/decisions/branch-model.md §Branch names — - /// `mg/{root_id}_{mg_path}`), not `-`. An earlier revision used `-`, - /// which silently failed to match any real MG branch and left - /// mg/* refs on origin after reset — so root redispatch detected - /// the stale merged MG state and short-circuited the run. - /// - [Fact] - public async Task ResetBranches_DiscoversMgBranchesWithUnderscoreDelimiter() - { - var (cmd, runner) = CreateCommand(); - - // Stub ls-remote to mimic a root (root_id=100) with the canonical - // branch shapes: plan/, feature/, mg/{root}_{mg_path}, impl/{root}-{item}. - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 4 && a[0] == "ls-remote" && a[1] == "--heads", - (a, _) => - { - var pattern = a[3]; - return pattern switch - { - "refs/heads/plan/100" => Task.FromResult(new ProcessResult(0, - "sha\trefs/heads/plan/100\n", "")), - "refs/heads/feature/100" => Task.FromResult(new ProcessResult(0, - "sha\trefs/heads/feature/100\n", "")), - "refs/heads/mg/100_*" => Task.FromResult(new ProcessResult(0, - "sha\trefs/heads/mg/100_pg-100\nsha\trefs/heads/mg/100_data-layer_migrations\n", "")), - "refs/heads/impl/100-*" => Task.FromResult(new ProcessResult(0, - "sha\trefs/heads/impl/100-100\n", "")), - _ => Task.FromResult(new ProcessResult(0, "", "")), - }; - }); - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 1 && a[0] == "for-each-ref", - (_, _) => Task.FromResult(new ProcessResult(0, "", ""))); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetBranches(root: 100, execute: false)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetBranchesResult); - result.ShouldNotBeNull(); - var branches = result.DeletedBranches.Select(b => b.Branch).ToList(); - branches.ShouldContain("mg/100_pg-100", - customMessage: "top-level MG branch (mg/{root_id}_{mg_id}) must be discovered by the root-pattern enumerator"); - branches.ShouldContain("mg/100_data-layer_migrations", - customMessage: "nested MG branch (mg/{root_id}_{parent_mg_id}_{nested_mg_id}) must be discovered too"); - } - - // ---------- reset worktrees ------------------------------------------- - - [Fact] - public async Task ResetWorktrees_NoWorktreesUnderRoot_SucceedsWithEmptyList() - { - var (cmd, runner) = CreateCommand(); - runner.WhenExact("git", ["rev-parse", "--path-format=absolute", "--git-common-dir"], - new ProcessResult(0, "C:/repo/.git\n", "")); - // No worktrees at all → filter yields empty regardless of root path. - runner.WhenExact("git", ["worktree", "list", "--porcelain"], - new ProcessResult(0, "", "")); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetWorktrees(root: 100, execute: false)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetWorktreesResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.DryRun.ShouldBeTrue(); - result.RemovedWorktrees.Count.ShouldBe(0); - result.RootRunsRoot.ShouldEndWith("root-100"); - } - - // ---------- reset manifest -------------------------------------------- - - [Fact] - public async Task ResetManifest_FeatureBranchAbsent_ReportsAbsent() - { - var (cmd, runner) = CreateCommand(); - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 1 && a[0] == "ls-remote", - (_, _) => Task.FromResult(new ProcessResult(0, "", ""))); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetManifest(root: 100, execute: false)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetManifestResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.FeatureBranch.ShouldBe("feature/100"); - result.FeatureBranchExists.ShouldBeFalse(); - result.ManifestPresent.ShouldBeFalse(); - result.DeferralReason.ShouldNotBeNullOrEmpty(); - } - - // ---------- reset prs ------------------------------------------------- - - [Fact] - public async Task ResetPrs_NoOpenPrs_ReportsSuccess() - { - var (cmd, runner) = CreateCommand(); - StubGitHubIdentity(runner); - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 1 && a[0] == "ls-remote", - (_, _) => Task.FromResult(new ProcessResult(0, "", ""))); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetPrs(root: 100, execute: false)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetPrsResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.AbandonedPrs.Count.ShouldBe(0); - result.FailedPrs.Count.ShouldBe(0); - } - - // ---------- reset root composite -------------------------------------- - - [Fact] - public async Task ResetRoot_SkipState_OmitsStateStep() - { - var (cmd, runner) = CreateCommand(); - StubGitHubIdentity(runner); - // facets step walks the root via the hierarchy walker (real - // SqliteWorkItemRepository); seed the root so the walk finds it. - await SeedAsync(new WorkItemBuilder() - .WithId(100).WithType("Issue").WithTitle("Root").WithState("To Do").Build()); - StubSync(runner); - StubTagsRoundTrip(runner, 100, "polyphony:root"); - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 1 && a[0] == "ls-remote", - (_, _) => Task.FromResult(new ProcessResult(0, "", ""))); - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 1 && a[0] == "for-each-ref", - (_, _) => Task.FromResult(new ProcessResult(0, "", ""))); - runner.WhenExact("git", ["rev-parse", "--path-format=absolute", "--git-common-dir"], - new ProcessResult(0, "C:/repo/.git\n", "")); - runner.WhenExact("git", ["worktree", "list", "--porcelain"], - new ProcessResult(0, "", "")); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetRoot(root: 100, execute: false, strategy: ProjectionResetStrategy.Pattern, skipState: true)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetRootResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.StateSkipped.ShouldBeTrue(); - result.StepsCompleted.ShouldNotContain("state"); - result.State.ShouldBeNull(); - // Other steps ran in order. - result.StepsCompleted.ShouldContain("prs"); - result.StepsCompleted.ShouldContain("worktrees"); - result.StepsCompleted.ShouldContain("branches"); - result.StepsCompleted.ShouldContain("facets"); - result.StepsCompleted.ShouldContain("manifest"); - // Composite is dry-run end-to-end. - result.DryRun.ShouldBeTrue(); - result.Prs!.DryRun.ShouldBeTrue(); - result.Worktrees!.DryRun.ShouldBeTrue(); - result.Branches!.DryRun.ShouldBeTrue(); - result.Facets!.DryRun.ShouldBeTrue(); - } - - [Fact] - public async Task ResetRoot_FacetsRunsBetweenBranchesAndManifest() - { - var (cmd, runner) = CreateCommand(); - StubGitHubIdentity(runner); - await SeedAsync(new WorkItemBuilder() - .WithId(100).WithType("Issue").WithTitle("Root").WithState("To Do").Build()); - StubSync(runner); - StubTagsRoundTrip(runner, 100, "polyphony:root"); - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 1 && a[0] == "ls-remote", - (_, _) => Task.FromResult(new ProcessResult(0, "", ""))); - runner.WhenAsync( - (e, a) => e == "git" && a.Count >= 1 && a[0] == "for-each-ref", - (_, _) => Task.FromResult(new ProcessResult(0, "", ""))); - runner.WhenExact("git", ["rev-parse", "--path-format=absolute", "--git-common-dir"], - new ProcessResult(0, "C:/repo/.git\n", "")); - runner.WhenExact("git", ["worktree", "list", "--porcelain"], - new ProcessResult(0, "", "")); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetRoot(root: 100, execute: false, strategy: ProjectionResetStrategy.Pattern)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetRootResult); - result.ShouldNotBeNull(); - // facets must appear after branches and before manifest in the - // completed-steps order — guarantees the chain documented in - // ResetRootResult is what the composite actually runs. - var idxBranches = result.StepsCompleted.ToList().IndexOf("branches"); - var idxFacets = result.StepsCompleted.ToList().IndexOf("facets"); - var idxManifest = result.StepsCompleted.ToList().IndexOf("manifest"); - idxBranches.ShouldBeGreaterThanOrEqualTo(0); - idxFacets.ShouldBeGreaterThan(idxBranches); - idxManifest.ShouldBeGreaterThan(idxFacets); - result.Facets.ShouldNotBeNull(); - result.Facets.Root.ShouldBe(100); - } - - // ---------- reset facets ---------------------------------------------- - - [Fact] - public async Task ResetFacets_MissingRoot_Halts() - { - var (cmd, _) = CreateCommand(); - var (exit, _) = await CaptureConsoleAsync(() => cmd.ResetFacets()); - exit.ShouldBe(ExitCodes.RoutingFailure); - } - - [Fact] - public async Task ResetFacets_RootNotInCache_ReportsErrorWithoutPatching() - { - var (cmd, runner) = CreateCommand(); - StubSync(runner); - // Do NOT seed the root — walker.WalkAsync returns null. - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetFacets(root: 999, execute: true)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetFacetsResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeFalse(); - result.Error!.ShouldContain("999"); - runner.Invocations.ShouldNotContain(i => - i.Executable == "twig" && i.Arguments.Count > 0 && i.Arguments[0] == "patch"); - } - - [Fact] - public async Task ResetFacets_NoTargetedTags_ReportsSuccessWithZeroModifications() - { - var (cmd, runner) = CreateCommand(); - await SeedAsync(new WorkItemBuilder() - .WithId(100).WithType("Issue").WithTitle("Root").WithState("To Do") - .WithTags("polyphony:root") - .Build()); - StubSync(runner); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetFacets(root: 100, execute: true)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetFacetsResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.ItemsScanned.ShouldBe(1); - result.ItemsModified.ShouldBe(0); - result.Items.Count.ShouldBe(0); - // Nothing to remove → no patch issued. - runner.Invocations.ShouldNotContain(i => - i.Executable == "twig" && i.Arguments.Count > 0 && i.Arguments[0] == "patch"); - } - - [Fact] - public async Task ResetFacets_DryRun_ReportsRemovalsButDoesNotPatch() - { - var (cmd, runner) = CreateCommand(); - await SeedAsync(new WorkItemBuilder() - .WithId(100).WithType("Issue").WithTitle("Root").WithState("To Do") - .WithTags("polyphony:root; polyphony:facets=implementable; polyphony:planned") - .Build()); - StubSync(runner); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetFacets(root: 100, execute: false)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetFacetsResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.DryRun.ShouldBeTrue(); - result.ItemsScanned.ShouldBe(1); - result.ItemsModified.ShouldBe(1); - result.TotalFacetTagsRemoved.ShouldBe(1); - result.TotalPlannedTagsRemoved.ShouldBe(1); - result.Items.Count.ShouldBe(1); - result.Items[0].WorkItemId.ShouldBe(100); - result.Items[0].PlannedTagRemoved.ShouldBeTrue(); - result.Items[0].FacetTagsRemoved.Count.ShouldBe(1); - result.Items[0].FacetTagsRemoved[0].ShouldStartWith("polyphony:facets="); - result.Items[0].Verified.ShouldBeNull(); // null in dry-run - runner.Invocations.ShouldNotContain(i => - i.Executable == "twig" && i.Arguments.Count > 0 && i.Arguments[0] == "patch"); - } - - [Fact] - public async Task ResetFacets_Execute_RemovesFacetsAndPlannedTagsAndVerifies() - { - var (cmd, runner) = CreateCommand(); - await SeedAsync(new WorkItemBuilder() - .WithId(100).WithType("Issue").WithTitle("Root").WithState("To Do") - .WithTags("polyphony:root; polyphony:facets=implementable; polyphony:planned") - .Build()); - StubSync(runner); - StubTagsRoundTrip(runner, 100, - "polyphony:root; polyphony:facets=implementable; polyphony:planned"); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetFacets(root: 100, execute: true)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetFacetsResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.DryRun.ShouldBeFalse(); - result.ItemsModified.ShouldBe(1); - result.TotalFacetTagsRemoved.ShouldBe(1); - result.TotalPlannedTagsRemoved.ShouldBe(1); - result.Items[0].Verified.ShouldBe(true); - result.Items[0].Error.ShouldBeNull(); - // Patch was issued with the surviving tag only. - var patches = runner.Invocations.Where(i => - i.Executable == "twig" && i.Arguments.Count > 0 && i.Arguments[0] == "patch").ToList(); - patches.ShouldNotBeEmpty(); - var json = patches[0].Arguments[4]; - json.ShouldContain("polyphony:root"); - json.ShouldNotContain("polyphony:facets="); - json.ShouldNotContain("polyphony:planned"); - } - - [Fact] - public async Task ResetFacets_Execute_WalksDescendantsAndPatchesEach() - { - var (cmd, runner) = CreateCommand(); - // Root has a child plannable parent that ALSO carries a facets - // override. Both must be cleaned in a single walk. - var root = new WorkItemBuilder() - .WithId(100).WithType("Issue").WithTitle("Root").WithState("To Do") - .WithTags("polyphony:root; polyphony:facets=implementable") - .Build(); - var child = new WorkItemBuilder() - .WithId(101).WithType("Issue").WithTitle("Child").WithState("To Do") - .WithParentId(100) - .WithTags("polyphony:planned") - .Build(); - await SeedAsync(root, child); - StubSync(runner); - StubTagsRoundTrip(runner, 100, "polyphony:root; polyphony:facets=implementable"); - StubTagsRoundTrip(runner, 101, "polyphony:planned"); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetFacets(root: 100, execute: true)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetFacetsResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.ItemsScanned.ShouldBe(2); - result.ItemsModified.ShouldBe(2); - result.TotalFacetTagsRemoved.ShouldBe(1); - result.TotalPlannedTagsRemoved.ShouldBe(1); - // Both items received a patch. - var patchedIds = runner.Invocations - .Where(i => i.Executable == "twig" && i.Arguments.Count >= 3 - && i.Arguments[0] == "patch" && i.Arguments[1] == "--id") - .Select(i => i.Arguments[2]) - .ToHashSet(); - patchedIds.ShouldContain("100"); - patchedIds.ShouldContain("101"); - } - - [Fact] - public async Task ResetFacets_VerifyFailsOnSilentRevert_ReportsPerItemError() - { - var (cmd, runner) = CreateCommand(); - await SeedAsync(new WorkItemBuilder() - .WithId(100).WithType("Issue").WithTitle("Root").WithState("To Do") - .WithTags("polyphony:root; polyphony:facets=implementable") - .Build()); - StubSync(runner); - // Stub `twig show` to ALWAYS return the original tags — even - // after the patch lands. Simulates an ADO eventual-consistency - // revert: patch + sync exit 0 but the cache still reports the - // pre-patch state. Read-after-write check must catch this. - runner.WhenAsync( - (e, a) => e == "twig" && a.Count >= 4 && a[0] == "show" - && a[1] == "100" && a[^1] == "json", - (_, _) => Task.FromResult(new ProcessResult(0, - """{"id":100,"tags":"polyphony:root; polyphony:facets=implementable"}""", ""))); - runner.WhenAsync( - (e, a) => e == "twig" && a.Count >= 2 && a[0] == "patch" && a[1] == "--id", - (_, _) => Task.FromResult(new ProcessResult(0, "{}", ""))); - - var (exit, output) = await CaptureConsoleAsync( - () => cmd.ResetFacets(root: 100, execute: true)); - - exit.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetFacetsResult); - result.ShouldNotBeNull(); - // Verb-wide success stays true (the walk completed) but the - // per-item entry must surface the verification failure. - result.Success.ShouldBeTrue(); - result.Items.Count.ShouldBe(1); - result.Items[0].Verified.ShouldBe(false); - result.Items[0].Error!.ShouldContain("assertion failed"); - // ItemsModified is the count of SUCCESSFUL modifications, so 0. - result.ItemsModified.ShouldBe(0); - } -} diff --git a/tests/Polyphony.Tests/Commands/ResetCommandsWorktreesRetryTests.cs b/tests/Polyphony.Tests/Commands/ResetCommandsWorktreesRetryTests.cs deleted file mode 100644 index 95398da..0000000 --- a/tests/Polyphony.Tests/Commands/ResetCommandsWorktreesRetryTests.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System.Text.Json; -using Polyphony.Commands; -using Polyphony.Infrastructure.Processes; -using Polyphony.Routing; -using Polyphony.Sdlc.Observers; -using Polyphony.Tests.Infrastructure.Processes; -using Polyphony.Tests.Stubs; -using Polyphony.Tests.TestFixtures; -using Shouldly; -using Xunit; - -namespace Polyphony.Tests.Commands; - -public sealed class ResetCommandsWorktreesRetryTests : CommandTestBase, IDisposable -{ - private readonly string _tempRoot; - private readonly string _commonDir; - private readonly string _rootRunsRoot; - private readonly string _worktreePath; - - public ResetCommandsWorktreesRetryTests() - { - _tempRoot = Path.Combine(Path.GetTempPath(), $"polyphony-reset-worktrees-{Guid.NewGuid():N}"); - _commonDir = Path.Combine(_tempRoot, "repo", ".git"); - _rootRunsRoot = Path.Combine(_tempRoot, "repo-runs", "root-100"); - _worktreePath = Path.Combine(_rootRunsRoot, "feature-100"); - - Directory.CreateDirectory(_commonDir); - Directory.CreateDirectory(_worktreePath); - File.WriteAllText(Path.Combine(_worktreePath, "placeholder.txt"), "x"); - } - - public override void Dispose() - { - try - { - if (Directory.Exists(_tempRoot)) - { - Directory.Delete(_tempRoot, recursive: true); - } - } - catch (IOException) - { - } - catch (UnauthorizedAccessException) - { - } - - base.Dispose(); - } - - private (ResetCommands Command, FakeProcessRunner Runner) CreateCommand() - { - var runner = new FakeProcessRunner(); - var twig = new TwigClient(runner); - var git = new GitClient(runner); - var gh = new GhClient(runner); - var pullRequestReader = new PullRequestReader(gh, null); - var resolver = new RepoIdentityResolver(git); - var planObserver = new PlanObserver(git, gh, new ThrowingAdoClient(), twig, resolver); - var walker = new HierarchyWalker(Config, Repository); - - return (new ResetCommands(twig, git, pullRequestReader, planObserver, walker), runner); - } - - private void StubSingleRootWorktree(FakeProcessRunner runner) - { - runner.WhenExact("git", ["rev-parse", "--path-format=absolute", "--git-common-dir"], - new ProcessResult(0, _commonDir + "\n", string.Empty)); - runner.WhenExact("git", ["worktree", "list", "--porcelain"], - new ProcessResult(0, - $"worktree {_worktreePath}\nHEAD deadbeef\nbranch refs/heads/feature/100\n\n", - string.Empty)); - runner.WhenExact("git", ["worktree", "prune"], new ProcessResult(0, string.Empty, string.Empty)); - } - - [Fact] - public async Task ResetWorktrees_Execute_RetriesUntilThirdAttemptSucceeds() - { - var (cmd, runner) = CreateCommand(); - StubSingleRootWorktree(runner); - runner.WhenStartsWithSequence( - "git", - ["worktree", "remove", "--force", _worktreePath], - new ProcessResult(1, string.Empty, "Permission denied"), - new ProcessResult(1, string.Empty, "Permission denied"), - new ProcessResult(0, string.Empty, string.Empty)); - - var (exitCode, output) = await CaptureConsoleAsync(() => cmd.ResetWorktrees(root: 100, execute: true)); - - exitCode.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetWorktreesResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.RemovedWorktrees.Count.ShouldBe(1); - result.FailedWorktrees.Count.ShouldBe(0); - result.RemovedWorktrees[0].Path.ShouldBe(_worktreePath); - - runner.Invocations.Count(i => - i.Executable == "git" - && i.Arguments.Count >= 4 - && i.Arguments[0] == "worktree" - && i.Arguments[1] == "remove" - && i.Arguments[3] == _worktreePath).ShouldBe(3); - runner.Invocations.ShouldContain(i => - i.Executable == "git" - && i.Arguments.Count >= 2 - && i.Arguments[0] == "worktree" - && i.Arguments[1] == "prune"); - } - - [Fact] - public async Task ResetWorktrees_Execute_TreatsMissingPathAfterFailedAttemptsAsRemoved() - { - var (cmd, runner) = CreateCommand(); - StubSingleRootWorktree(runner); - var attempts = 0; - runner.WhenAsync( - (e, a) => e == "git" - && a.Count >= 4 - && a[0] == "worktree" - && a[1] == "remove" - && a[3] == _worktreePath, - (_, _) => - { - attempts++; - if (attempts == 2 && Directory.Exists(_worktreePath)) - { - Directory.Delete(_worktreePath, recursive: true); - } - - return Task.FromResult(new ProcessResult(1, string.Empty, "Permission denied")); - }); - - var (exitCode, output) = await CaptureConsoleAsync(() => cmd.ResetWorktrees(root: 100, execute: true)); - - exitCode.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetWorktreesResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.RemovedWorktrees.Count.ShouldBe(1); - result.FailedWorktrees.Count.ShouldBe(0); - attempts.ShouldBe(2); - runner.Invocations.ShouldContain(i => - i.Executable == "git" - && i.Arguments.Count >= 2 - && i.Arguments[0] == "worktree" - && i.Arguments[1] == "prune"); - } - - [Fact] - public async Task ResetWorktrees_Execute_ReportsFailureWhenPathStillExistsAfterRetries() - { - var (cmd, runner) = CreateCommand(); - StubSingleRootWorktree(runner); - runner.WhenStartsWithSequence( - "git", - ["worktree", "remove", "--force", _worktreePath], - new ProcessResult(1, string.Empty, "Permission denied"), - new ProcessResult(1, string.Empty, "Permission denied"), - new ProcessResult(1, string.Empty, "Permission denied")); - - var (exitCode, output) = await CaptureConsoleAsync(() => cmd.ResetWorktrees(root: 100, execute: true)); - - exitCode.ShouldBe(ExitCodes.Success); - var result = JsonSerializer.Deserialize(output, PolyphonyJsonContext.Default.ResetWorktreesResult); - result.ShouldNotBeNull(); - result.Success.ShouldBeTrue(); - result.RemovedWorktrees.Count.ShouldBe(0); - result.FailedWorktrees.Count.ShouldBe(1); - result.FailedWorktrees[0].Path.ShouldBe(_worktreePath); - result.FailedWorktrees[0].Reason.ShouldContain("Permission denied"); - - runner.Invocations.Count(i => - i.Executable == "git" - && i.Arguments.Count >= 4 - && i.Arguments[0] == "worktree" - && i.Arguments[1] == "remove" - && i.Arguments[3] == _worktreePath).ShouldBe(3); - runner.Invocations.ShouldContain(i => - i.Executable == "git" - && i.Arguments.Count >= 2 - && i.Arguments[0] == "worktree" - && i.Arguments[1] == "prune"); - } -} diff --git a/tests/Polyphony.Tests/Commands/ResetRootProjectionCommandTests.cs b/tests/Polyphony.Tests/Commands/ResetRootProjectionCommandTests.cs index 5eff50c..53014a0 100644 --- a/tests/Polyphony.Tests/Commands/ResetRootProjectionCommandTests.cs +++ b/tests/Polyphony.Tests/Commands/ResetRootProjectionCommandTests.cs @@ -19,7 +19,7 @@ namespace Polyphony.Tests.Commands; public sealed class ResetRootProjectionCommandTests : CommandTestBase { [Fact] - public async Task ResetRoot_DefaultStrategy_UsesProjectionEnvelope() + public async Task ResetRoot_UsesProjectionExecutor() { var world = new MutableBranchWorld(exists: true, matchesExpected: true, actualState: "abc123"); var observer = new MutableBranchObserver(world); @@ -63,7 +63,6 @@ public async Task ResetRoot_DefaultStrategy_UsesProjectionEnvelope() exit.ShouldBe(ExitCodes.Success); result.ShouldNotBeNull(); result.Root.ShouldBe(100); - result.Strategy.ShouldBe(ProjectionResetStrategy.Projection); result.DryRun.ShouldBeTrue(); result.Success.ShouldBeTrue(); result.AttemptedTargets.ShouldHaveSingleItem(); diff --git a/tests/Polyphony.Tests/Journal/JournalEffectContractTests.cs b/tests/Polyphony.Tests/Journal/JournalEffectContractTests.cs index 2813a63..c1635a4 100644 --- a/tests/Polyphony.Tests/Journal/JournalEffectContractTests.cs +++ b/tests/Polyphony.Tests/Journal/JournalEffectContractTests.cs @@ -198,25 +198,6 @@ public void EmittedEffects_RespectOwnershipInvariants() Succeeded = true, WasMutated = true, }), - InvokeSelector(typeof(ResetCommands), "SelectResetBranchesEffects", new ResetBranchesPayload - { - Root = 100, - DryRun = false, - Succeeded = true, - WasMutated = true, - DeletedBranches = [new ResetDeletedBranch { Branch = "plan/100", DeletedLocal = true, DeletedRemote = true }], - FailedBranches = [], - }), - InvokeSelector(typeof(ResetCommands), "SelectResetStateEffects", new ResetStatePayload - { - Root = 100, - DryRun = false, - Succeeded = true, - WasMutated = true, - PreviousWatermark = "2024-01-01T00:00:00.000Z", - NewWatermark = "2024-02-01T00:00:00.000Z", - RemovedDuplicateTags = 1, - }), }.SelectMany(effectSet => effectSet).ToArray(); effects.ShouldNotBeEmpty(); diff --git a/tests/Polyphony.Tests/Journal/JournalReaderTests.cs b/tests/Polyphony.Tests/Journal/JournalReaderTests.cs new file mode 100644 index 0000000..f228db0 --- /dev/null +++ b/tests/Polyphony.Tests/Journal/JournalReaderTests.cs @@ -0,0 +1,119 @@ +using Microsoft.Data.Sqlite; +using Polyphony.Journal; +using Shouldly; +using Xunit; + +namespace Polyphony.Tests.Journal; + +public sealed class JournalReaderTests : IDisposable +{ + private readonly string _tempDir; + private readonly string _journalPath; + + public JournalReaderTests() + { + SQLitePCL.Batteries.Init(); + _tempDir = Path.Combine(Path.GetTempPath(), $"polyphony-journal-reader-{Guid.NewGuid():N}"); + Directory.CreateDirectory(_tempDir); + _journalPath = Path.Combine(_tempDir, ".polyphony-state", "journal.db"); + } + + [Fact] + public async Task QueryAsync_Throws_JournalMissingException_When_File_Does_Not_Exist() + { + var reader = new JournalReader(_journalPath); + + var ex = await Should.ThrowAsync( + () => reader.QueryAsync(new JournalQuery(), CancellationToken.None)); + + ex.DatabasePath.ShouldBe(reader.DatabasePath); + File.Exists(_journalPath).ShouldBeFalse( + "JournalReader must not create the database file when reading missing."); + } + + [Fact] + public async Task QueryAsync_Reads_Existing_Journal_Written_By_JournalStore() + { + // Arrange: have JournalStore create + populate the journal. + var writer = new JournalStore(_journalPath); + var actionId = await writer.RecordStartAsync( + new JournalEntryStart + { + RunId = "run-1", + RootId = 42, + WorkItemId = 100, + Action = "test_action", + Target = "workitem:100", + StartedAt = 1_000_000_000_000, + PayloadJson = null, + }, + CancellationToken.None); + + await writer.RecordEndAsync( + actionId, + JournalOutcome.Success, + errorCode: null, + errorMessage: null, + payloadJson: null, + effects: [ + new JournalResourceEffect + { + Kind = ResourceKind.GitBranch, + Id = "feature/42", + Intent = ResourceIntent.EnsurePresent, + Mutation = ResourceMutation.CreatedNow, + PolyphonyOwned = true, + }, + ], + CancellationToken.None); + + // Act: read with the read-only reader. + var reader = new JournalReader(_journalPath); + var entries = await reader.QueryAsync(new JournalQuery { RootId = 42 }, CancellationToken.None); + + // Assert: same row back, effects loaded. + entries.Count.ShouldBe(1); + entries[0].Action.ShouldBe("test_action"); + entries[0].Effects.Count.ShouldBe(1); + entries[0].Effects[0].Id.ShouldBe("feature/42"); + } + + [Fact] + public async Task QueryAsync_Read_Is_ReadOnly_Connection() + { + // Arrange: create a journal first (so the file exists and is initialized). + var writer = new JournalStore(_journalPath); + _ = await writer.QueryAsync(new JournalQuery(), CancellationToken.None); + File.Exists(_journalPath).ShouldBeTrue(); + + var reader = new JournalReader(_journalPath); + + // Act: a read-only connection must refuse writes. + await using var connection = new SqliteConnection($"Data Source={_journalPath};Mode=ReadOnly;Pooling=False"); + await connection.OpenAsync(); + + await using var command = connection.CreateCommand(); + command.CommandText = "INSERT INTO actions(run_id, action, target, started_at) VALUES ('x','x','x', 0);"; + + await Should.ThrowAsync(() => command.ExecuteNonQueryAsync()); + + // The reader-issued read still succeeds. + var entries = await reader.QueryAsync(new JournalQuery(), CancellationToken.None); + entries.ShouldBeEmpty(); + } + + public void Dispose() + { + try + { + if (Directory.Exists(_tempDir)) + { + Directory.Delete(_tempDir, recursive: true); + } + } + catch + { + // best-effort cleanup + } + } +} diff --git a/tests/Polyphony.Tests/Journal/Observers/GitBranchObserverDiscoveredResourceTests.cs b/tests/Polyphony.Tests/Journal/Observers/GitBranchObserverDiscoveredResourceTests.cs new file mode 100644 index 0000000..5ee6a59 --- /dev/null +++ b/tests/Polyphony.Tests/Journal/Observers/GitBranchObserverDiscoveredResourceTests.cs @@ -0,0 +1,100 @@ +using NSubstitute; +using Polyphony.Infrastructure.Processes; +using Polyphony.Journal; +using Polyphony.Journal.Observers; +using Polyphony.Journal.Projections; +using Shouldly; +using Xunit; + +namespace Polyphony.Tests.Journal.Observers; + +public sealed class GitBranchObserverDiscoveredResourceTests +{ + private const int Root = 1234; + + [Fact] + public async Task ObserveAsync_includes_sdlc_root_orphan_in_discovered_resources() + { + var git = StubGitClient( + localBranches: ["main", "feature/1234", $"sdlc/root/{Root}"], + remoteBranches: ["main", "feature/1234"]); + + var observer = new GitBranchObserver(git); + var batch = await observer.ObserveAsync( + new ResourceObservationRequest { RootId = Root, ExpectedResources = [] }, + CancellationToken.None); + + var ids = batch.DiscoveredResources.Select(d => d.Id).ToArray(); + ids.ShouldContain("feature/1234"); + ids.ShouldContain($"sdlc/root/{Root}"); + ids.ShouldNotContain("main"); + batch.DiscoveredResources.ShouldAllBe(d => d.MatchesPolyphonyPattern); + } + + [Fact] + public async Task ObserveAsync_excludes_other_roots_sdlc_root_branch() + { + var git = StubGitClient( + localBranches: ["main", "sdlc/root/9999"], + remoteBranches: []); + + var observer = new GitBranchObserver(git); + var batch = await observer.ObserveAsync( + new ResourceObservationRequest { RootId = Root, ExpectedResources = [] }, + CancellationToken.None); + + batch.DiscoveredResources.Select(d => d.Id).ShouldNotContain("sdlc/root/9999"); + } + + [Fact] + public async Task ObserveAsync_does_not_duplicate_expected_sdlc_root_into_discovered() + { + var git = StubGitClient( + localBranches: [$"sdlc/root/{Root}"], + remoteBranches: []); + var observer = new GitBranchObserver(git); + + var expected = new ProjectedResourceState + { + Key = new ResourceKey { Kind = ResourceKind.GitBranch, Id = $"sdlc/root/{Root}" }, + Action = "test_setup", + StartedAt = 0, + Intent = ResourceIntent.EnsurePresent, + Mutation = ResourceMutation.CreatedNow, + PolyphonyOwned = true, + }; + var batch = await observer.ObserveAsync( + new ResourceObservationRequest { RootId = Root, ExpectedResources = [expected] }, + CancellationToken.None); + + batch.DiscoveredResources.ShouldBeEmpty(); + batch.Observations.Single().Id.ShouldBe($"sdlc/root/{Root}"); + } + + private static IGitClient StubGitClient(IReadOnlyList localBranches, IReadOnlyList remoteBranches) + { + var git = Substitute.For(); + git.ListLocalBranchesAsync(Arg.Any(), Arg.Any()).Returns(localBranches); + git.ListRemoteBranchesAsync(Arg.Any()).Returns(remoteBranches); + + git.RevParseLocalBranchAsync(Arg.Any(), Arg.Any()) + .Returns(ci => + { + var branch = ci.ArgAt(0); + return Task.FromResult(localBranches.Contains(branch) ? "deadbeef" : null); + }); + + git.LsRemoteHeadsAsync(Arg.Any(), Arg.Any(), Arg.Any()) + .Returns(ci => + { + const string prefix = "refs/heads/"; + var pattern = ci.ArgAt(1); + var branch = pattern.StartsWith(prefix, StringComparison.Ordinal) ? pattern[prefix.Length..] : pattern; + IReadOnlyList heads = remoteBranches.Contains(branch) ? [$"cafef00d\t{branch}"] : []; + return Task.FromResult(heads); + }); + + return git; + } +} + diff --git a/tests/Polyphony.Tests/Journal/Observers/ResourceObserverSupportTests.cs b/tests/Polyphony.Tests/Journal/Observers/ResourceObserverSupportTests.cs new file mode 100644 index 0000000..27ba4e4 --- /dev/null +++ b/tests/Polyphony.Tests/Journal/Observers/ResourceObserverSupportTests.cs @@ -0,0 +1,68 @@ +using Polyphony.Journal.Observers; +using Shouldly; +using Xunit; + +namespace Polyphony.Tests.Journal.Observers; + +public sealed class ResourceObserverSupportTests +{ + private const int Root = 1234; + private const int OtherRoot = 9999; + + [Theory] + [InlineData("feature/1234")] + [InlineData("plan/1234")] + [InlineData("plan/1234-5678")] + [InlineData("mg/1234_data-layer")] + [InlineData("mg/1234_data-layer_migrations")] + [InlineData("impl/1234-5678")] + [InlineData("evidence/1234")] + [InlineData("evidence/1234-5678")] + [InlineData("sdlc/root/1234")] + public void MatchesPolyphonyBranchPattern_recognizes_root_scoped_branches(string branch) + => ResourceObserverSupport.MatchesPolyphonyBranchPattern(Root, branch).ShouldBeTrue(); + + [Theory] + [InlineData("feature/9999")] + [InlineData("plan/9999")] + [InlineData("plan/9999-5678")] + [InlineData("mg/9999_data-layer")] + [InlineData("impl/9999-5678")] + [InlineData("evidence/9999")] + [InlineData("evidence/9999-5678")] + [InlineData("sdlc/root/9999")] + public void MatchesPolyphonyBranchPattern_rejects_other_root_branches(string branch) + => ResourceObserverSupport.MatchesPolyphonyBranchPattern(Root, branch).ShouldBeFalse(); + + [Theory] + [InlineData("main")] + [InlineData("master")] + [InlineData("develop")] + [InlineData("feature/some-feature")] + [InlineData("hotfix/12345")] + [InlineData("sdlc/other/1234")] + [InlineData("sdlc/root/")] + [InlineData("sdlcroot/1234")] + public void MatchesPolyphonyBranchPattern_rejects_non_polyphony_branches(string branch) + => ResourceObserverSupport.MatchesPolyphonyBranchPattern(Root, branch).ShouldBeFalse(); + + // Documented gap: orphan `sdlc/root/{child_id}` branches (descendants under + // the root's hierarchy) are not attributable from the branch name alone. + // The matcher conservatively rejects them; journaled descendant sdlc/root + // branches are still caught via the expected-resource path. If AB#3307's + // pattern↔projection equivalence suite surfaces real incidents, expand + // the matcher API to accept a hierarchy-resolved id set. + [Fact] + public void MatchesPolyphonyBranchPattern_does_not_attribute_descendant_sdlc_root_branches() + { + ResourceObserverSupport.MatchesPolyphonyBranchPattern(Root, "sdlc/root/5678").ShouldBeFalse(); + ResourceObserverSupport.MatchesPolyphonyBranchPattern(Root, $"sdlc/root/{OtherRoot}").ShouldBeFalse(); + } + + // sdlc/root branches never carry the descendant `{r}-{item}` shape (see + // ResetCommands.Branches.EnumerateRootSdlcBranchesAsync). Guard against a + // future caller assuming they do. + [Fact] + public void MatchesPolyphonyBranchPattern_does_not_match_sdlc_root_with_hyphen_suffix() + => ResourceObserverSupport.MatchesPolyphonyBranchPattern(Root, "sdlc/root/1234-5678").ShouldBeFalse(); +} diff --git a/tests/Polyphony.Tests/Journal/Reset/ProjectionResetExecutorTests.cs b/tests/Polyphony.Tests/Journal/Reset/ProjectionResetExecutorTests.cs index c3ef4cd..d3959dc 100644 --- a/tests/Polyphony.Tests/Journal/Reset/ProjectionResetExecutorTests.cs +++ b/tests/Polyphony.Tests/Journal/Reset/ProjectionResetExecutorTests.cs @@ -28,7 +28,6 @@ public async Task ExecuteAsync_IncompleteCoverageWithoutAllowUnjournaled_FailsCo var result = await executor.ExecuteAsync(100, new ProjectionResetExecutionOptions { Execute = true }, CancellationToken.None); result.Success.ShouldBeFalse(); - result.Strategy.ShouldBe(ProjectionResetStrategy.Projection); result.Coverage.ShouldBe(ProjectionResetCoverage.Incomplete); result.Error.ShouldNotBeNull(); result.Error.ShouldContain("missing journal effects for actions: fixture_no_effects"); diff --git a/tests/lint/fixtures/verb-output-schemas.json b/tests/lint/fixtures/verb-output-schemas.json index 734c7bd..da1760e 100644 --- a/tests/lint/fixtures/verb-output-schemas.json +++ b/tests/lint/fixtures/verb-output-schemas.json @@ -1 +1 @@ -{"version":1,"verbs":{"agent compose-addendum":{"result_type":"Polyphony.Models.AgentComposeAddendumResult","command_class":"Polyphony.Commands.AgentCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"policy","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"branch assert-on-impl":{"result_type":"Polyphony.BranchAssertOnImplResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648}]},"branch check-deps":{"result_type":"Polyphony.BranchCheckDepsResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"branch clear-impl-merged":{"result_type":"Polyphony.Models.BranchImplMergedMarkerResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""}]},"branch close-scope":{"result_type":"Polyphony.BranchCloseScopeResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"pg-name","clr_type":"string","required":false,"default":""},{"name":"pg-number","clr_type":"int","required":false,"default":0},{"name":"pr-number","clr_type":"int","required":false,"default":0}]},"branch ensure-evidence-branch":{"result_type":"Polyphony.BranchEnsureEvidenceResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"root-id","clr_type":"int","required":false,"default":0},{"name":"from-ref","clr_type":"string","required":false,"default":""},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch ensure-feature":{"result_type":"Polyphony.BranchEnsureFeatureResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"base-branch","clr_type":"string","required":false,"default":"main"},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch ensure-impl":{"result_type":"Polyphony.BranchEnsureImplResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch ensure-mg":{"result_type":"Polyphony.BranchEnsureMergeGroupResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch ensure-plan":{"result_type":"Polyphony.BranchEnsurePlanResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch load-tree":{"result_type":"Polyphony.BranchLoadTreeResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"branch mark-impl-merged":{"result_type":"Polyphony.Models.BranchImplMergedMarkerResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""}]},"branch next-impl":{"result_type":"Polyphony.BranchNextImplResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"pg-name","clr_type":"string","required":false,"default":""},{"name":"pg-number","clr_type":"int","required":false,"default":0},{"name":"mg-path","clr_type":"string","required":false,"default":""}]},"branch route":{"result_type":"Polyphony.BranchRouteResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"pg-number","clr_type":"int","required":false,"default":0},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"edges check":{"result_type":"Polyphony.EdgesCheckResult","command_class":"Polyphony.Commands.EdgesCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"depth","clr_type":"int","required":false,"default":0},{"name":"render","clr_type":"string","required":false,"default":"json"}]},"guidance extract":{"result_type":"Polyphony.Models.GuidanceExtractResult","command_class":"Polyphony.Commands.GuidanceCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"policy","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"health":{"result_type":"Polyphony.HealthResult","command_class":"Polyphony.Commands.HealthCommand","inputs":[{"name":"config","clr_type":"string","required":false,"default":".polyphony-config/process-config.yaml"}]},"hierarchy":{"result_type":"Polyphony.HierarchyResult","command_class":"Polyphony.Commands.HierarchyCommand","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"depth","clr_type":"int","required":false,"default":3},{"name":"config","clr_type":"string","required":false,"default":".polyphony-config/process-config.yaml"}]},"journal drift":{"result_type":"Polyphony.DriftResult","command_class":"Polyphony.Commands.JournalDriftCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"render","clr_type":"string","required":false,"default":"json"}]},"journal export":{"result_type":"Polyphony.JournalExportResult","command_class":"Polyphony.Commands.JournalCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":""}]},"journal has":{"result_type":"Polyphony.JournalHasResult","command_class":"Polyphony.Commands.JournalHasCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"action","clr_type":"string","required":false,"default":""},{"name":"target","clr_type":"string?","required":false,"default":null},{"name":"run","clr_type":"string?","required":false,"default":null}]},"journal owned":{"result_type":"Polyphony.JournalOwnedResult","command_class":"Polyphony.Commands.JournalOwnedCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"kind","clr_type":"string?","required":false,"default":null}]},"journal query":{"result_type":"Polyphony.JournalQueryResult","command_class":"Polyphony.Commands.JournalQueryCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"kind","clr_type":"string?","required":false,"default":null},{"name":"owned-only","clr_type":"bool","required":false,"default":false},{"name":"state","clr_type":"string?","required":false,"default":null},{"name":"since","clr_type":"string?","required":false,"default":null},{"name":"until","clr_type":"string?","required":false,"default":null}]},"journal show":{"result_type":"Polyphony.JournalShowResult","command_class":"Polyphony.Commands.JournalCommands","inputs":[{"name":"work-item","clr_type":"int?","required":false,"default":null},{"name":"root","clr_type":"int?","required":false,"default":null},{"name":"run","clr_type":"string?","required":false,"default":null},{"name":"action","clr_type":"string?","required":false,"default":null},{"name":"render","clr_type":"string","required":false,"default":"json"}]},"lock acquire":{"result_type":"Polyphony.Models.AcquireLockResult","command_class":"Polyphony.Commands.LockCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"ttl-hours","clr_type":"int","required":false,"default":24},{"name":"by","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":""}]},"lock force-release":{"result_type":"Polyphony.Models.ForceReleaseLockResult","command_class":"Polyphony.Commands.LockCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"lock release":{"result_type":"Polyphony.Models.ReleaseLockResult","command_class":"Polyphony.Commands.LockCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"lock-token","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":""}]},"lock status":{"result_type":"Polyphony.Models.LockStatusResult","command_class":"Polyphony.Commands.LockCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"manifest init":{"result_type":"Polyphony.ManifestInitResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"platform-project","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"created-by","clr_type":"string","required":false,"default":""},{"name":"force","clr_type":"bool","required":false,"default":false}]},"manifest read":{"result_type":"Polyphony.ManifestReadResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"manifest read-plan-generation":{"result_type":"Polyphony.ManifestReadPlanGenerationResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"item","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"manifest read-plan-generation-snapshot":{"result_type":"Polyphony.ManifestReadPlanGenerationSnapshotResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"item","clr_type":"string","required":false,"default":""},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"manifest record-approval":{"result_type":"Polyphony.ManifestApprovalRecordResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"gate","clr_type":"string","required":false,"default":""},{"name":"approved-by","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"detail","clr_type":"string","required":false,"default":""},{"name":"at","clr_type":"string","required":false,"default":""}]},"manifest record-plan-merge":{"result_type":"Polyphony.ManifestRecordPlanMergeResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"item","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":0},{"name":"merge-commit","clr_type":"string","required":false,"default":""}]},"manifest record-rebase":{"result_type":"Polyphony.ManifestRebaseRecordResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"onto","clr_type":"string","required":false,"default":""},{"name":"reason","clr_type":"string","required":false,"default":""},{"name":"commit","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"at","clr_type":"string","required":false,"default":""}]},"manifest topology-hash":{"result_type":"Polyphony.ManifestTopologyHashResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"merge-group nesting-decision":{"result_type":"Polyphony.MergeGroupNestingDecisionResult","command_class":"Polyphony.Commands.MergeGroupCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-mg-path","clr_type":"string","required":false,"default":""},{"name":"has-implementable","clr_type":"bool","required":false,"default":false},{"name":"decomposable","clr_type":"bool","required":false,"default":false},{"name":"override-flat","clr_type":"bool","required":false,"default":false},{"name":"override-nested-mg-id","clr_type":"string","required":false,"default":""}]},"plan classify-stale-descendants":{"result_type":"Polyphony.PlanClassifyStaleDescendantsResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan commit-and-push":{"result_type":"Polyphony.PlanCommitAndPushResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"message","clr_type":"string","required":false,"default":""},{"name":"paths","clr_type":"string","required":false,"default":""}]},"plan depth-guard":{"result_type":"Polyphony.PlanDepthGuardResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"depth","clr_type":"int","required":false,"default":-2147483648},{"name":"max-depth","clr_type":"int","required":false,"default":6}]},"plan derive-ancestor-chain":{"result_type":"Polyphony.PlanDeriveAncestorChainResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648}]},"plan detect-state":{"result_type":"Polyphony.PlanDetectStateResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"planned-tag","clr_type":"string","required":false,"default":"polyphony:planned"},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan extract-parent-patch":{"result_type":"Polyphony.PlanExtractParentPatchResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"pr-url","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"diff-size-limit-bytes","clr_type":"int","required":false,"default":51200}]},"plan extract-renegotiation-flag":{"result_type":"Polyphony.PlanExtractRenegotiationFlagResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"repo","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan load-agent-guidance":{"result_type":"Polyphony.PlanLoadAgentGuidanceResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"config-dir","clr_type":"string","required":false,"default":".polyphony-config"}]},"plan load-type":{"result_type":"Polyphony.PlanLoadTypeResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"config-dir","clr_type":"string","required":false,"default":".polyphony-config"}]},"plan next-child":{"result_type":"Polyphony.PlanNextChildResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"plan rebase-stale-descendant":{"result_type":"Polyphony.PlanRebaseStaleDescendantResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"by","clr_type":"string","required":false,"default":""},{"name":"lock-ttl-hours","clr_type":"int","required":false,"default":24},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan recreate-stale-descendant":{"result_type":"Polyphony.PlanRecreateStaleDescendantResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"by","clr_type":"string","required":false,"default":""},{"name":"lock-ttl-hours","clr_type":"int","required":false,"default":24},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan review":{"result_type":"Polyphony.PlanReviewResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"tech-reviewer-json","clr_type":"string","required":false,"default":""},{"name":"readability-reviewer-json","clr_type":"string","required":false,"default":""},{"name":"prior-cycle-count","clr_type":"int","required":false,"default":-2147483648},{"name":"max-cycles","clr_type":"int","required":false,"default":5}]},"plan seed-children":{"result_type":"Polyphony.PlanSeedChildrenResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"children-json","clr_type":"string","required":false,"default":""},{"name":"planned-tag","clr_type":"string","required":false,"default":"polyphony:planned"},{"name":"plan-file","clr_type":"string","required":false,"default":""},{"name":"config-dir","clr_type":"string","required":false,"default":".polyphony-config"},{"name":"children-file","clr_type":"string","required":false,"default":""},{"name":"children-from-ref","clr_type":"string","required":false,"default":""}]},"plan status":{"result_type":"Polyphony.PlanStatusResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"manifest","clr_type":"string","required":false,"default":""},{"name":"repo","clr_type":"string","required":false,"default":""},{"name":"include-na","clr_type":"bool","required":false,"default":false},{"name":"json","clr_type":"bool","required":false,"default":false},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan validate-scope":{"result_type":"Polyphony.PlanValidateScopeResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"child-scope","clr_type":"string","required":false,"default":""},{"name":"repo","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan write-plan":{"result_type":"Polyphony.Models.PlanWritePlanResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"content-json","clr_type":"string","required":false,"default":""},{"name":"plans-dir","clr_type":"string","required":false,"default":"plans"},{"name":"children-json","clr_type":"string","required":false,"default":""}]},"policy load":{"result_type":"Polyphony.PolicyLoadResult","command_class":"Polyphony.Commands.PolicyCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"policy resolve":{"result_type":"Polyphony.Policy.ResolvedRule","command_class":"Polyphony.Commands.PolicyCommands","inputs":[{"name":"scope","clr_type":"string","required":false,"default":""},{"name":"domain","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"policy validate":{"result_type":"Polyphony.PolicyValidateResult","command_class":"Polyphony.Commands.PolicyCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"pr assert-impl-pr-coverage":{"result_type":"Polyphony.PrAssertImplPrCoverageResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"remote","clr_type":"string","required":false,"default":"origin"},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"pr check-evidence-floor":{"result_type":"Polyphony.PrCheckEvidenceFloorResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"repo","clr_type":"string","required":false,"default":""},{"name":"min-commits","clr_type":"int","required":false,"default":1},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"pr create-feature-ado":{"result_type":"Polyphony.PrCreateFeatureAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"target-branch","clr_type":"string","required":false,"default":"main"},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr create-feature-pr":{"result_type":"Polyphony.PrCreateFeatureResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"feature-branch","clr_type":"string","required":false,"default":""},{"name":"target-branch","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""}]},"pr get-comments-ado":{"result_type":"Polyphony.PrGetCommentsAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"include-resolved","clr_type":"bool","required":false,"default":false},{"name":"since","clr_type":"string","required":false,"default":""}]},"pr merge-evidence-ado":{"result_type":"Polyphony.PrMergeEvidenceAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648}]},"pr merge-evidence-pr":{"result_type":"Polyphony.PrMergeEvidenceResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-url","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"pr merge-feature-ado":{"result_type":"Polyphony.PrMergeFeatureAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"target-branch","clr_type":"string","required":false,"default":"main"},{"name":"match-head-commit","clr_type":"string","required":false,"default":""}]},"pr merge-impl-ado":{"result_type":"Polyphony.PrMergeImplAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"match-head-commit","clr_type":"string","required":false,"default":""},{"name":"delete-branch","clr_type":"string","required":false,"default":"true"}]},"pr merge-impl-pr":{"result_type":"Polyphony.PrMergeImplResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"method","clr_type":"string","required":false,"default":"squash"},{"name":"admin","clr_type":"bool","required":false,"default":false},{"name":"delete-branch","clr_type":"string","required":false,"default":"true"},{"name":"match-head-commit","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"pr merge-mg-ado":{"result_type":"Polyphony.PrMergeMergeGroupAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"match-head-commit","clr_type":"string","required":false,"default":""}]},"pr merge-mg-pr":{"result_type":"Polyphony.PrMergeMergeGroupResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"admin","clr_type":"bool","required":false,"default":false},{"name":"match-head-commit","clr_type":"string","required":false,"default":""}]},"pr merge-plan-ado":{"result_type":"Polyphony.PrMergePlanAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"lock-ttl-hours","clr_type":"int","required":false,"default":24},{"name":"by","clr_type":"string","required":false,"default":""}]},"pr merge-plan-pr":{"result_type":"Polyphony.PrMergePlanPrResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"admin","clr_type":"bool","required":false,"default":false},{"name":"lock-ttl-hours","clr_type":"int","required":false,"default":24},{"name":"by","clr_type":"string","required":false,"default":""}]},"pr open-evidence-ado":{"result_type":"Polyphony.PrOpenEvidenceAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"root-id","clr_type":"int","required":false,"default":0},{"name":"head","clr_type":"string","required":false,"default":""},{"name":"base-branch","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-evidence-pr":{"result_type":"Polyphony.PrOpenEvidenceResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"root-id","clr_type":"int","required":false,"default":0},{"name":"head","clr_type":"string","required":false,"default":""},{"name":"base-branch","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"pr open-impl-ado":{"result_type":"Polyphony.PrOpenImplAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-impl-pr":{"result_type":"Polyphony.PrOpenImplResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"pr open-mg-ado":{"result_type":"Polyphony.PrOpenMergeGroupAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-mg-pr":{"result_type":"Polyphony.PrOpenMergeGroupResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-plan-ado":{"result_type":"Polyphony.PrOpenPlanAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-plan-pr":{"result_type":"Polyphony.PrOpenPlanPrResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr poll-status":{"result_type":"Polyphony.PrPollStatusResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"pr-url","clr_type":"string","required":false,"default":""},{"name":"include-metadata","clr_type":"bool","required":false,"default":false}]},"pr poll-status-ado":{"result_type":"Polyphony.PrPollStatusResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-id","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"include-metadata","clr_type":"bool","required":false,"default":false},{"name":"allow-any-approval-vote","clr_type":"bool","required":false,"default":false}]},"pr post-comment-ado":{"result_type":"Polyphony.PrPostCommentAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr validate-plan-diff":{"result_type":"Polyphony.PrValidatePlanDiffResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"pr vote-ado":{"result_type":"Polyphony.PrVoteAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"reviewer-id","clr_type":"string","required":false,"default":""},{"name":"vote","clr_type":"string","required":false,"default":""}]},"requirements derive":{"result_type":"Polyphony.RequirementsDeriveResult","command_class":"Polyphony.Commands.RequirementsCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"decomposable","clr_type":"bool","required":false,"default":false},{"name":"facet-order","clr_type":"string","required":false,"default":""},{"name":"actionable-executor","clr_type":"string","required":false,"default":""}]},"research write-articles":{"result_type":"Polyphony.Models.ResearchWriteArticlesResult","command_class":"Polyphony.Commands.ResearchCommands","inputs":[{"name":"input-file","clr_type":"string","required":false,"default":"-"},{"name":"input-json","clr_type":"string","required":false,"default":""},{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"reset branches":{"result_type":"Polyphony.ResetBranchesResult","command_class":"Polyphony.Commands.ResetCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"execute","clr_type":"bool","required":false,"default":false}]},"reset facets":{"result_type":"Polyphony.ResetFacetsResult","command_class":"Polyphony.Commands.ResetCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"execute","clr_type":"bool","required":false,"default":false}]},"reset manifest":{"result_type":"Polyphony.ResetManifestResult","command_class":"Polyphony.Commands.ResetCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"execute","clr_type":"bool","required":false,"default":false}]},"reset prs":{"result_type":"Polyphony.ResetPrsResult","command_class":"Polyphony.Commands.ResetCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"execute","clr_type":"bool","required":false,"default":false},{"name":"comment","clr_type":"string","required":false,"default":""}]},"reset root":{"result_type":"Polyphony.ResetRootResult","command_class":"Polyphony.Commands.ResetCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"execute","clr_type":"bool","required":false,"default":false},{"name":"strategy","clr_type":"string","required":false,"default":"projection"},{"name":"allow-unjournaled","clr_type":"bool","required":false,"default":false},{"name":"force-mutated","clr_type":"bool","required":false,"default":false},{"name":"skip-state","clr_type":"bool","required":false,"default":false},{"name":"comment","clr_type":"string","required":false,"default":""}]},"reset state":{"result_type":"Polyphony.ResetStateResult","command_class":"Polyphony.Commands.ResetCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"execute","clr_type":"bool","required":false,"default":false}]},"reset worktrees":{"result_type":"Polyphony.ResetWorktreesResult","command_class":"Polyphony.Commands.ResetCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"execute","clr_type":"bool","required":false,"default":false}]},"root declare":{"result_type":"Polyphony.ScopeMutationResult","command_class":"Polyphony.Commands.RootCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"root resolve":{"result_type":"Polyphony.RootResolveResult","command_class":"Polyphony.Commands.RootCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"max-ancestor-walk","clr_type":"int","required":false,"default":32}]},"scope check":{"result_type":"Polyphony.ScopeCheckResult","command_class":"Polyphony.Commands.ScopeCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"scope list":{"result_type":"Polyphony.ScopeListResult","command_class":"Polyphony.Commands.ScopeCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"max-depth","clr_type":"int","required":false,"default":5}]},"scope tag":{"result_type":"Polyphony.ScopeMutationResult","command_class":"Polyphony.Commands.ScopeCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"scope untag":{"result_type":"Polyphony.ScopeMutationResult","command_class":"Polyphony.Commands.ScopeCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"state next-ready":{"result_type":"Polyphony.StateNextReadyResult","command_class":"Polyphony.Commands.StateCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"plan-root","clr_type":"string","required":false,"default":"docs/projects"},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"state preflight":{"result_type":"Polyphony.StatePreflightResult","command_class":"Polyphony.Commands.StateCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"workflow-yaml","clr_type":"string?","required":false,"default":null},{"name":"required-version","clr_type":"string?","required":false,"default":null}]},"state preflight-lite":{"result_type":"Polyphony.StatePreflightLiteResult","command_class":"Polyphony.Commands.StateCommands","inputs":[{"name":"workflow-yaml","clr_type":"string?","required":false,"default":null},{"name":"required-version","clr_type":"string?","required":false,"default":null}]},"state validate-inputs":{"result_type":"Polyphony.StateValidateInputsResult","command_class":"Polyphony.Commands.StateCommands","inputs":[{"name":"workflow-yaml","clr_type":"string?","required":false,"default":null},{"name":"inputs","clr_type":"string?","required":false,"default":null}]},"status":{"result_type":"Polyphony.StatusResult","command_class":"Polyphony.Commands.StatusCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"repo-slug","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":".polyphony/run.yaml"},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"validate":{"result_type":"Polyphony.ValidateResult","command_class":"Polyphony.Commands.ValidateCommand","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"event","clr_type":"string","required":false,"default":""},{"name":"config","clr_type":"string","required":false,"default":".polyphony-config/process-config.yaml"}]},"validate-config":{"result_type":"Polyphony.Configuration.ConfigValidationResult","command_class":"Polyphony.Commands.ValidateConfigCommand","inputs":[{"name":"config","clr_type":"string","required":false,"default":".polyphony-config"},{"name":"output","clr_type":"string","required":false,"default":"json"}]},"worklist build":{"result_type":"Polyphony.WorklistResult","command_class":"Polyphony.Commands.WorklistCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"json","clr_type":"bool","required":false,"default":false}]},"worktree add":{"result_type":"Polyphony.WorktreeAddResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"git-ref","clr_type":"string?","required":false,"default":null}]},"worktree assert-clean":{"result_type":"Polyphony.WorktreeAssertCleanResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":""},{"name":"expected-branch","clr_type":"string","required":false,"default":""}]},"worktree create":{"result_type":"Polyphony.WorktreeCreateResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"ref","clr_type":"string","required":false,"default":""}]},"worktree gc":{"result_type":"Polyphony.WorktreeGcResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":0},{"name":"commit","clr_type":"bool","required":false,"default":false}]},"worktree init-root":{"result_type":"Polyphony.WorktreeInitRootResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"dry-run","clr_type":"bool","required":false,"default":false}]},"worktree list":{"result_type":"Polyphony.WorktreeListResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[]},"worktree remove":{"result_type":"Polyphony.WorktreeRemoveResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":""},{"name":"force","clr_type":"bool","required":false,"default":false}]},"worktree status":{"result_type":"Polyphony.WorktreeStatusResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":""}]}},"types":{"Polyphony.AdoPrComment":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"thread_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_comment_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"author","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"body","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"file_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"line","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"published_at","kind":"scalar","clr_type":"System.DateTime?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"last_updated_at","kind":"scalar","clr_type":"System.DateTime?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"is_resolved","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_outdated","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"thread_status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"comment_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.AgentGuidanceForRole":{"fields":[{"name":"role","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type_refinement","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.BlockingItem":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.BranchAssertOnImplResult":{"fields":[{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actual_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchCheckDepsResult":{"fields":[{"name":"blocked","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"blocking_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.BlockingItem"},{"name":"ready_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchCloseScopeResult":{"fields":[{"name":"pg_name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"closed_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ClosedItem"},{"name":"failed_closures","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.FailedClosure"},{"name":"total_closed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_failed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_workspace","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsureEvidenceResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_fetched","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"orphan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"from_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsureFeatureResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"worktree_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsureImplResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_fetched","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsureMergeGroupResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_fetched","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"depth","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"depth_warning","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"depth_exceeded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsurePlanResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_fetched","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchLoadTreeResult":{"fields":[{"name":"work_tree","kind":"object","clr_type":"Polyphony.WorkTree","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.WorkTree"},{"name":"pr_groups","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.MergeGroup"},{"name":"completed_pgs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"pending_pgs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"next_pg","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pgs_needing_reconciliation","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.MergeGroupReconciliation"},{"name":"total_tasks","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_issues","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tagged_items","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"untagged_items","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_org","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_workspace","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchNextImplResult":{"fields":[{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"container_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"container_title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"container_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remaining_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_pg","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_workspace","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchRouteResult":{"fields":[{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_pg","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"completed_pgs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"remaining_pgs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"total_pgs","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_workspace","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ChildPendingParentChange":{"fields":[{"name":"child_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_parent_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ClosedItem":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"target_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Configuration.ConfigValidationResult":{"fields":[{"name":"is_valid","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"errors","kind":"list","clr_type":"Polyphony.Configuration.ConfigValidationDiagnostic[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Configuration.ConfigValidationDiagnostic"},{"name":"warnings","kind":"list","clr_type":"Polyphony.Configuration.ConfigValidationDiagnostic[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Configuration.ConfigValidationDiagnostic"}]},"Polyphony.DriftFinding":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"classification","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actual_state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"polyphony_owned","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"platform","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parent_id","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.DriftResult":{"fields":[{"name":"status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"findings","kind":"list","clr_type":"Polyphony.DriftFinding[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.DriftFinding"},{"name":"summary","kind":"object","clr_type":"Polyphony.DriftSummary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.DriftSummary"},{"name":"reset_targets","kind":"list","clr_type":"Polyphony.ResetTargetDescriptor[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"}]},"Polyphony.DriftSummary":{"fields":[{"name":"consistent","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"external_delete","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"external_mutation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"external_create","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.EdgesCheckConflict":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"description","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"contributing_edges","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Sdlc.CrossItemEdge"}]},"Polyphony.EdgesCheckResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items_walked","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"edges_total","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"has_conflicts","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"conflicts","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.EdgesCheckConflict"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.FailedClosure":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.FailedResetTargetDescriptor":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"operation","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.HealthCheckResult":{"fields":[{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"details","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.HealthResult":{"fields":[{"name":"checks","kind":"list","clr_type":"Polyphony.HealthCheckResult[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.HealthCheckResult"},{"name":"os","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"architecture","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"dotnet_version","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"polyphony_version","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"canonical_workflow","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"all_critical_passed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.HierarchyResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facets","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"children","kind":"list","clr_type":"Polyphony.HierarchyResult[]?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"object","element_type_ref":"Polyphony.HierarchyResult"}]},"Polyphony.Journal.JournalEntry":{"fields":[{"name":"id","kind":"scalar","clr_type":"long","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"run_id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"work_item_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"target","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"started_at","kind":"scalar","clr_type":"long","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"finished_at","kind":"scalar","clr_type":"long?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"outcome","kind":"scalar","clr_type":"Polyphony.Journal.JournalOutcome?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"payload_json","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"effects","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Journal.JournalResourceEffect"}]},"Polyphony.Journal.JournalResourceEffect":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"intent","kind":"scalar","clr_type":"Polyphony.Journal.ResourceIntent","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mutation","kind":"scalar","clr_type":"Polyphony.Journal.ResourceMutation","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"polyphony_owned","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"platform","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parent_id","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"attributes","kind":"object","clr_type":"System.Text.Json.Nodes.JsonObject?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"System.Text.Json.Nodes.JsonObject?"}]},"Polyphony.JournalExportResult":{"fields":[{"name":"source_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"destination_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"bytes_copied","kind":"scalar","clr_type":"long","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.JournalHasResult":{"fields":[{"name":"present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"matches","kind":"list","clr_type":"Polyphony.JournalHasMatch[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.JournalHasMatch"}]},"Polyphony.JournalOwnedResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"owned_resources","kind":"list","clr_type":"Polyphony.JournalOwnedResource[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.JournalOwnedResource"},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.JournalQueryResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"effects","kind":"list","clr_type":"Polyphony.JournalQueryEffect[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.JournalQueryEffect"},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.JournalShowFilters":{"fields":[{"name":"work_item","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"run","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"action","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"since","kind":"scalar","clr_type":"long?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"until","kind":"scalar","clr_type":"long?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.JournalShowResult":{"fields":[{"name":"entries","kind":"list","clr_type":"Polyphony.Journal.JournalEntry[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Journal.JournalEntry"},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"filters","kind":"object","clr_type":"Polyphony.JournalShowFilters","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.JournalShowFilters"}]},"Polyphony.Manifest.HumanApprovalRecord":{"fields":[{"name":"gate","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approved_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approved_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"detail","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Manifest.MergeGroupEntry":{"fields":[{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_mg_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"items","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"nesting","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"isolation","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"nesting_override","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Manifest.MergedPlanPrEntry":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"previous_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"recorded_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Manifest.RebaseRecord":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"onto","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"recorded_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Manifest.RetiredMergeGroupRecord":{"fields":[{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"retired_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Manifest.RunManifest":{"fields":[{"name":"schema","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"platform_project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_model_version","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_generations","kind":"map","clr_type":"System.Collections.Generic.Dictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"int"},{"name":"topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_groups","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.MergeGroupEntry"},{"name":"rebases","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.RebaseRecord"},{"name":"human_approvals","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.HumanApprovalRecord"},{"name":"retired_merge_group_ids","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.RetiredMergeGroupRecord"},{"name":"merged_plan_prs","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.MergedPlanPrEntry"}]},"Polyphony.ManifestApprovalRecordResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approval_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"gate","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approved_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approved_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"detail","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestInitResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"platform_project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestReadPlanGenerationResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestReadPlanGenerationSnapshotResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_key","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parent_plan_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ancestor_plan_generations","kind":"map","clr_type":"System.Collections.Generic.Dictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"int"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestReadResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest","kind":"object","clr_type":"Polyphony.Manifest.RunManifest","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.Manifest.RunManifest"},{"name":"computed_topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"topology_hash_matches","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestRebaseRecordResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"rebase_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"onto","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"recorded_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestRecordPlanMergeResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"previous_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestTopologyHashResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stored_topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"matches","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.MergeGroup":{"fields":[{"name":"child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"work_item_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"non_done_child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"stale_doing_child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"non_done_work_item_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_name_suggestion","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged_pr","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"completed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"needs_reconciliation","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.MergeGroupNestingDecisionResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decision","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"nested_mg_id","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"nested_mg_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"impl_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"has_implementable","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decomposable","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"override_applied","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.MergeGroupReconciliation":{"fields":[{"name":"non_done_child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"stale_doing_child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"non_done_work_item_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Models.AcquireLockResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"acquired","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"hint","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"lock_token","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"existing_lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.AgentComposeAddendumResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"skills","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"mcps","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"guidance","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"guidance_present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.BranchImplMergedMarkerResult":{"fields":[{"name":"operation","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_group_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tag","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_in_desired_state","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.ForceReleaseLockResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"released","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"was_held","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"existing_lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.GuidanceExtractResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"source","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"guidance","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"guidance_present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Models.LockStatusResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"exists","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"valid","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stale","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"ttl_remaining_seconds","kind":"scalar","clr_type":"long?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parse_error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.PlanWritePlanResult":{"fields":[{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"bytes_written","kind":"scalar","clr_type":"long","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"content_sha256","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"unchanged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_sha256","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_unchanged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_skipped","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.ReleaseLockResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"released","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"existing_lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.ResearchWriteArticlesResult":{"fields":[{"name":"articles","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Models.WrittenArticle"},{"name":"index_updated","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_kept","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_discarded","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_expand","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Models.WrittenArticle":{"fields":[{"name":"jd_number","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanClassifyStaleDescendantsResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_descendants_scanned","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_descendants_with_open_prs","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_stale","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stale_descendants","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.StalePlanPrDescendant"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanCommitAndPushResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"files_staged","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"commit_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"no_op_reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanDepthGuardResult":{"fields":[{"name":"allowed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"depth","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"max_depth","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remaining","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanDeriveAncestorChainResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"Never","can_omit_when_null":false},{"name":"ancestor_ids","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ancestor_chain","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"depth","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanDetectStateResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_exists_on_origin","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"pr_url","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"pr_state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"stale_ancestors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"parent_change_pending_children","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ChildPendingParentChange"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanExtractParentPatchResult":{"fields":[{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"child_item_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_parent_generation","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"head_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"files_touched","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"parent_plan_diff","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"truncated","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"diff_size_bytes","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requests_parent_change","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanExtractRenegotiationFlagResult":{"fields":[{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"flag_present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"renegotiation_request","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"Never","can_omit_when_null":false},{"name":"fenced_block_well_formed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanLoadAgentGuidanceResult":{"fields":[{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"architect","kind":"object","clr_type":"Polyphony.AgentGuidanceForRole","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.AgentGuidanceForRole"},{"name":"coder","kind":"object","clr_type":"Polyphony.AgentGuidanceForRole","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.AgentGuidanceForRole"},{"name":"reviewer","kind":"object","clr_type":"Polyphony.AgentGuidanceForRole","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.AgentGuidanceForRole"},{"name":"agents","kind":"map","clr_type":"System.Collections.Generic.IReadOnlyDictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanLoadTypeResult":{"fields":[{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"definition","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"template","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decomposition_guidance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanNextChildResult":{"fields":[{"name":"has_plannable_children","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plannable_children","kind":"list","clr_type":"Polyphony.PlannableChild[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PlannableChild"},{"name":"parent_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanRebaseStaleDescendantResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_plan_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"outcome","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_head_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"new_head_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"conflict_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"comment_posted","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"body_updated","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanRecreateStaleDescendantResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_plan_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"outcome","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"new_pr_number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"new_pr_url","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"new_head_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"old_pr_closed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_branch_deleted","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"new_branch_created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"new_pr_opened","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanReviewResult":{"fields":[{"name":"average_score","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"technical_score","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"readability_score","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"revision_cycles_completed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"blocking_issue_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"combined_feedback","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"passed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"forced_by_cap","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanSeedChildrenResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"child_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"seeded_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reused_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"seeded_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.SeedReconciliation"},{"name":"reused_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.SeedReconciliation"},{"name":"errors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.SeedError"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"planned_tag_set","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"planned_tag_already","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_facets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"facets_tag_set","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanStatusItem":{"fields":[{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_pr_number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"plan_pr_url","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"plan_generation","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"pending_revisions","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanStatusResult":{"fields":[{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PlanStatusItem"},{"name":"summary","kind":"object","clr_type":"Polyphony.PlanStatusSummary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PlanStatusSummary"},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanStatusSummary":{"fields":[{"name":"total_items","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_needed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_open","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_merged","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_abandoned","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_n_a","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pending_revisions","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanValidateScopeResult":{"fields":[{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"files_touched","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"files_in_scope","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"files_out_of_scope","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"flag_present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"verdict","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlannableChild":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Policy.ResolvedRule":{"fields":[{"name":"domain","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"scope","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"max_revision_cycles","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"max_fix_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"max_remediation_cycles","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"allow_any_approval_vote","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"min_severity","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"severities_at_or_above","kind":"list","clr_type":"System.Collections.Generic.List?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"scalar","element_clr_type":"string"},{"name":"max_question_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"escalation_cap","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"max_research_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"quality_avg_score_at_least","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"quality_blocking_count_at_most","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PolicyConcurrencySnapshot":{"fields":[{"name":"max_concurrent_children","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PolicyDomainSnapshot":{"fields":[{"name":"defaults_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"defaults_max_revision_cycles","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_max_fix_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_max_remediation_cycles","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_min_severity","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_max_question_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_escalation_cap","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_max_research_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_quality_avg_score_at_least","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_quality_blocking_count_at_most","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_mode","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"by_type_mode","kind":"map","clr_type":"System.Collections.Generic.Dictionary?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"string"}]},"Polyphony.PolicyGuidanceSnapshot":{"fields":[{"name":"source","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_field_name","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"by_type_source","kind":"map","clr_type":"System.Collections.Generic.Dictionary?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"string"}]},"Polyphony.PolicyLoadResult":{"fields":[{"name":"schema_version","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"source_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"used_defaults","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approvals","kind":"object","clr_type":"Polyphony.PolicyDomainSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyDomainSnapshot"},{"name":"pr","kind":"object","clr_type":"Polyphony.PolicyDomainSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyDomainSnapshot"},{"name":"open_questions","kind":"object","clr_type":"Polyphony.PolicyDomainSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyDomainSnapshot"},{"name":"concurrency","kind":"object","clr_type":"Polyphony.PolicyConcurrencySnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyConcurrencySnapshot"},{"name":"guidance","kind":"object","clr_type":"Polyphony.PolicyGuidanceSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyGuidanceSnapshot"},{"name":"root_fallback","kind":"object","clr_type":"Polyphony.PolicyRootFallbackSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyRootFallbackSnapshot"},{"name":"renegotiation","kind":"object","clr_type":"Polyphony.PolicyRenegotiationSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyRenegotiationSnapshot"},{"name":"unattended","kind":"object","clr_type":"Polyphony.PolicyUnattendedSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyUnattendedSnapshot"},{"name":"research","kind":"object","clr_type":"Polyphony.PolicyDomainSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyDomainSnapshot"}]},"Polyphony.PolicyRenegotiationSnapshot":{"fields":[{"name":"auto_decide","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PolicyRootFallbackSnapshot":{"fields":[{"name":"auto_decide","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PolicyUnattendedSnapshot":{"fields":[{"name":"acceptance_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"review_wait_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"cap_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PolicyValidateResult":{"fields":[{"name":"valid","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"source_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"schema_version","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"errors","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"warnings","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"}]},"Polyphony.PrAssertImplPrCoverageCommit":{"fields":[{"name":"sha","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"subject","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PrAssertImplPrCoverageResult":{"fields":[{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"impl_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"comparison_base","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_diff_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actual_diff_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_diff_bytes","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actual_diff_bytes","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"impl_branch_commits","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PrAssertImplPrCoverageCommit"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrCheckEvidenceFloorResult":{"fields":[{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"commit_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"body_length","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"passes_floor","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"violations","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrCreateFeatureAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrCreateFeatureResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"description_summary","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrGetCommentsAdoResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"comments","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.AdoPrComment"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeEvidenceAdoResult":{"fields":[{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeEvidenceResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeFeatureAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeImplAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeImplResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeMergeGroupAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeMergeGroupResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergePlanAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"previous_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock_token","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock_released","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"stale_ancestors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"object","element_type_ref":"Polyphony.StaleAncestorEntry"}]},"Polyphony.PrMergePlanPrResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"previous_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock_token","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock_released","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"stale_ancestors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"object","element_type_ref":"Polyphony.StaleAncestorEntry"}]},"Polyphony.PrOpenEvidenceAdoResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenEvidenceResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenImplAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenImplResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenMergeGroupAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenMergeGroupResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenPlanAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stale","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requests_parent_change","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ancestor_plan_generations","kind":"map","clr_type":"System.Collections.Generic.IReadOnlyDictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"int"},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenPlanPrResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stale","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requests_parent_change","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ancestor_plan_generations","kind":"map","clr_type":"System.Collections.Generic.IReadOnlyDictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"int"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrPollStatusResult":{"fields":[{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"route","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"route_reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_sha","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mergeable","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merge_commit_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merged_at","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reviewers","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PrPollReviewer"},{"name":"threads","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PrPollThread"},{"name":"comments","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PrPollComment"},{"name":"author_identity","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"policy","kind":"object","clr_type":"Polyphony.PrPollPolicy","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PrPollPolicy"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"scalar","element_clr_type":"string"},{"name":"metadata","kind":"object","clr_type":"Polyphony.PrPollMetadata?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.PrPollMetadata?"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrPostCommentAdoResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"body","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"posted","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"thread_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"comment_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrValidatePlanDiffResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_sha","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"severity","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requests_parent_change","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"diff_classified","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"self_plan_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"parent_plan_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"ancestor_plan_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"polyphony_state_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"other_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrVoteAdoResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reviewer_id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"vote","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"vote_value","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"submitted","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PreflightCheck":{"fields":[{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"passed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"detail","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remediation","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PreflightDetails":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_org","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"ado_project","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.RequirementsDeriveResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"decomposable","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facet_order","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"scalar","element_clr_type":"string"},{"name":"actionable_executor","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"requirement_set","kind":"object","clr_type":"Polyphony.Sdlc.RequirementSet?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Sdlc.RequirementSet?"},{"name":"errors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"inputs","kind":"object","clr_type":"Polyphony.RequirementsInputProvenance","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.RequirementsInputProvenance"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.RequirementsInputProvenance":{"fields":[{"name":"decomposable","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facet_order","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actionable_executor","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ResetAbandonedPr":{"fields":[{"name":"number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ResetBranchesResult":{"fields":[{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"deleted_branches","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetDeletedBranch"},{"name":"failed_branches","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetFailedBranch"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ResetDeletedBranch":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"deleted_local","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"deleted_remote","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ResetFacetsItem":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facet_tags_removed","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"planned_tag_removed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"verified","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ResetFacetsResult":{"fields":[{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items_scanned","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items_modified","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_facet_tags_removed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_planned_tags_removed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetFacetsItem"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ResetFailedBranch":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"scope","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ResetFailedPr":{"fields":[{"name":"number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ResetFailedWorktree":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ResetManifestResult":{"fields":[{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"feature_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"feature_branch_exists","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"deferral_reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ResetPrsResult":{"fields":[{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"abandoned_prs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetAbandonedPr"},{"name":"failed_prs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetFailedPr"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ResetRemovedWorktree":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ResetRootResult":{"fields":[{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"strategy","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"coverage","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"fallback_used","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"steps_completed","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"steps_failed","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"attempted_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"},{"name":"deleted_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"},{"name":"failed_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.FailedResetTargetDescriptor"},{"name":"remaining_reset_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"},{"name":"blocked_mutated_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"},{"name":"prs","kind":"object","clr_type":"Polyphony.ResetPrsResult?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.ResetPrsResult?"},{"name":"worktrees","kind":"object","clr_type":"Polyphony.ResetWorktreesResult?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.ResetWorktreesResult?"},{"name":"branches","kind":"object","clr_type":"Polyphony.ResetBranchesResult?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.ResetBranchesResult?"},{"name":"facets","kind":"object","clr_type":"Polyphony.ResetFacetsResult?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.ResetFacetsResult?"},{"name":"manifest","kind":"object","clr_type":"Polyphony.ResetManifestResult?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.ResetManifestResult?"},{"name":"state","kind":"object","clr_type":"Polyphony.ResetStateResult?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.ResetStateResult?"},{"name":"state_skipped","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ResetStateResult":{"fields":[{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"previous_watermark","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"new_watermark","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"removed_duplicate_tags","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ResetTargetDescriptor":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"operation","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ResetWorktreesResult":{"fields":[{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_runs_root","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"removed_worktrees","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetRemovedWorktree"},{"name":"failed_worktrees","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetFailedWorktree"},{"name":"root_dir_deleted","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.RootResolveResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"resolved_root_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"ancestors_walked","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"fallback_required","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ScopeCheckResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"in_scope","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ScopeListItem":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ScopeListResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"in_scope_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ScopeListItem"},{"name":"out_of_scope_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ScopeListItem"},{"name":"in_scope_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"out_of_scope_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ScopeMutationResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"changed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags_before","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"tags_after","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Sdlc.CrossItemEdge":{"fields":[{"name":"prerequisite_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"prerequisite_kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dependent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dependent_kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"required_disposition","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"source","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Sdlc.Requirement":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"disposition","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"acceptance_criteria","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Sdlc.ResolvedRequirementInputs":{"fields":[{"name":"facets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"facets_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decomposable","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decomposable_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facet_order","kind":"list","clr_type":"string[]?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"scalar","element_clr_type":"string"},{"name":"facet_order_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actionable_executor","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"actionable_executor_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"execution_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"execution_mode_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"any_inferred","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.SeedError":{"fields":[{"name":"child_id","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"title","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.SeedReconciliation":{"fields":[{"name":"child_id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"matched_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.StalePlanPrDescendant":{"fields":[{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"stale_ancestors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.StaleAncestorEntry"}]},"Polyphony.StateNextReadyResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requirements","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Sdlc.Requirement"},{"name":"next","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"fulfilling","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"satisfied","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"needed","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"resolved_inputs","kind":"object","clr_type":"Polyphony.Sdlc.ResolvedRequirementInputs","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.Sdlc.ResolvedRequirementInputs"},{"name":"any_input_inferred","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"observation_reasons","kind":"map","clr_type":"System.Collections.Generic.IReadOnlyDictionary?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatePreflightLiteResult":{"fields":[{"name":"ready","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"summary","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"checks","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PreflightCheck"},{"name":"failed_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.StatePreflightResult":{"fields":[{"name":"ready","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"summary","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"required_checks","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PreflightCheck"},{"name":"advisory_checks","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PreflightCheck"},{"name":"failed_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warning_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"details","kind":"object","clr_type":"Polyphony.PreflightDetails","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PreflightDetails"}]},"Polyphony.StateValidateInputsDiagnostic":{"fields":[{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"required","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"supplied","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"default","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StateValidateInputsResult":{"fields":[{"name":"ready","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"summary","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"workflow_yaml","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"inputs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.StateValidateInputsDiagnostic"},{"name":"missing_required_inputs","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"unknown_inputs","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusAdoSection":{"fields":[{"name":"found","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"title","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"tags","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"in_scope","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"has_planned_tag","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusBinarySection":{"fields":[{"name":"version","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"informational_version","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"location","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusFeaturePrSection":{"fields":[{"name":"exists","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"url","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merged_at","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusManifestSection":{"fields":[{"name":"exists","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"feature_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"plan_generations_root","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merged_plan_prs_count","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merge_groups_count","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado","kind":"object","clr_type":"Polyphony.StatusAdoSection","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.StatusAdoSection"},{"name":"manifest","kind":"object","clr_type":"Polyphony.StatusManifestSection","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.StatusManifestSection"},{"name":"feature_pr","kind":"object","clr_type":"Polyphony.StatusFeaturePrSection","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.StatusFeaturePrSection"},{"name":"binary","kind":"object","clr_type":"Polyphony.StatusBinarySection","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.StatusBinarySection"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.StatusWarning"},{"name":"headline","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"next_action","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusWarning":{"fields":[{"name":"code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ValidateResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"event","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_valid","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"target_state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"no_op","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorkTree":{"fields":[{"name":"epic_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"epic_title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"epic_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"issues","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorkTreeIssue"}]},"Polyphony.WorkTreeIssue":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"task_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tasks","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorkTreeTask"}]},"Polyphony.WorkTreeTask":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.WorklistBatch":{"fields":[{"name":"batch_index","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorklistItem"}]},"Polyphony.WorklistItem":{"fields":[{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_pr_number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.WorklistResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items_walked","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"has_conflicts","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"conflicts","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.EdgesCheckConflict"},{"name":"waves","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorklistBatch"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeAddResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"git_ref","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeAssertCleanResult":{"fields":[{"name":"ok","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"expected_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"in_progress_operation","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"dirty_paths","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeCreateResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"outcome","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"slug","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"ref","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_root","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"worktree_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeEntry":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"head","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"is_bare","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_detached","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.WorktreeGcCandidate":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"would_remove","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"removed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeGcResult":{"fields":[{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"runs_root","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"candidates","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorktreeGcCandidate"},{"name":"removed_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"failed_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeInitRootResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_root","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"runs_root","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"main_worktree_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"worktree_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"outcome","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeListResult":{"fields":[{"name":"worktrees","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorktreeEntry"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeRemoveResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"force","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeStatusResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_clean","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"dirty_paths","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]}}} \ No newline at end of file +{"version":1,"verbs":{"agent compose-addendum":{"result_type":"Polyphony.Models.AgentComposeAddendumResult","command_class":"Polyphony.Commands.AgentCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"policy","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"branch assert-on-impl":{"result_type":"Polyphony.BranchAssertOnImplResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648}]},"branch check-deps":{"result_type":"Polyphony.BranchCheckDepsResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"branch clear-impl-merged":{"result_type":"Polyphony.Models.BranchImplMergedMarkerResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""}]},"branch close-scope":{"result_type":"Polyphony.BranchCloseScopeResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"pg-name","clr_type":"string","required":false,"default":""},{"name":"pg-number","clr_type":"int","required":false,"default":0},{"name":"pr-number","clr_type":"int","required":false,"default":0}]},"branch ensure-evidence-branch":{"result_type":"Polyphony.BranchEnsureEvidenceResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"root-id","clr_type":"int","required":false,"default":0},{"name":"from-ref","clr_type":"string","required":false,"default":""},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch ensure-feature":{"result_type":"Polyphony.BranchEnsureFeatureResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"base-branch","clr_type":"string","required":false,"default":"main"},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch ensure-impl":{"result_type":"Polyphony.BranchEnsureImplResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch ensure-mg":{"result_type":"Polyphony.BranchEnsureMergeGroupResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch ensure-plan":{"result_type":"Polyphony.BranchEnsurePlanResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"remote","clr_type":"string","required":false,"default":"origin"}]},"branch load-tree":{"result_type":"Polyphony.BranchLoadTreeResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"branch mark-impl-merged":{"result_type":"Polyphony.Models.BranchImplMergedMarkerResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""}]},"branch next-impl":{"result_type":"Polyphony.BranchNextImplResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"pg-name","clr_type":"string","required":false,"default":""},{"name":"pg-number","clr_type":"int","required":false,"default":0},{"name":"mg-path","clr_type":"string","required":false,"default":""}]},"branch route":{"result_type":"Polyphony.BranchRouteResult","command_class":"Polyphony.Commands.BranchCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"pg-number","clr_type":"int","required":false,"default":0},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"edges check":{"result_type":"Polyphony.EdgesCheckResult","command_class":"Polyphony.Commands.EdgesCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"depth","clr_type":"int","required":false,"default":0},{"name":"render","clr_type":"string","required":false,"default":"json"}]},"guidance extract":{"result_type":"Polyphony.Models.GuidanceExtractResult","command_class":"Polyphony.Commands.GuidanceCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"policy","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"health":{"result_type":"Polyphony.HealthResult","command_class":"Polyphony.Commands.HealthCommand","inputs":[{"name":"config","clr_type":"string","required":false,"default":".polyphony-config/process-config.yaml"}]},"hierarchy":{"result_type":"Polyphony.HierarchyResult","command_class":"Polyphony.Commands.HierarchyCommand","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"depth","clr_type":"int","required":false,"default":3},{"name":"config","clr_type":"string","required":false,"default":".polyphony-config/process-config.yaml"}]},"journal drift":{"result_type":"Polyphony.DriftResult","command_class":"Polyphony.Commands.JournalDriftCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"render","clr_type":"string","required":false,"default":"json"}]},"journal export":{"result_type":"Polyphony.JournalExportResult","command_class":"Polyphony.Commands.JournalCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":""}]},"journal has":{"result_type":"Polyphony.JournalHasResult","command_class":"Polyphony.Commands.JournalHasCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"action","clr_type":"string","required":false,"default":""},{"name":"target","clr_type":"string?","required":false,"default":null},{"name":"run","clr_type":"string?","required":false,"default":null}]},"journal owned":{"result_type":"Polyphony.JournalOwnedResult","command_class":"Polyphony.Commands.JournalOwnedCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"kind","clr_type":"string?","required":false,"default":null}]},"journal query":{"result_type":"Polyphony.JournalQueryResult","command_class":"Polyphony.Commands.JournalQueryCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"kind","clr_type":"string?","required":false,"default":null},{"name":"owned-only","clr_type":"bool","required":false,"default":false},{"name":"state","clr_type":"string?","required":false,"default":null},{"name":"since","clr_type":"string?","required":false,"default":null},{"name":"until","clr_type":"string?","required":false,"default":null}]},"journal show":{"result_type":"Polyphony.JournalShowResult","command_class":"Polyphony.Commands.JournalCommands","inputs":[{"name":"work-item","clr_type":"int?","required":false,"default":null},{"name":"root","clr_type":"int?","required":false,"default":null},{"name":"run","clr_type":"string?","required":false,"default":null},{"name":"action","clr_type":"string?","required":false,"default":null},{"name":"render","clr_type":"string","required":false,"default":"json"}]},"lock acquire":{"result_type":"Polyphony.Models.AcquireLockResult","command_class":"Polyphony.Commands.LockCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"ttl-hours","clr_type":"int","required":false,"default":24},{"name":"by","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":""}]},"lock force-release":{"result_type":"Polyphony.Models.ForceReleaseLockResult","command_class":"Polyphony.Commands.LockCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"lock release":{"result_type":"Polyphony.Models.ReleaseLockResult","command_class":"Polyphony.Commands.LockCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"lock-token","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":""}]},"lock status":{"result_type":"Polyphony.Models.LockStatusResult","command_class":"Polyphony.Commands.LockCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"manifest init":{"result_type":"Polyphony.ManifestInitResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"platform-project","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"created-by","clr_type":"string","required":false,"default":""},{"name":"force","clr_type":"bool","required":false,"default":false}]},"manifest read":{"result_type":"Polyphony.ManifestReadResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"manifest read-plan-generation":{"result_type":"Polyphony.ManifestReadPlanGenerationResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"item","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"manifest read-plan-generation-snapshot":{"result_type":"Polyphony.ManifestReadPlanGenerationSnapshotResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"item","clr_type":"string","required":false,"default":""},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"manifest record-approval":{"result_type":"Polyphony.ManifestApprovalRecordResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"gate","clr_type":"string","required":false,"default":""},{"name":"approved-by","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"detail","clr_type":"string","required":false,"default":""},{"name":"at","clr_type":"string","required":false,"default":""}]},"manifest record-plan-merge":{"result_type":"Polyphony.ManifestRecordPlanMergeResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"item","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":0},{"name":"merge-commit","clr_type":"string","required":false,"default":""}]},"manifest record-rebase":{"result_type":"Polyphony.ManifestRebaseRecordResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"onto","clr_type":"string","required":false,"default":""},{"name":"reason","clr_type":"string","required":false,"default":""},{"name":"commit","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"at","clr_type":"string","required":false,"default":""}]},"manifest topology-hash":{"result_type":"Polyphony.ManifestTopologyHashResult","command_class":"Polyphony.Commands.ManifestCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"path","clr_type":"string","required":false,"default":""}]},"merge-group nesting-decision":{"result_type":"Polyphony.MergeGroupNestingDecisionResult","command_class":"Polyphony.Commands.MergeGroupCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-mg-path","clr_type":"string","required":false,"default":""},{"name":"has-implementable","clr_type":"bool","required":false,"default":false},{"name":"decomposable","clr_type":"bool","required":false,"default":false},{"name":"override-flat","clr_type":"bool","required":false,"default":false},{"name":"override-nested-mg-id","clr_type":"string","required":false,"default":""}]},"plan classify-stale-descendants":{"result_type":"Polyphony.PlanClassifyStaleDescendantsResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan commit-and-push":{"result_type":"Polyphony.PlanCommitAndPushResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"message","clr_type":"string","required":false,"default":""},{"name":"paths","clr_type":"string","required":false,"default":""}]},"plan depth-guard":{"result_type":"Polyphony.PlanDepthGuardResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"depth","clr_type":"int","required":false,"default":-2147483648},{"name":"max-depth","clr_type":"int","required":false,"default":6}]},"plan derive-ancestor-chain":{"result_type":"Polyphony.PlanDeriveAncestorChainResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648}]},"plan detect-state":{"result_type":"Polyphony.PlanDetectStateResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"planned-tag","clr_type":"string","required":false,"default":"polyphony:planned"},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan extract-parent-patch":{"result_type":"Polyphony.PlanExtractParentPatchResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"pr-url","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"diff-size-limit-bytes","clr_type":"int","required":false,"default":51200}]},"plan extract-renegotiation-flag":{"result_type":"Polyphony.PlanExtractRenegotiationFlagResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"repo","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan load-agent-guidance":{"result_type":"Polyphony.PlanLoadAgentGuidanceResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"config-dir","clr_type":"string","required":false,"default":".polyphony-config"}]},"plan load-type":{"result_type":"Polyphony.PlanLoadTypeResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"config-dir","clr_type":"string","required":false,"default":".polyphony-config"}]},"plan next-child":{"result_type":"Polyphony.PlanNextChildResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"plan rebase-stale-descendant":{"result_type":"Polyphony.PlanRebaseStaleDescendantResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"by","clr_type":"string","required":false,"default":""},{"name":"lock-ttl-hours","clr_type":"int","required":false,"default":24},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan recreate-stale-descendant":{"result_type":"Polyphony.PlanRecreateStaleDescendantResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"by","clr_type":"string","required":false,"default":""},{"name":"lock-ttl-hours","clr_type":"int","required":false,"default":24},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan review":{"result_type":"Polyphony.PlanReviewResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"tech-reviewer-json","clr_type":"string","required":false,"default":""},{"name":"readability-reviewer-json","clr_type":"string","required":false,"default":""},{"name":"prior-cycle-count","clr_type":"int","required":false,"default":-2147483648},{"name":"max-cycles","clr_type":"int","required":false,"default":5}]},"plan seed-children":{"result_type":"Polyphony.PlanSeedChildrenResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"children-json","clr_type":"string","required":false,"default":""},{"name":"planned-tag","clr_type":"string","required":false,"default":"polyphony:planned"},{"name":"plan-file","clr_type":"string","required":false,"default":""},{"name":"config-dir","clr_type":"string","required":false,"default":".polyphony-config"},{"name":"children-file","clr_type":"string","required":false,"default":""},{"name":"children-from-ref","clr_type":"string","required":false,"default":""}]},"plan status":{"result_type":"Polyphony.PlanStatusResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"manifest","clr_type":"string","required":false,"default":""},{"name":"repo","clr_type":"string","required":false,"default":""},{"name":"include-na","clr_type":"bool","required":false,"default":false},{"name":"json","clr_type":"bool","required":false,"default":false},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan validate-scope":{"result_type":"Polyphony.PlanValidateScopeResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"child-scope","clr_type":"string","required":false,"default":""},{"name":"repo","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"plan write-plan":{"result_type":"Polyphony.Models.PlanWritePlanResult","command_class":"Polyphony.Commands.PlanCommands","inputs":[{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"content-json","clr_type":"string","required":false,"default":""},{"name":"plans-dir","clr_type":"string","required":false,"default":"plans"},{"name":"children-json","clr_type":"string","required":false,"default":""}]},"policy load":{"result_type":"Polyphony.PolicyLoadResult","command_class":"Polyphony.Commands.PolicyCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"policy resolve":{"result_type":"Polyphony.Policy.ResolvedRule","command_class":"Polyphony.Commands.PolicyCommands","inputs":[{"name":"scope","clr_type":"string","required":false,"default":""},{"name":"domain","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"policy validate":{"result_type":"Polyphony.PolicyValidateResult","command_class":"Polyphony.Commands.PolicyCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":".polyphony-config/policy.yaml"}]},"pr assert-impl-pr-coverage":{"result_type":"Polyphony.PrAssertImplPrCoverageResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"remote","clr_type":"string","required":false,"default":"origin"},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"pr check-evidence-floor":{"result_type":"Polyphony.PrCheckEvidenceFloorResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"repo","clr_type":"string","required":false,"default":""},{"name":"min-commits","clr_type":"int","required":false,"default":1},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"pr create-feature-ado":{"result_type":"Polyphony.PrCreateFeatureAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"target-branch","clr_type":"string","required":false,"default":"main"},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr create-feature-pr":{"result_type":"Polyphony.PrCreateFeatureResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"feature-branch","clr_type":"string","required":false,"default":""},{"name":"target-branch","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""}]},"pr get-comments-ado":{"result_type":"Polyphony.PrGetCommentsAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"include-resolved","clr_type":"bool","required":false,"default":false},{"name":"since","clr_type":"string","required":false,"default":""}]},"pr merge-evidence-ado":{"result_type":"Polyphony.PrMergeEvidenceAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648}]},"pr merge-evidence-pr":{"result_type":"Polyphony.PrMergeEvidenceResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-url","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"pr merge-feature-ado":{"result_type":"Polyphony.PrMergeFeatureAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"target-branch","clr_type":"string","required":false,"default":"main"},{"name":"match-head-commit","clr_type":"string","required":false,"default":""}]},"pr merge-impl-ado":{"result_type":"Polyphony.PrMergeImplAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"match-head-commit","clr_type":"string","required":false,"default":""},{"name":"delete-branch","clr_type":"string","required":false,"default":"true"}]},"pr merge-impl-pr":{"result_type":"Polyphony.PrMergeImplResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"method","clr_type":"string","required":false,"default":"squash"},{"name":"admin","clr_type":"bool","required":false,"default":false},{"name":"delete-branch","clr_type":"string","required":false,"default":"true"},{"name":"match-head-commit","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"pr merge-mg-ado":{"result_type":"Polyphony.PrMergeMergeGroupAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"match-head-commit","clr_type":"string","required":false,"default":""}]},"pr merge-mg-pr":{"result_type":"Polyphony.PrMergeMergeGroupResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"admin","clr_type":"bool","required":false,"default":false},{"name":"match-head-commit","clr_type":"string","required":false,"default":""}]},"pr merge-plan-ado":{"result_type":"Polyphony.PrMergePlanAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"lock-ttl-hours","clr_type":"int","required":false,"default":24},{"name":"by","clr_type":"string","required":false,"default":""}]},"pr merge-plan-pr":{"result_type":"Polyphony.PrMergePlanPrResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"admin","clr_type":"bool","required":false,"default":false},{"name":"lock-ttl-hours","clr_type":"int","required":false,"default":24},{"name":"by","clr_type":"string","required":false,"default":""}]},"pr open-evidence-ado":{"result_type":"Polyphony.PrOpenEvidenceAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"root-id","clr_type":"int","required":false,"default":0},{"name":"head","clr_type":"string","required":false,"default":""},{"name":"base-branch","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-evidence-pr":{"result_type":"Polyphony.PrOpenEvidenceResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"root-id","clr_type":"int","required":false,"default":0},{"name":"head","clr_type":"string","required":false,"default":""},{"name":"base-branch","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"pr open-impl-ado":{"result_type":"Polyphony.PrOpenImplAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-impl-pr":{"result_type":"Polyphony.PrOpenImplResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"pr open-mg-ado":{"result_type":"Polyphony.PrOpenMergeGroupAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-mg-pr":{"result_type":"Polyphony.PrOpenMergeGroupResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"mg-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-plan-ado":{"result_type":"Polyphony.PrOpenPlanAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr open-plan-pr":{"result_type":"Polyphony.PrOpenPlanPrResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"title","clr_type":"string","required":false,"default":""},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr poll-status":{"result_type":"Polyphony.PrPollStatusResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"pr-url","clr_type":"string","required":false,"default":""},{"name":"include-metadata","clr_type":"bool","required":false,"default":false}]},"pr poll-status-ado":{"result_type":"Polyphony.PrPollStatusResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-id","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"include-metadata","clr_type":"bool","required":false,"default":false},{"name":"allow-any-approval-vote","clr_type":"bool","required":false,"default":false}]},"pr post-comment-ado":{"result_type":"Polyphony.PrPostCommentAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"body","clr_type":"string","required":false,"default":""}]},"pr validate-plan-diff":{"result_type":"Polyphony.PrValidatePlanDiffResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"item-id","clr_type":"int","required":false,"default":-2147483648},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"parent-item-id","clr_type":"int","required":false,"default":0},{"name":"ancestor-ids","clr_type":"string","required":false,"default":""},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"pr vote-ado":{"result_type":"Polyphony.PrVoteAdoResult","command_class":"Polyphony.Commands.PrCommands","inputs":[{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""},{"name":"pr-number","clr_type":"int","required":false,"default":-2147483648},{"name":"reviewer-id","clr_type":"string","required":false,"default":""},{"name":"vote","clr_type":"string","required":false,"default":""}]},"requirements derive":{"result_type":"Polyphony.RequirementsDeriveResult","command_class":"Polyphony.Commands.RequirementsCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"decomposable","clr_type":"bool","required":false,"default":false},{"name":"facet-order","clr_type":"string","required":false,"default":""},{"name":"actionable-executor","clr_type":"string","required":false,"default":""}]},"research write-articles":{"result_type":"Polyphony.Models.ResearchWriteArticlesResult","command_class":"Polyphony.Commands.ResearchCommands","inputs":[{"name":"input-file","clr_type":"string","required":false,"default":"-"},{"name":"input-json","clr_type":"string","required":false,"default":""},{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"reset root":{"result_type":"Polyphony.ResetRootResult","command_class":"Polyphony.Commands.ResetCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"execute","clr_type":"bool","required":false,"default":false},{"name":"allow-unjournaled","clr_type":"bool","required":false,"default":false},{"name":"force-mutated","clr_type":"bool","required":false,"default":false},{"name":"skip-state","clr_type":"bool","required":false,"default":false},{"name":"comment","clr_type":"string","required":false,"default":""}]},"root declare":{"result_type":"Polyphony.ScopeMutationResult","command_class":"Polyphony.Commands.RootCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"root resolve":{"result_type":"Polyphony.RootResolveResult","command_class":"Polyphony.Commands.RootCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"max-ancestor-walk","clr_type":"int","required":false,"default":32}]},"scope check":{"result_type":"Polyphony.ScopeCheckResult","command_class":"Polyphony.Commands.ScopeCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"scope list":{"result_type":"Polyphony.ScopeListResult","command_class":"Polyphony.Commands.ScopeCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"max-depth","clr_type":"int","required":false,"default":5}]},"scope tag":{"result_type":"Polyphony.ScopeMutationResult","command_class":"Polyphony.Commands.ScopeCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"scope untag":{"result_type":"Polyphony.ScopeMutationResult","command_class":"Polyphony.Commands.ScopeCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648}]},"state next-ready":{"result_type":"Polyphony.StateNextReadyResult","command_class":"Polyphony.Commands.StateCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"plan-root","clr_type":"string","required":false,"default":"docs/projects"},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository","clr_type":"string","required":false,"default":""}]},"state preflight":{"result_type":"Polyphony.StatePreflightResult","command_class":"Polyphony.Commands.StateCommands","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"workflow-yaml","clr_type":"string?","required":false,"default":null},{"name":"required-version","clr_type":"string?","required":false,"default":null}]},"state preflight-lite":{"result_type":"Polyphony.StatePreflightLiteResult","command_class":"Polyphony.Commands.StateCommands","inputs":[{"name":"workflow-yaml","clr_type":"string?","required":false,"default":null},{"name":"required-version","clr_type":"string?","required":false,"default":null}]},"state validate-inputs":{"result_type":"Polyphony.StateValidateInputsResult","command_class":"Polyphony.Commands.StateCommands","inputs":[{"name":"workflow-yaml","clr_type":"string?","required":false,"default":null},{"name":"inputs","clr_type":"string?","required":false,"default":null}]},"status":{"result_type":"Polyphony.StatusResult","command_class":"Polyphony.Commands.StatusCommand","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"repo-slug","clr_type":"string","required":false,"default":""},{"name":"manifest-path","clr_type":"string","required":false,"default":".polyphony/run.yaml"},{"name":"platform","clr_type":"string","required":false,"default":""},{"name":"organization","clr_type":"string","required":false,"default":""},{"name":"project","clr_type":"string","required":false,"default":""},{"name":"repository-override","clr_type":"string","required":false,"default":""}]},"validate":{"result_type":"Polyphony.ValidateResult","command_class":"Polyphony.Commands.ValidateCommand","inputs":[{"name":"work-item","clr_type":"int","required":false,"default":-2147483648},{"name":"event","clr_type":"string","required":false,"default":""},{"name":"config","clr_type":"string","required":false,"default":".polyphony-config/process-config.yaml"}]},"validate-config":{"result_type":"Polyphony.Configuration.ConfigValidationResult","command_class":"Polyphony.Commands.ValidateConfigCommand","inputs":[{"name":"config","clr_type":"string","required":false,"default":".polyphony-config"},{"name":"output","clr_type":"string","required":false,"default":"json"}]},"worklist build":{"result_type":"Polyphony.WorklistResult","command_class":"Polyphony.Commands.WorklistCommands","inputs":[{"name":"root-id","clr_type":"int","required":false,"default":-2147483648},{"name":"manifest-path","clr_type":"string","required":false,"default":""},{"name":"json","clr_type":"bool","required":false,"default":false}]},"worktree add":{"result_type":"Polyphony.WorktreeAddResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"path","clr_type":"string","required":false,"default":""},{"name":"git-ref","clr_type":"string?","required":false,"default":null}]},"worktree assert-clean":{"result_type":"Polyphony.WorktreeAssertCleanResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":""},{"name":"expected-branch","clr_type":"string","required":false,"default":""}]},"worktree create":{"result_type":"Polyphony.WorktreeCreateResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"branch","clr_type":"string","required":false,"default":""},{"name":"ref","clr_type":"string","required":false,"default":""}]},"worktree gc":{"result_type":"Polyphony.WorktreeGcResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":0},{"name":"commit","clr_type":"bool","required":false,"default":false}]},"worktree init-root":{"result_type":"Polyphony.WorktreeInitRootResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"root","clr_type":"int","required":false,"default":-2147483648},{"name":"dry-run","clr_type":"bool","required":false,"default":false}]},"worktree list":{"result_type":"Polyphony.WorktreeListResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[]},"worktree remove":{"result_type":"Polyphony.WorktreeRemoveResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":""},{"name":"force","clr_type":"bool","required":false,"default":false}]},"worktree status":{"result_type":"Polyphony.WorktreeStatusResult","command_class":"Polyphony.Commands.WorktreeCommands","inputs":[{"name":"path","clr_type":"string","required":false,"default":""}]}},"types":{"Polyphony.AdoPrComment":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"thread_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_comment_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"author","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"body","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"file_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"line","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"published_at","kind":"scalar","clr_type":"System.DateTime?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"last_updated_at","kind":"scalar","clr_type":"System.DateTime?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"is_resolved","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_outdated","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"thread_status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"comment_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.AgentGuidanceForRole":{"fields":[{"name":"role","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type_refinement","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.BlockingItem":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.BranchAssertOnImplResult":{"fields":[{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actual_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchCheckDepsResult":{"fields":[{"name":"blocked","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"blocking_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.BlockingItem"},{"name":"ready_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchCloseScopeResult":{"fields":[{"name":"pg_name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"closed_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ClosedItem"},{"name":"failed_closures","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.FailedClosure"},{"name":"total_closed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_failed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_workspace","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsureEvidenceResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_fetched","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"orphan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"from_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsureFeatureResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"worktree_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsureImplResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_fetched","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsureMergeGroupResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_fetched","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"depth","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"depth_warning","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"depth_exceeded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchEnsurePlanResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_remote_existed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_fetched","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_from","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchLoadTreeResult":{"fields":[{"name":"work_tree","kind":"object","clr_type":"Polyphony.WorkTree","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.WorkTree"},{"name":"pr_groups","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.MergeGroup"},{"name":"completed_pgs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"pending_pgs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"next_pg","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pgs_needing_reconciliation","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.MergeGroupReconciliation"},{"name":"total_tasks","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_issues","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tagged_items","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"untagged_items","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_org","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_workspace","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchNextImplResult":{"fields":[{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"container_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"container_title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"container_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remaining_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_pg","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_workspace","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.BranchRouteResult":{"fields":[{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_pg","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"completed_pgs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"remaining_pgs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"total_pgs","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_workspace","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ChildPendingParentChange":{"fields":[{"name":"child_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_parent_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ClosedItem":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"target_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Configuration.ConfigValidationResult":{"fields":[{"name":"is_valid","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"errors","kind":"list","clr_type":"Polyphony.Configuration.ConfigValidationDiagnostic[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Configuration.ConfigValidationDiagnostic"},{"name":"warnings","kind":"list","clr_type":"Polyphony.Configuration.ConfigValidationDiagnostic[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Configuration.ConfigValidationDiagnostic"}]},"Polyphony.DriftFinding":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"classification","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actual_state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"polyphony_owned","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"platform","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parent_id","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.DriftResult":{"fields":[{"name":"status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"findings","kind":"list","clr_type":"Polyphony.DriftFinding[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.DriftFinding"},{"name":"summary","kind":"object","clr_type":"Polyphony.DriftSummary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.DriftSummary"},{"name":"reset_targets","kind":"list","clr_type":"Polyphony.ResetTargetDescriptor[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"}]},"Polyphony.DriftSummary":{"fields":[{"name":"consistent","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"external_delete","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"external_mutation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"external_create","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.EdgesCheckConflict":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"description","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"contributing_edges","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Sdlc.CrossItemEdge"}]},"Polyphony.EdgesCheckResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items_walked","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"edges_total","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"has_conflicts","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"conflicts","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.EdgesCheckConflict"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.FailedClosure":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.FailedResetTargetDescriptor":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"operation","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.HealthCheckResult":{"fields":[{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"details","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.HealthResult":{"fields":[{"name":"checks","kind":"list","clr_type":"Polyphony.HealthCheckResult[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.HealthCheckResult"},{"name":"os","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"architecture","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"dotnet_version","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"polyphony_version","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"canonical_workflow","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"all_critical_passed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.HierarchyResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facets","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"children","kind":"list","clr_type":"Polyphony.HierarchyResult[]?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"object","element_type_ref":"Polyphony.HierarchyResult"}]},"Polyphony.Journal.JournalEntry":{"fields":[{"name":"id","kind":"scalar","clr_type":"long","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"run_id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"work_item_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"target","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"started_at","kind":"scalar","clr_type":"long","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"finished_at","kind":"scalar","clr_type":"long?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"outcome","kind":"scalar","clr_type":"Polyphony.Journal.JournalOutcome?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"payload_json","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"effects","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Journal.JournalResourceEffect"}]},"Polyphony.Journal.JournalResourceEffect":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"intent","kind":"scalar","clr_type":"Polyphony.Journal.ResourceIntent","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mutation","kind":"scalar","clr_type":"Polyphony.Journal.ResourceMutation","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"polyphony_owned","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"platform","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parent_id","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"attributes","kind":"object","clr_type":"System.Text.Json.Nodes.JsonObject?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"System.Text.Json.Nodes.JsonObject?"}]},"Polyphony.JournalExportResult":{"fields":[{"name":"source_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"destination_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"bytes_copied","kind":"scalar","clr_type":"long","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.JournalHasResult":{"fields":[{"name":"present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"matches","kind":"list","clr_type":"Polyphony.JournalHasMatch[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.JournalHasMatch"}]},"Polyphony.JournalOwnedResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"owned_resources","kind":"list","clr_type":"Polyphony.JournalOwnedResource[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.JournalOwnedResource"},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.JournalQueryResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"effects","kind":"list","clr_type":"Polyphony.JournalQueryEffect[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.JournalQueryEffect"},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.JournalShowFilters":{"fields":[{"name":"work_item","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"run","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"action","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"since","kind":"scalar","clr_type":"long?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"until","kind":"scalar","clr_type":"long?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.JournalShowResult":{"fields":[{"name":"entries","kind":"list","clr_type":"Polyphony.Journal.JournalEntry[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Journal.JournalEntry"},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"filters","kind":"object","clr_type":"Polyphony.JournalShowFilters","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.JournalShowFilters"}]},"Polyphony.Manifest.HumanApprovalRecord":{"fields":[{"name":"gate","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approved_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approved_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"detail","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Manifest.MergeGroupEntry":{"fields":[{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_mg_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"items","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"nesting","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"isolation","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"nesting_override","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Manifest.MergedPlanPrEntry":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"previous_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"recorded_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Manifest.RebaseRecord":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"onto","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"recorded_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Manifest.RetiredMergeGroupRecord":{"fields":[{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"retired_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Manifest.RunManifest":{"fields":[{"name":"schema","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"platform_project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_model_version","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_generations","kind":"map","clr_type":"System.Collections.Generic.Dictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"int"},{"name":"topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_groups","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.MergeGroupEntry"},{"name":"rebases","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.RebaseRecord"},{"name":"human_approvals","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.HumanApprovalRecord"},{"name":"retired_merge_group_ids","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.RetiredMergeGroupRecord"},{"name":"merged_plan_prs","kind":"list","clr_type":"System.Collections.Generic.List","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Manifest.MergedPlanPrEntry"}]},"Polyphony.ManifestApprovalRecordResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approval_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"gate","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approved_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approved_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"detail","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestInitResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"platform_project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestReadPlanGenerationResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestReadPlanGenerationSnapshotResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_key","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parent_plan_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ancestor_plan_generations","kind":"map","clr_type":"System.Collections.Generic.Dictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"int"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestReadResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest","kind":"object","clr_type":"Polyphony.Manifest.RunManifest","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.Manifest.RunManifest"},{"name":"computed_topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"topology_hash_matches","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestRebaseRecordResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"rebase_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"onto","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"recorded_at","kind":"scalar","clr_type":"System.DateTime","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestRecordPlanMergeResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"previous_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ManifestTopologyHashResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stored_topology_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"matches","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"path_source","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.MergeGroup":{"fields":[{"name":"child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"work_item_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"non_done_child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"stale_doing_child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"non_done_work_item_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_name_suggestion","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged_pr","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"completed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"needs_reconciliation","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.MergeGroupNestingDecisionResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decision","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"nested_mg_id","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"nested_mg_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"impl_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"has_implementable","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decomposable","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"override_applied","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.MergeGroupReconciliation":{"fields":[{"name":"non_done_child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"stale_doing_child_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"non_done_work_item_ids","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Models.AcquireLockResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"acquired","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"hint","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"lock_token","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"existing_lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.AgentComposeAddendumResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"skills","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"mcps","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"guidance","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"guidance_present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.BranchImplMergedMarkerResult":{"fields":[{"name":"operation","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_group_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tag","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_in_desired_state","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.ForceReleaseLockResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"released","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"was_held","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"existing_lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.GuidanceExtractResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"source","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"guidance","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"guidance_present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Models.LockStatusResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"exists","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"valid","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stale","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"ttl_remaining_seconds","kind":"scalar","clr_type":"long?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parse_error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.PlanWritePlanResult":{"fields":[{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"bytes_written","kind":"scalar","clr_type":"long","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"content_sha256","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"unchanged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_sha256","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_unchanged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_skipped","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.ReleaseLockResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"released","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"existing_lock","kind":"object","clr_type":"Polyphony.Locking.RunLock?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Locking.RunLock?"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Models.ResearchWriteArticlesResult":{"fields":[{"name":"articles","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Models.WrittenArticle"},{"name":"index_updated","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_kept","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_discarded","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_expand","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Models.WrittenArticle":{"fields":[{"name":"jd_number","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanClassifyStaleDescendantsResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_descendants_scanned","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_descendants_with_open_prs","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"total_stale","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stale_descendants","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.StalePlanPrDescendant"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanCommitAndPushResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"files_staged","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"commit_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"no_op_reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanDepthGuardResult":{"fields":[{"name":"allowed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"depth","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"max_depth","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remaining","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanDeriveAncestorChainResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"Never","can_omit_when_null":false},{"name":"ancestor_ids","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ancestor_chain","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"depth","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanDetectStateResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch_exists_on_origin","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"pr_url","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"pr_state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"stale_ancestors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"parent_change_pending_children","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ChildPendingParentChange"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanExtractParentPatchResult":{"fields":[{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"child_item_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_parent_generation","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"head_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"files_touched","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"parent_plan_diff","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"truncated","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"diff_size_bytes","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requests_parent_change","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanExtractRenegotiationFlagResult":{"fields":[{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"flag_present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"renegotiation_request","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"Never","can_omit_when_null":false},{"name":"fenced_block_well_formed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanLoadAgentGuidanceResult":{"fields":[{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"architect","kind":"object","clr_type":"Polyphony.AgentGuidanceForRole","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.AgentGuidanceForRole"},{"name":"coder","kind":"object","clr_type":"Polyphony.AgentGuidanceForRole","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.AgentGuidanceForRole"},{"name":"reviewer","kind":"object","clr_type":"Polyphony.AgentGuidanceForRole","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.AgentGuidanceForRole"},{"name":"agents","kind":"map","clr_type":"System.Collections.Generic.IReadOnlyDictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanLoadTypeResult":{"fields":[{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"definition","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"template","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decomposition_guidance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanNextChildResult":{"fields":[{"name":"has_plannable_children","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plannable_children","kind":"list","clr_type":"Polyphony.PlannableChild[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PlannableChild"},{"name":"parent_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanRebaseStaleDescendantResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_plan_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"outcome","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_head_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"new_head_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"conflict_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"comment_posted","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"body_updated","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanRecreateStaleDescendantResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_plan_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"outcome","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"new_pr_number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"new_pr_url","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"new_head_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"old_pr_closed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"old_branch_deleted","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"new_branch_created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"new_pr_opened","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanReviewResult":{"fields":[{"name":"average_score","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"technical_score","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"readability_score","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"revision_cycles_completed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"blocking_issue_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"combined_feedback","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"passed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"forced_by_cap","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanSeedChildrenResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"child_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"seeded_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reused_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"seeded_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.SeedReconciliation"},{"name":"reused_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.SeedReconciliation"},{"name":"errors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.SeedError"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"planned_tag_set","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"planned_tag_already","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_facets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"facets_tag_set","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanStatusItem":{"fields":[{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_pr_number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"plan_pr_url","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"plan_generation","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"pending_revisions","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanStatusResult":{"fields":[{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PlanStatusItem"},{"name":"summary","kind":"object","clr_type":"Polyphony.PlanStatusSummary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PlanStatusSummary"},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlanStatusSummary":{"fields":[{"name":"total_items","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_needed","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_open","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_merged","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_abandoned","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_n_a","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pending_revisions","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PlanValidateScopeResult":{"fields":[{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"files_touched","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"files_in_scope","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"files_out_of_scope","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"flag_present","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"verdict","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PlannableChild":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Policy.ResolvedRule":{"fields":[{"name":"domain","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"scope","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"max_revision_cycles","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"max_fix_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"max_remediation_cycles","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"allow_any_approval_vote","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"min_severity","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"severities_at_or_above","kind":"list","clr_type":"System.Collections.Generic.List?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"scalar","element_clr_type":"string"},{"name":"max_question_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"escalation_cap","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"max_research_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"quality_avg_score_at_least","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"quality_blocking_count_at_most","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PolicyConcurrencySnapshot":{"fields":[{"name":"max_concurrent_children","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PolicyDomainSnapshot":{"fields":[{"name":"defaults_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"defaults_max_revision_cycles","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_max_fix_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_max_remediation_cycles","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_min_severity","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_max_question_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_escalation_cap","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_max_research_loops","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_quality_avg_score_at_least","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"defaults_quality_blocking_count_at_most","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_mode","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"by_type_mode","kind":"map","clr_type":"System.Collections.Generic.Dictionary?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"string"}]},"Polyphony.PolicyGuidanceSnapshot":{"fields":[{"name":"source","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_field_name","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"by_type_source","kind":"map","clr_type":"System.Collections.Generic.Dictionary?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"string"}]},"Polyphony.PolicyLoadResult":{"fields":[{"name":"schema_version","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"source_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"used_defaults","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"approvals","kind":"object","clr_type":"Polyphony.PolicyDomainSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyDomainSnapshot"},{"name":"pr","kind":"object","clr_type":"Polyphony.PolicyDomainSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyDomainSnapshot"},{"name":"open_questions","kind":"object","clr_type":"Polyphony.PolicyDomainSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyDomainSnapshot"},{"name":"concurrency","kind":"object","clr_type":"Polyphony.PolicyConcurrencySnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyConcurrencySnapshot"},{"name":"guidance","kind":"object","clr_type":"Polyphony.PolicyGuidanceSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyGuidanceSnapshot"},{"name":"root_fallback","kind":"object","clr_type":"Polyphony.PolicyRootFallbackSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyRootFallbackSnapshot"},{"name":"renegotiation","kind":"object","clr_type":"Polyphony.PolicyRenegotiationSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyRenegotiationSnapshot"},{"name":"unattended","kind":"object","clr_type":"Polyphony.PolicyUnattendedSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyUnattendedSnapshot"},{"name":"research","kind":"object","clr_type":"Polyphony.PolicyDomainSnapshot","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PolicyDomainSnapshot"}]},"Polyphony.PolicyRenegotiationSnapshot":{"fields":[{"name":"auto_decide","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PolicyRootFallbackSnapshot":{"fields":[{"name":"auto_decide","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PolicyUnattendedSnapshot":{"fields":[{"name":"acceptance_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"review_wait_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"cap_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PolicyValidateResult":{"fields":[{"name":"valid","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"source_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"schema_version","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"errors","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"warnings","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"}]},"Polyphony.PrAssertImplPrCoverageCommit":{"fields":[{"name":"sha","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"subject","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.PrAssertImplPrCoverageResult":{"fields":[{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"impl_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"comparison_base","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_diff_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actual_diff_hash","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"expected_diff_bytes","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actual_diff_bytes","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"impl_branch_commits","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PrAssertImplPrCoverageCommit"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrCheckEvidenceFloorResult":{"fields":[{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"commit_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"body_length","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"passes_floor","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"violations","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrCreateFeatureAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrCreateFeatureResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"description_summary","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrGetCommentsAdoResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"comments","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.AdoPrComment"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeEvidenceAdoResult":{"fields":[{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeEvidenceResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeFeatureAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeImplAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeImplResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeMergeGroupAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergeMergeGroupResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"method","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"delete_branch","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrMergePlanAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"previous_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock_token","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock_released","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"stale_ancestors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"object","element_type_ref":"Polyphony.StaleAncestorEntry"}]},"Polyphony.PrMergePlanPrResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"already_merged","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"merge_commit","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_recorded","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"manifest_pushed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"previous_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock_token","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"lock_released","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"stale_ancestors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"object","element_type_ref":"Polyphony.StaleAncestorEntry"}]},"Polyphony.PrOpenEvidenceAdoResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenEvidenceResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenImplAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenImplResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenMergeGroupAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenMergeGroupResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mg_path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenPlanAdoResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"organization","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"project","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repository","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stale","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requests_parent_change","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ancestor_plan_generations","kind":"map","clr_type":"System.Collections.Generic.IReadOnlyDictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"int"},{"name":"error_code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrOpenPlanPrResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_key","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root_plan","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"created","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"stale","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requests_parent_change","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ancestor_plan_generations","kind":"map","clr_type":"System.Collections.Generic.IReadOnlyDictionary","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"int"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrPollStatusResult":{"fields":[{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"route","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"route_reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_sha","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"base_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"mergeable","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merge_commit_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merged_at","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reviewers","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PrPollReviewer"},{"name":"threads","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PrPollThread"},{"name":"comments","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PrPollComment"},{"name":"author_identity","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"policy","kind":"object","clr_type":"Polyphony.PrPollPolicy","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PrPollPolicy"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"scalar","element_clr_type":"string"},{"name":"metadata","kind":"object","clr_type":"Polyphony.PrPollMetadata?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.PrPollMetadata?"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrPostCommentAdoResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"body","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"posted","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"thread_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"comment_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrValidatePlanDiffResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_sha","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"severity","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requests_parent_change","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"diff_classified","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"self_plan_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"parent_plan_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"ancestor_plan_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"polyphony_state_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"other_files","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PrVoteAdoResult":{"fields":[{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reviewer_id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"vote","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"vote_value","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"submitted","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"repo_slug","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PreflightCheck":{"fields":[{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"passed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"detail","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"remediation","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.PreflightDetails":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado_org","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"ado_project","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.RequirementsDeriveResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"decomposable","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facet_order","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"scalar","element_clr_type":"string"},{"name":"actionable_executor","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"requirement_set","kind":"object","clr_type":"Polyphony.Sdlc.RequirementSet?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"type_ref":"Polyphony.Sdlc.RequirementSet?"},{"name":"errors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"inputs","kind":"object","clr_type":"Polyphony.RequirementsInputProvenance","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.RequirementsInputProvenance"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.RequirementsInputProvenance":{"fields":[{"name":"decomposable","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facet_order","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actionable_executor","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ResetRootResult":{"fields":[{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"success","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"coverage","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"steps_completed","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"steps_failed","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"attempted_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"},{"name":"deleted_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"},{"name":"failed_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.FailedResetTargetDescriptor"},{"name":"remaining_reset_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"},{"name":"blocked_mutated_targets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ResetTargetDescriptor"},{"name":"state_skipped","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ResetTargetDescriptor":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"operation","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.RootResolveResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"resolved_root_id","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"ancestors_walked","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"int"},{"name":"fallback_required","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ScopeCheckResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"in_scope","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ScopeListItem":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ScopeListResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"in_scope_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ScopeListItem"},{"name":"out_of_scope_items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.ScopeListItem"},{"name":"in_scope_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"out_of_scope_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.ScopeMutationResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"changed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags_before","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"tags_after","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Sdlc.CrossItemEdge":{"fields":[{"name":"prerequisite_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"prerequisite_kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dependent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dependent_kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"required_disposition","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"source","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.Sdlc.Requirement":{"fields":[{"name":"kind","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"disposition","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"acceptance_criteria","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.Sdlc.ResolvedRequirementInputs":{"fields":[{"name":"facets","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"facets_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decomposable","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"decomposable_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"facet_order","kind":"list","clr_type":"string[]?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"element_kind":"scalar","element_clr_type":"string"},{"name":"facet_order_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"actionable_executor","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"actionable_executor_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"execution_mode","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"execution_mode_provenance","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"any_inferred","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.SeedError":{"fields":[{"name":"child_id","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"title","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.SeedReconciliation":{"fields":[{"name":"child_id","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"matched_by","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.StalePlanPrDescendant":{"fields":[{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_number","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"pr_url","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_ref","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"head_sha","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"stale_ancestors","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.StaleAncestorEntry"}]},"Polyphony.StateNextReadyResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"work_item_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"requirements","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.Sdlc.Requirement"},{"name":"next","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"fulfilling","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"satisfied","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"needed","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"resolved_inputs","kind":"object","clr_type":"Polyphony.Sdlc.ResolvedRequirementInputs","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.Sdlc.ResolvedRequirementInputs"},{"name":"any_input_inferred","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"observation_reasons","kind":"map","clr_type":"System.Collections.Generic.IReadOnlyDictionary?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true,"key_kind":"scalar","key_clr_type":"string","value_kind":"scalar","value_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatePreflightLiteResult":{"fields":[{"name":"ready","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"summary","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"checks","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PreflightCheck"},{"name":"failed_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.StatePreflightResult":{"fields":[{"name":"ready","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"summary","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"required_checks","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PreflightCheck"},{"name":"advisory_checks","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.PreflightCheck"},{"name":"failed_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"warning_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"details","kind":"object","clr_type":"Polyphony.PreflightDetails","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.PreflightDetails"}]},"Polyphony.StateValidateInputsDiagnostic":{"fields":[{"name":"name","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"required","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"supplied","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"default","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StateValidateInputsResult":{"fields":[{"name":"ready","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"summary","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"action","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"workflow_yaml","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"inputs","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.StateValidateInputsDiagnostic"},{"name":"missing_required_inputs","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"unknown_inputs","kind":"list","clr_type":"string[]","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusAdoSection":{"fields":[{"name":"found","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"title","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"tags","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"in_scope","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_root","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"has_planned_tag","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"children_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusBinarySection":{"fields":[{"name":"version","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"informational_version","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"location","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusFeaturePrSection":{"fields":[{"name":"exists","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"url","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merged_at","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusManifestSection":{"fields":[{"name":"exists","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"feature_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"plan_generations_root","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merged_plan_prs_count","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"merge_groups_count","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"ado","kind":"object","clr_type":"Polyphony.StatusAdoSection","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.StatusAdoSection"},{"name":"manifest","kind":"object","clr_type":"Polyphony.StatusManifestSection","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.StatusManifestSection"},{"name":"feature_pr","kind":"object","clr_type":"Polyphony.StatusFeaturePrSection","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.StatusFeaturePrSection"},{"name":"binary","kind":"object","clr_type":"Polyphony.StatusBinarySection","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"type_ref":"Polyphony.StatusBinarySection"},{"name":"warnings","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.StatusWarning"},{"name":"headline","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"next_action","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.StatusWarning":{"fields":[{"name":"code","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.ValidateResult":{"fields":[{"name":"work_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"event","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_valid","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"message","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"target_state","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"no_op","kind":"scalar","clr_type":"bool?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorkTree":{"fields":[{"name":"epic_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"epic_title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"epic_type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"issues","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorkTreeIssue"}]},"Polyphony.WorkTreeIssue":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"type","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"task_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tasks","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorkTreeTask"}]},"Polyphony.WorkTreeTask":{"fields":[{"name":"id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"title","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"state","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"tags","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.WorklistBatch":{"fields":[{"name":"batch_index","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorklistItem"}]},"Polyphony.WorklistItem":{"fields":[{"name":"item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"parent_item_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_status","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"plan_pr_number","kind":"scalar","clr_type":"int?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"current_generation","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.WorklistResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"items_walked","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"has_conflicts","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"conflicts","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.EdgesCheckConflict"},{"name":"waves","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorklistBatch"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error_code","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeAddResult":{"fields":[{"name":"branch","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"git_ref","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeAssertCleanResult":{"fields":[{"name":"ok","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"expected_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"in_progress_operation","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"dirty_paths","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeCreateResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"outcome","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"slug","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"ref","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"root_root","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"worktree_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeEntry":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"head","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"is_bare","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_detached","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false}]},"Polyphony.WorktreeGcCandidate":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"reason","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"would_remove","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"removed","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeGcResult":{"fields":[{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"runs_root","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"candidates","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorktreeGcCandidate"},{"name":"removed_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"failed_count","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeInitRootResult":{"fields":[{"name":"root_id","kind":"scalar","clr_type":"int","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"root_root","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"runs_root","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"main_worktree_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"worktree_path","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"outcome","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"dry_run","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"reason","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeListResult":{"fields":[{"name":"worktrees","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"object","element_type_ref":"Polyphony.WorktreeEntry"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeRemoveResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"force","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]},"Polyphony.WorktreeStatusResult":{"fields":[{"name":"path","kind":"scalar","clr_type":"string","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"is_clean","kind":"scalar","clr_type":"bool","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false},{"name":"current_branch","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true},{"name":"dirty_paths","kind":"list","clr_type":"System.Collections.Generic.IReadOnlyList","nullable_annotation":"NotAnnotated","ignore_condition":"WhenWritingNull","can_omit_when_null":false,"element_kind":"scalar","element_clr_type":"string"},{"name":"error","kind":"scalar","clr_type":"string?","nullable_annotation":"Annotated","ignore_condition":"WhenWritingNull","can_omit_when_null":true}]}}} \ No newline at end of file