diff --git a/bench/cdeb/freeze/delivery-v4.ts b/bench/cdeb/freeze/delivery-v4.ts new file mode 100644 index 00000000..ebd36609 --- /dev/null +++ b/bench/cdeb/freeze/delivery-v4.ts @@ -0,0 +1,230 @@ +/** + * CDEB-Fresh v4 Stage 0 shipping content-delivery feasibility (G6). + * + * The predecessor asked whether an expected `Record-Id` appeared in the bytes + * the hook forwarded. The v4 estimand discards that question: what has to reach + * the agent is the decision's load-bearing content, and the oldest decisions in + * this corpus have no identifier at all. + * + * So this drives the same shipping surface -- `commitlore inject --hook-input` + * against a real `PreToolUse` edit payload, at the frozen release -- and reads + * the forwarded bytes for content instead: + * + * the ruling, the reason, the right path scope, the current lifecycle + * + * No single one of those is the gate. A substring match alone would pass on a + * record that happens to share a phrase, and the scope probe below is the part + * that can actually fail: a decision scoped to another file must not arrive for + * this one, so an injector that forwarded everything would be caught rather + * than scored as a perfect result. + */ + +import { spawnSync } from "node:child_process"; +import { createHash } from "node:crypto"; + +import { normalizeDecisionText } from "./decision-anchor.ts"; + +export interface DeliveryProbeInput { + readonly candidate_id: string; + readonly repository_id: string; + /** A path the decision's own change touched. */ + readonly in_scope_path: string; + /** A path in the same repository that the decision did not touch. */ + readonly out_of_scope_path: string | null; + readonly ruling: string; + readonly reason: string; + readonly lifecycle: "active" | "superseded" | "withdrawn"; + readonly record_id: string | null; +} + +export interface DeliveryFeasibility { + readonly candidate_id: string; + readonly identity_present: boolean; + readonly record_id: string | null; + readonly ruling_visible: boolean; + readonly reason_visible: boolean; + readonly before_first_mutation: boolean; + readonly scope_correct: boolean; + readonly lifecycle_correct: boolean; + readonly stale_as_current: boolean; + readonly delivered: boolean; + readonly in_scope_payload_bytes: number; + readonly in_scope_payload_sha256: string; + readonly out_of_scope_payload_bytes: number | null; + readonly exit_code: number; + readonly stderr: string; +} + +const sha256 = (value: string): string => createHash("sha256").update(value, "utf8").digest("hex"); + +/** + * `Edit`, not `Read`: the question is whether the decision reaches an agent + * that is about to change the path. A payload the shipping matcher would not + * have selected proves nothing about the arm being measured. + */ +const hookPayload = (path: string): string => + JSON.stringify({ + hook_event_name: "PreToolUse", + tool_name: "Edit", + tool_input: { file_path: path, old_string: "", new_string: "" }, + }); + +export interface InjectResult { + readonly stdout: string; + readonly exitCode: number; + readonly stderr: string; +} + +export const runInject = ( + cliEntry: string, + cwd: string, + path: string, + budget: number, +): InjectResult => { + const result = spawnSync( + process.execPath, + [cliEntry, "inject", "--hook-input", "--budget", String(budget)], + { cwd, input: hookPayload(path), encoding: "utf8", maxBuffer: 16 * 1024 * 1024 }, + ); + return { + stdout: result.stdout ?? "", + // Fail-open is the hook's design, so a non-zero exit is recorded rather + // than thrown: a decision that only arrives when the product errors is not + // delivered either way. + exitCode: result.status ?? -1, + stderr: (result.stderr ?? "").trim(), + }; +}; + +/** + * Whitespace-insensitive containment. The injector re-wraps what it renders, so + * a byte comparison would report a failure that is only a line break -- and a + * word-level comparison would report a success for a paraphrase. + */ +export const containsNormalized = (haystack: string, needle: string): boolean => { + const trimmed = normalizeDecisionText(needle); + if (trimmed.length < 12) return false; + return normalizeDecisionText(haystack).includes(trimmed); +}; + +export const probeDeliveryFeasibility = ( + cliEntry: string, + cwd: string, + input: DeliveryProbeInput, + budget: number, +): DeliveryFeasibility => { + const inScope = runInject(cliEntry, cwd, input.in_scope_path, budget); + const outOfScope = input.out_of_scope_path === null + ? null + : runInject(cliEntry, cwd, input.out_of_scope_path, budget); + + const rulingVisible = containsNormalized(inScope.stdout, input.ruling); + const reasonVisible = containsNormalized(inScope.stdout, input.reason); + // Scope is only demonstrated when the decision arrives here and does not + // arrive for a path it never touched. Without the second half, an injector + // that forwards the whole ledger would score a perfect scope result. + const arrivedOutOfScope = + outOfScope !== null && containsNormalized(outOfScope.stdout, input.ruling); + const scopeCorrect = rulingVisible && !arrivedOutOfScope; + // A superseded decision must not be delivered as though it were current. An + // active one must be delivered. + const staleAsCurrent = input.lifecycle !== "active" && rulingVisible; + const lifecycleCorrect = input.lifecycle === "active" ? rulingVisible : !rulingVisible; + + return { + candidate_id: input.candidate_id, + identity_present: input.record_id !== null, + record_id: input.record_id, + ruling_visible: rulingVisible, + reason_visible: reasonVisible, + // Structural: the payload is a PreToolUse event, which by definition + // precedes the tool call it describes. + before_first_mutation: true, + scope_correct: scopeCorrect, + lifecycle_correct: lifecycleCorrect, + stale_as_current: staleAsCurrent, + delivered: + input.lifecycle === "active" && + rulingVisible && + reasonVisible && + scopeCorrect && + lifecycleCorrect && + !staleAsCurrent, + in_scope_payload_bytes: Buffer.byteLength(inScope.stdout, "utf8"), + in_scope_payload_sha256: sha256(inScope.stdout), + out_of_scope_payload_bytes: + outOfScope === null ? null : Buffer.byteLength(outOfScope.stdout, "utf8"), + exit_code: inScope.exitCode, + stderr: inScope.stderr, + }; +}; + +/** + * The positive control, and the reason it is not optional. + * + * Every field of a `DeliveryFeasibility` row is false when the product answered + * "nothing to deliver" and equally false when the product never ran. The first + * pass of this probe produced 0 delivered out of 207 because the extracted + * release tree had no `node_modules`, so the CLI exited 1 before reading a + * single record -- and the summary read exactly like a finding. + * + * So an injector that never started, or never produced a byte, is an error + * rather than a result. + */ +export const assertInjectorRan = (results: readonly DeliveryFeasibility[]): void => { + if (results.length === 0) return; + const started = results.filter((result) => result.exit_code === 0); + if (started.length === 0) { + const first = results.find((result) => result.stderr !== ""); + throw new Error( + `delivery v4: the shipping injector never exited 0 across ${String(results.length)} probes; this is a harness failure, not zero delivery. First stderr: ${(first?.stderr ?? "none").slice(0, 200)}`, + ); + } + const withPayload = results.filter((result) => result.in_scope_payload_bytes > 0); + if (withPayload.length === 0) { + throw new Error( + `delivery v4: the shipping injector produced an empty payload for every one of ${String(results.length)} probes; a probe that forwarded nothing anywhere cannot distinguish "no record applies" from "the injector is not working"`, + ); + } +}; + +export interface DeliverySummary { + readonly probed: number; + readonly delivered: number; + readonly delivered_with_identity: number; + readonly delivered_without_identity: number; + readonly ruling_visible: number; + readonly reason_visible: number; + readonly scope_correct: number; + readonly stale_as_current: number; +} + +export const summarize = (results: readonly DeliveryFeasibility[]): DeliverySummary => ({ + probed: results.length, + delivered: results.filter((result) => result.delivered).length, + delivered_with_identity: results.filter((result) => result.delivered && result.identity_present).length, + delivered_without_identity: results.filter((result) => result.delivered && !result.identity_present).length, + ruling_visible: results.filter((result) => result.ruling_visible).length, + reason_visible: results.filter((result) => result.reason_visible).length, + scope_correct: results.filter((result) => result.scope_correct).length, + stale_as_current: results.filter((result) => result.stale_as_current).length, +}); + +/** + * The observability claim the Stage 0 verdict depends on: content delivery has + * to be demonstrated for identified and id-less decisions alike. If every + * delivered decision carried an identifier, the study would have shown only + * that the old instrument still works. + */ +export const assertBothIdentityStatesObserved = (results: readonly DeliveryFeasibility[]): void => { + const summary = summarize(results); + const failures: string[] = []; + if (summary.delivered_with_identity === 0) failures.push("no identified decision was delivered"); + if (summary.delivered_without_identity === 0) failures.push("no id-less decision was delivered"); + if (failures.length > 0) { + throw new Error(`delivery v4: content delivery is not demonstrated for both identity states: ${failures.join("; ")}`); + } +}; + +/** The shipping default. Using anything else would measure a configuration nobody ships. */ +export const SHIPPING_TOKEN_BUDGET = 800; diff --git a/bench/cdeb/freeze/provenance-v4.ts b/bench/cdeb/freeze/provenance-v4.ts new file mode 100644 index 00000000..67a0a165 --- /dev/null +++ b/bench/cdeb/freeze/provenance-v4.ts @@ -0,0 +1,338 @@ +/** + * CDEB-Fresh v4 Stage 0 provenance audit (G1 and the mechanical half of G2). + * + * For every enumerated decision this produces the ordinary-source evidence a + * reviewer is allowed to see: the commit's prose with every CommitLore trailer + * and note removed, plus the shape of the change it made. Gold may never be a + * copy of a rendered record, so the packet is what the record would have been + * written from rather than the record itself. + * + * What is decided here is only what a program can decide. Whether the surviving + * prose actually supports the ruling and its reason is a judgment, and it is + * left to the paired reviewers. + */ + +import { createHash } from "node:crypto"; +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { execGit } from "../../../dist/core/git.js"; + +import { assertNoDecisionAnchorExposure } from "./decision-anchor.ts"; +import type { SnapshotEntry, V4CandidateEntry } from "./census-v4.ts"; +import { materializeBundle, type RepositoryBundleIdentity } from "./repository-bundle.ts"; +import { redactCommitMessage } from "./source-packet.ts"; + +export const PROVENANCE_TIERS = ["P1", "P2", "unsupported"] as const; +export type ProvenanceTier = (typeof PROVENANCE_TIERS)[number]; + +export interface ProvenanceAuditEntry { + readonly schema_version: 1; + readonly candidate_id: string; + readonly repository_id: string; + readonly source_commit_sha: string; + readonly decision_audit_anchor: string; + /** Redacted ordinary prose. This is the reviewer's whole evidence base. */ + readonly ordinary_source: string; + readonly ordinary_source_sha256: string; + readonly ordinary_body_chars: number; + readonly ordinary_body_survives: boolean; + readonly removed_trailer_count: number; + /** Lines the second pass took out after the product's redaction ran. */ + readonly residual_record_lines_removed: number; + readonly files_changed: number; + readonly insertions: number; + readonly deletions: number; + readonly changed_paths: readonly string[]; + readonly benchmark_authored: boolean; + readonly provenance_value: string | null; + /** G1 and the mechanical part of G2. The judgment part stays undecided. */ + readonly g1_natural_provenance: boolean; + readonly g2_mechanical: boolean; + readonly mechanical_exclusion: string | null; + readonly provenance_tier: ProvenanceTier | "pending"; +} + +const sha256 = (value: string): string => createHash("sha256").update(value, "utf8").digest("hex"); + +const bundleIdentityFor = (snapshot: SnapshotEntry): RepositoryBundleIdentity => ({ + repository_id: snapshot.repository_id, + bundle_sha256: snapshot.bundle_sha256, + snapshot_commit: snapshot.snapshot_commit, + snapshot_tree_oid: snapshot.snapshot_tree_oid, + refs_digest: snapshot.refs_digest, + notes_ref_digest: snapshot.notes_ref_digest, + refs_included: snapshot.refs_included, + notes_refs_included: snapshot.notes_refs_included, +}); + +const numstat = (cwd: string, sha: string): { files: number; insertions: number; deletions: number; paths: string[] } => { + const result = execGit(["show", "--pretty=format:", "--numstat", "--end-of-options", sha], { cwd }); + if (result.code !== 0) return { files: 0, insertions: 0, deletions: 0, paths: [] }; + let insertions = 0; + let deletions = 0; + const paths: string[] = []; + for (const line of result.stdout.split("\n")) { + const parts = line.split("\t"); + if (parts.length < 3) continue; + // A binary file reports "-" for both counts; it still changed. + insertions += Number.parseInt(parts[0] ?? "0", 10) || 0; + deletions += Number.parseInt(parts[1] ?? "0", 10) || 0; + const path = (parts[2] ?? "").trim(); + if (path !== "") paths.push(path); + } + return { files: paths.length, insertions, deletions, paths: [...new Set(paths)].sort() }; +}; + +const bodyOf = (cwd: string, sha: string): string => { + const result = execGit(["show", "-s", "--format=%B", "--end-of-options", sha], { cwd }); + if (result.code !== 0) throw new Error(`provenance v4: cannot read commit ${sha}: ${result.stderr.trim()}`); + return result.stdout; +}; + +/** + * A record whose provenance the product itself calls reconstructed was minted + * by tooling rather than written when the decision was made. ADR-0014 refuses + * that identity, and a benchmark built on it would be measuring its own + * backfill. + */ +const isBenchmarkAuthored = (candidate: V4CandidateEntry): boolean => + candidate.provenance_value === "reconstructed" || candidate.provenance_value === "migrated"; + + +/** + * A second redaction pass, and the reason it exists. + * + * The product's redaction rebuilds the ordinary trailer tail from Git's own + * parse, which deliberately does not treat a `Ruled-out:` sentence in prose as + * a record. That is right for the product and wrong here: a squashed commit + * embeds whole commit messages, indented, and Git does not see their trailers + * either. Two candidates' packets carried a complete record -- including the + * ruling a Stage A reviewer must be blind to -- and eleven carried at least one + * CommitLore line. + * + * The bias is deliberately the other way for a blind evidence packet. Removing + * a prose sentence that merely looks like a trailer costs a sentence; leaving a + * record in costs the answer. + */ +export const COMMITLORE_KEY_LINE = + /^[ \t]*(?:Ruled-out|Record-Id|Provenance|CommitLore-Version|Limit|Warn|Evidence|Blast|Undo|Certainty|Supersedes|Lifecycle|Expires|Verified|Scope|Deciders|Confidence)[ \t]*:/; + +export interface SecondPassResult { + readonly text: string; + readonly removedLines: number; +} + +export const stripEmbeddedRecordLines = (text: string): SecondPassResult => { + const lines = text.split("\n"); + const kept: string[] = []; + let removed = 0; + let dropping = false; + for (const line of lines) { + if (COMMITLORE_KEY_LINE.test(line)) { + dropping = true; + removed += 1; + continue; + } + // A folded continuation belongs to the line above it, so it goes too. + if (dropping && /^[ \t]+\S/.test(line) && line.trim() !== "") { + removed += 1; + continue; + } + dropping = false; + kept.push(line); + } + return { text: kept.join("\n").replace(/\n{3,}/gu, "\n\n"), removedLines: removed }; +}; + +/** + * The packet must not contain a CommitLore key line at all. This is checked + * after the second pass rather than trusted from it: the first pass looked + * clean too. + */ +export const assertPacketHasNoRecordLines = (entries: readonly ProvenanceAuditEntry[]): void => { + for (const entry of entries) { + const offending = entry.ordinary_source.split("\n").filter((line) => COMMITLORE_KEY_LINE.test(line)); + if (offending.length > 0) { + throw new Error( + `provenance v4: packet for ${entry.candidate_id} still carries ${String(offending.length)} CommitLore line(s), first: ${offending[0]!.trim().slice(0, 60)}`, + ); + } + } +}; + +export const auditRepository = ( + cwd: string, + snapshot: SnapshotEntry, + candidates: readonly V4CandidateEntry[], +): ProvenanceAuditEntry[] => { + const bodies = new Map(); + const stats = new Map>(); + const entries: ProvenanceAuditEntry[] = []; + for (const candidate of candidates) { + if (candidate.repository_id !== snapshot.repository_id) { + throw new Error(`provenance v4: candidate ${candidate.candidate_id} is not from ${snapshot.repository_id}`); + } + let body = bodies.get(candidate.source_commit_sha); + if (body === undefined) { + body = bodyOf(cwd, candidate.source_commit_sha); + bodies.set(candidate.source_commit_sha, body); + } + let stat = stats.get(candidate.source_commit_sha); + if (stat === undefined) { + stat = numstat(cwd, candidate.source_commit_sha); + stats.set(candidate.source_commit_sha, stat); + } + const firstPass = redactCommitMessage(cwd, body); + const secondPass = stripEmbeddedRecordLines(firstPass.text); + const redacted = { + text: secondPass.text, + ordinaryBodySurvives: firstPass.ordinaryBodySurvives && secondPass.text.split("\n").slice(1).some((line) => line.trim() !== ""), + removedTrailerCount: firstPass.removedTrailerCount, + }; + const benchmarkAuthored = isBenchmarkAuthored(candidate); + const g1 = candidate.pre_cutoff && !benchmarkAuthored; + const g2Mechanical = redacted.ordinaryBodySurvives && stat.files > 0; + const exclusion = benchmarkAuthored + ? "benchmark-authored" + : !redacted.ordinaryBodySurvives + ? "source-packet-empty" + : stat.files === 0 + ? "scope-unresolvable" + : null; + entries.push({ + schema_version: 1, + candidate_id: candidate.candidate_id, + repository_id: candidate.repository_id, + source_commit_sha: candidate.source_commit_sha, + decision_audit_anchor: candidate.decision_audit_anchor, + ordinary_source: redacted.text, + ordinary_source_sha256: sha256(redacted.text), + ordinary_body_chars: redacted.text.length, + ordinary_body_survives: redacted.ordinaryBodySurvives, + removed_trailer_count: redacted.removedTrailerCount, + residual_record_lines_removed: secondPass.removedLines, + files_changed: stat.files, + insertions: stat.insertions, + deletions: stat.deletions, + changed_paths: stat.paths, + benchmark_authored: benchmarkAuthored, + provenance_value: candidate.provenance_value, + g1_natural_provenance: g1, + g2_mechanical: g2Mechanical, + mechanical_exclusion: exclusion, + provenance_tier: exclusion === null ? "pending" : "unsupported", + }); + } + return entries; +}; + +/** + * The redacted packet is the reviewer's evidence, so it must not carry the + * benchmark's own key. Nothing writes the anchor into it, and this is the check + * that keeps that true rather than assumed. + */ +export const assertPacketsCarryNoAnchor = (entries: readonly ProvenanceAuditEntry[]): void => { + for (const entry of entries) { + assertNoDecisionAnchorExposure( + entry.ordinary_source, + [entry.decision_audit_anchor], + `ordinary source for ${entry.candidate_id}`, + ); + } +}; + +/** + * The redaction has to have removed something for at least the record-backed + * decisions, or it is silently inert and every "no leak" result below means + * nothing. Ordinary-source candidates legitimately have no trailer to remove. + */ +export const assertRedactionDidWork = ( + entries: readonly ProvenanceAuditEntry[], + recordBackedIds: ReadonlySet, +): void => { + const recordBacked = entries.filter((entry) => recordBackedIds.has(entry.candidate_id)); + if (recordBacked.length === 0) return; + const redacted = recordBacked.filter((entry) => entry.removed_trailer_count > 0); + if (redacted.length === 0) { + throw new Error( + "provenance v4: no CommitLore trailer was removed from any record-backed candidate; the redaction is inert", + ); + } +}; + +export interface RunProvenanceOptions { + readonly studyRoot: string; +} + +export const runProvenanceAudit = (options: RunProvenanceOptions): ProvenanceAuditEntry[] => { + const studyRoot = resolve(options.studyRoot); + const snapshots = JSON.parse(readFileSync(join(studyRoot, "corpus", "snapshots.json"), "utf8")) as { + repositories: readonly SnapshotEntry[]; + }; + const candidates = readFileSync(join(studyRoot, "feasibility", "candidate-census.jsonl"), "utf8") + .split("\n") + .filter((line) => line.trim() !== "") + .map((line) => JSON.parse(line) as V4CandidateEntry); + + const entries: ProvenanceAuditEntry[] = []; + for (const snapshot of snapshots.repositories) { + const mine = candidates.filter((candidate) => candidate.repository_id === snapshot.repository_id); + if (mine.length === 0) continue; + const root = mkdtempSync(join(tmpdir(), "cdeb-v4-provenance-")); + try { + const repository = join(root, "repository"); + materializeBundle( + bundleIdentityFor(snapshot), + join(studyRoot, "corpus", snapshot.bundle_path), + repository, + ); + entries.push(...auditRepository(repository, snapshot, mine)); + } finally { + rmSync(root, { recursive: true, force: true }); + } + } + assertPacketsCarryNoAnchor(entries); + assertPacketHasNoRecordLines(entries); + assertRedactionDidWork( + entries, + new Set(candidates.filter((candidate) => candidate.storage_kind !== "ordinary-source").map((candidate) => candidate.candidate_id)), + ); + return entries; +}; + +const main = (argv: readonly string[]): void => { + const index = argv.indexOf("--study-root"); + const studyRoot = index >= 0 ? argv[index + 1] : undefined; + if (studyRoot === undefined) throw new Error("provenance v4: --study-root is required"); + const entries = runProvenanceAudit({ studyRoot }); + writeFileSync( + join(resolve(studyRoot), "feasibility", "provenance-audit.jsonl"), + `${entries.map((entry) => JSON.stringify(entry)).join("\n")}\n`, + ); + const byRepository = new Map(); + for (const entry of entries) { + const list = byRepository.get(entry.repository_id) ?? []; + list.push(entry); + byRepository.set(entry.repository_id, list); + } + for (const [repository, list] of [...byRepository].sort()) { + const passed = list.filter((entry) => entry.mechanical_exclusion === null).length; + const empty = list.filter((entry) => entry.mechanical_exclusion === "source-packet-empty").length; + const authored = list.filter((entry) => entry.mechanical_exclusion === "benchmark-authored").length; + const scope = list.filter((entry) => entry.mechanical_exclusion === "scope-unresolvable").length; + process.stdout.write( + `${repository.padEnd(22)} audited ${String(list.length).padStart(4)}` + + ` mechanical-pass ${String(passed).padStart(4)}` + + ` empty-packet ${String(empty).padStart(3)}` + + ` benchmark-authored ${String(authored).padStart(3)}` + + ` no-scope ${String(scope).padStart(3)}\n`, + ); + } +}; + +if (process.argv[1] !== undefined && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + main(process.argv.slice(2)); +} diff --git a/bench/cdeb/freeze/qualify-v4.ts b/bench/cdeb/freeze/qualify-v4.ts new file mode 100644 index 00000000..7c843731 --- /dev/null +++ b/bench/cdeb/freeze/qualify-v4.ts @@ -0,0 +1,564 @@ +/** + * CDEB-Fresh v4 Stage 0 qualification and the GO/HOLD arithmetic. + * + * Every gate arrives here already decided -- mechanically, by two agreeing + * reviewers, or by an adjudicator -- and this module only combines them. It + * combines them one way: a candidate qualifies when every gate passed, and an + * unresolved gate is a failure rather than a missing value to be filled in + * later. That is the whole reason the merge is separate from the review. + */ + +import { readFileSync, writeFileSync } from "node:fs"; +import { join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +import type { V4CandidateEntry } from "./census-v4.ts"; +import type { ProvenanceAuditEntry } from "./provenance-v4.ts"; +import type { StageAVerdict, StageBVerdict } from "./review-v4.ts"; +import type { DeliveryFeasibility } from "./delivery-v4.ts"; + +export const GATES = ["G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"] as const; +export type Gate = (typeof GATES)[number]; + +export type GateSource = "mechanical" | "agreed" | "adjudicated" | "unresolved" | "unavailable"; + +export interface GateOutcome { + readonly passed: boolean; + readonly source: GateSource; +} + +export interface QualificationEntry { + readonly schema_version: 1; + readonly study_id: "cdeb-fresh-v4"; + readonly candidate_id: string; + readonly repository_id: string; + readonly decision_audit_anchor: string; + readonly identity_present: boolean; + readonly record_id: string | null; + readonly protocol_version: string | null; + readonly lifecycle: string; + readonly storage_kind: string; + readonly gates: Readonly>; + readonly quote_overlap: number | null; + readonly qualified: boolean; + readonly exclusion_code: string | null; + readonly provenance_tier: "P1" | "P2" | "unsupported"; +} + +const STOPWORDS = new Set([ + "the", "a", "an", "and", "or", "of", "to", "in", "on", "for", "with", "that", "this", + "it", "is", "was", "were", "be", "been", "as", "at", "by", "from", "into", "would", + "could", "not", "no", "but", "so", "than", "then", "its", "their", "our", "we", +]); + +/** + * Content-word overlap between a reviewer's blind quote and the recorded ruling. + * + * A reviewer can find *a* rejected alternative in a commit that ruled out + * three, and G2 asks whether *this* decision is recoverable. So the quote is + * compared to this candidate's own ruling, the fraction is published per + * candidate, and the floor it is compared against is named in the + * preregistration refinement as well as here -- a reader who disagrees with the + * floor can apply another one to the same published numbers. + */ +export const quoteOverlap = (quote: string, ruling: string): number => { + const words = (value: string): Set => + new Set( + value + .toLowerCase() + .replace(/[^\p{L}\p{N}\s-]/gu, " ") + .split(/\s+/u) + .filter((word) => word.length > 2 && !STOPWORDS.has(word)), + ); + const left = words(quote); + const right = words(ruling); + if (left.size === 0 || right.size === 0) return 0; + let shared = 0; + for (const word of right) if (left.has(word)) shared += 1; + return shared / right.size; +}; + +/** The refinement recorded in deviations.jsonl before any merged count existed. */ +export const QUOTE_OVERLAP_FLOOR = 0.34; + +/** + * Two blind reviewers, and a third blind vote where they split. + * + * The third vote is a vote, not an override: it is asked the same question from + * the same evidence, in a fresh session, and the majority of three decides. An + * adjudicator who already knows how the pair voted cannot be blind, and the + * study operator adjudicating their own corpus is the least blind reader + * available. Where no third vote exists the gate fails closed and stays visible + * as a disagreement. + */ +const pairGate = ( + left: boolean | undefined, + right: boolean | undefined, + third?: boolean, +): GateOutcome => { + if (left === undefined || right === undefined) return { passed: false, source: "unavailable" }; + if (left === right) return { passed: left, source: "agreed" }; + if (third === undefined) return { passed: false, source: "unresolved" }; + return { passed: third, source: "adjudicated" }; +}; + +export interface MergeInputs { + readonly candidates: readonly V4CandidateEntry[]; + readonly audit: readonly ProvenanceAuditEntry[]; + /** `r3` is present only where the pair split; it is a third blind vote, not an override. */ + readonly stageA: ReadonlyMap; + readonly stageB: ReadonlyMap; + readonly delivery: ReadonlyMap; + readonly rulings: ReadonlyMap; +} + +export const mergeQualification = (inputs: MergeInputs): QualificationEntry[] => { + const auditById = new Map(inputs.audit.map((entry) => [entry.candidate_id, entry])); + return inputs.candidates.map((candidate) => { + const audit = auditById.get(candidate.candidate_id); + const stageA = inputs.stageA.get(candidate.candidate_id); + const stageB = inputs.stageB.get(candidate.candidate_id); + const delivery = inputs.delivery.get(candidate.candidate_id); + const ruling = inputs.rulings.get(candidate.candidate_id); + + const g8: GateOutcome = { + passed: !candidate.ineligibility_codes.includes("legacy-exclusion-match"), + source: "mechanical", + }; + const g1: GateOutcome = { + passed: audit?.g1_natural_provenance === true, + source: audit === undefined ? "unavailable" : "mechanical", + }; + + let overlap: number | null = null; + let g2: GateOutcome = { passed: false, source: "unavailable" }; + if (audit !== undefined && audit.mechanical_exclusion !== null) { + g2 = { passed: false, source: "mechanical" }; + } else if (stageA !== undefined && ruling !== undefined) { + const votes = [stageA.r1, stageA.r2, ...(stageA.r3 === undefined ? [] : [stageA.r3])]; + const found = pairGate( + stageA.r1.states_rejected_alternative, + stageA.r2.states_rejected_alternative, + stageA.r3?.states_rejected_alternative, + ); + overlap = Math.max(...votes.map((vote) => quoteOverlap(vote.quoted_alternative, ruling.ruling))); + g2 = found.passed + ? { passed: overlap >= QUOTE_OVERLAP_FLOOR, source: found.source } + : found; + } + + const g3 = pairGate(stageB?.r1.g3_reason_hidden_from_code, stageB?.r2.g3_reason_hidden_from_code, stageB?.r3?.g3_reason_hidden_from_code); + const g4 = pairGate(stageB?.r1.g4_wrong_path_functionally_viable, stageB?.r2.g4_wrong_path_functionally_viable, stageB?.r3?.g4_wrong_path_functionally_viable); + const g5 = pairGate(stageB?.r1.g5_oracle_deterministic, stageB?.r2.g5_oracle_deterministic, stageB?.r3?.g5_oracle_deterministic); + const g7 = pairGate(stageB?.r1.g7_bounded_task_feasible, stageB?.r2.g7_bounded_task_feasible, stageB?.r3?.g7_bounded_task_feasible); + const g6: GateOutcome = { + passed: delivery?.delivered === true, + source: delivery === undefined ? "unavailable" : "mechanical", + }; + + const gates: Record = { G1: g1, G2: g2, G3: g3, G4: g4, G5: g5, G6: g6, G7: g7, G8: g8 }; + const qualified = GATES.every((gate) => gates[gate].passed); + return { + schema_version: 1, + study_id: "cdeb-fresh-v4", + candidate_id: candidate.candidate_id, + repository_id: candidate.repository_id, + decision_audit_anchor: candidate.decision_audit_anchor, + identity_present: candidate.identity_present, + record_id: candidate.record_id, + protocol_version: candidate.protocol_version, + lifecycle: candidate.lifecycle, + storage_kind: candidate.storage_kind, + gates, + quote_overlap: overlap, + qualified, + exclusion_code: qualified ? null : firstFailure(gates, audit, candidate), + // Provenance only, not overall qualification: a candidate with independent + // ordinary-source support that fails the delivery gate still has that + // support, and calling it "unsupported" would misreport where it failed. + // P2 is the owner-attested tier; Stage 0 collected no owner testimony, so + // nothing here is P2 and the field records that rather than a choice. + provenance_tier: g1.passed && g2.passed ? "P1" : "unsupported", + }; + }); +}; + +const GATE_CODES: Readonly> = { + G1: "benchmark-authored", + G2: "insufficient-provenance", + G3: "reason-obvious-from-code", + G4: "wrong-path-not-functionally-viable", + G5: "oracle-not-deterministic", + G6: "shipping-content-not-observable", + G7: "task-not-bounded", + G8: "legacy-exclusion-match", +}; + +const firstFailure = ( + gates: Readonly>, + audit: ProvenanceAuditEntry | undefined, + candidate: V4CandidateEntry, +): string => { + if (candidate.ineligibility_codes.length > 0) return candidate.ineligibility_codes[0]!; + if (audit?.mechanical_exclusion !== null && audit?.mechanical_exclusion !== undefined) return audit.mechanical_exclusion; + for (const gate of GATES) { + if (!gates[gate].passed) { + return gates[gate].source === "unresolved" ? `${GATE_CODES[gate]}-unresolved` : GATE_CODES[gate]; + } + } + return "unknown"; +}; + +export interface RepositorySummary { + readonly repository_id: string; + readonly raw_decisions: number; + readonly provenance_pass: number; + readonly hidden_rationale_pass: number; + readonly wrong_path_viable: number; + readonly oracle_feasible: number; + readonly shipping_delivery_feasible: number; + readonly bounded: number; + readonly final_qualified: number; + readonly qualified_with_identity: number; + readonly qualified_without_identity: number; + readonly eligible: boolean; +} + +/** Registered before the census ran; taken unchanged from the owner's Stage 0 PRD. */ +export const GO_THRESHOLDS = { + minEligibleRepositories: 3, + minQualifiedPerRepository: 12, + minTotalQualified: 48, +} as const; + +export const summarizeRepositories = ( + entries: readonly QualificationEntry[], +): RepositorySummary[] => { + const byRepository = new Map(); + for (const entry of entries) { + const list = byRepository.get(entry.repository_id) ?? []; + list.push(entry); + byRepository.set(entry.repository_id, list); + } + return [...byRepository.entries()] + .sort(([left], [right]) => left.localeCompare(right)) + .map(([repository_id, list]) => { + const qualified = list.filter((entry) => entry.qualified); + return { + repository_id, + raw_decisions: list.length, + provenance_pass: list.filter((entry) => entry.gates.G1.passed && entry.gates.G2.passed).length, + hidden_rationale_pass: list.filter((entry) => entry.gates.G3.passed).length, + wrong_path_viable: list.filter((entry) => entry.gates.G4.passed).length, + oracle_feasible: list.filter((entry) => entry.gates.G5.passed).length, + shipping_delivery_feasible: list.filter((entry) => entry.gates.G6.passed).length, + bounded: list.filter((entry) => entry.gates.G7.passed).length, + final_qualified: qualified.length, + qualified_with_identity: qualified.filter((entry) => entry.identity_present).length, + qualified_without_identity: qualified.filter((entry) => !entry.identity_present).length, + eligible: qualified.length >= GO_THRESHOLDS.minQualifiedPerRepository, + }; + }); +}; + +export interface Stage0Verdict { + readonly verdict: "GO" | "HOLD"; + readonly eligible_repositories: number; + readonly total_qualified: number; + readonly recommended_fixed_set: readonly string[]; + readonly unmet: readonly string[]; + readonly delivery_observable_with_identity: boolean; + readonly delivery_observable_without_identity: boolean; +} + +/** + * The verdict is a lookup against thresholds fixed before the counts existed. + * Nothing here is allowed to relax on the way past: a threshold that moves when + * the count is short is not a threshold. + */ +export const decideStage0 = ( + summaries: readonly RepositorySummary[], + entries: readonly QualificationEntry[], +): Stage0Verdict => { + const eligible = summaries.filter((summary) => summary.eligible); + const totalQualified = summaries.reduce((sum, summary) => sum + summary.final_qualified, 0); + const qualified = entries.filter((entry) => entry.qualified); + const withIdentity = qualified.some((entry) => entry.identity_present); + const withoutIdentity = qualified.some((entry) => !entry.identity_present); + const unmet: string[] = []; + if (eligible.length < GO_THRESHOLDS.minEligibleRepositories) { + unmet.push(`eligible repositories ${String(eligible.length)} < ${String(GO_THRESHOLDS.minEligibleRepositories)}`); + } + if (totalQualified < GO_THRESHOLDS.minTotalQualified) { + unmet.push(`total qualified ${String(totalQualified)} < ${String(GO_THRESHOLDS.minTotalQualified)}`); + } + if (!withIdentity) unmet.push("no identified decision qualified, so delivery observability is not demonstrated for both identity states"); + if (!withoutIdentity) unmet.push("no id-less decision qualified, so the estimand change is not demonstrated"); + return { + verdict: unmet.length === 0 ? "GO" : "HOLD", + eligible_repositories: eligible.length, + total_qualified: totalQualified, + recommended_fixed_set: eligible.map((summary) => summary.repository_id), + unmet, + delivery_observable_with_identity: withIdentity, + delivery_observable_without_identity: withoutIdentity, + }; +}; + +export interface AgreementSummary { + readonly gate: string; + readonly compared: number; + readonly agreed: number; + readonly rate: number; +} + +/** + * Reported per gate, not as one number. A pair that agrees on an easy gate and + * splits on the hard one has a respectable average and no useful reliability. + */ +export const agreementByGate = (entries: readonly QualificationEntry[]): AgreementSummary[] => + (["G2", "G3", "G4", "G5", "G7"] as const).map((gate) => { + const decided = entries.filter((entry) => + ["agreed", "unresolved", "adjudicated"].includes(entry.gates[gate].source), + ); + const agreed = decided.filter((entry) => entry.gates[gate].source === "agreed").length; + return { gate, compared: decided.length, agreed, rate: decided.length === 0 ? 0 : agreed / decided.length }; + }); + +export interface ReviewRow { + readonly candidate_id: string; + readonly reviewer: "reviewer-1" | "reviewer-2" | "reviewer-3"; +} + +export type StageARow = ReviewRow & Omit; +export type StageBRow = ReviewRow & Omit; + +const byReviewer = ( + rows: readonly T[], + build: (row: T) => V, +): Map => { + const map = new Map(); + for (const row of rows) { + const slot = map.get(row.candidate_id) ?? {}; + if (row.reviewer === "reviewer-1") slot.r1 = build(row); + else if (row.reviewer === "reviewer-2") slot.r2 = build(row); + else slot.r3 = build(row); + map.set(row.candidate_id, slot); + } + const complete = new Map(); + for (const [id, slot] of map) { + // A candidate seen by only one reviewer is not a paired review, and + // treating it as one would give a single opinion the authority of two. + if (slot.r1 === undefined || slot.r2 === undefined) continue; + complete.set(id, slot.r3 === undefined ? { r1: slot.r1, r2: slot.r2 } : { r1: slot.r1, r2: slot.r2, r3: slot.r3 }); + } + return complete; +}; + +export const stageAIndex = (rows: readonly StageARow[]): Map => + byReviewer(rows, (row) => ({ + candidate_id: row.candidate_id, + states_rejected_alternative: row.states_rejected_alternative, + quoted_alternative: row.quoted_alternative, + quoted_reason: row.quoted_reason, + note: row.note, + })); + +export const stageBIndex = (rows: readonly StageBRow[]): Map => + byReviewer(rows, (row) => ({ + candidate_id: row.candidate_id, + g3_reason_hidden_from_code: row.g3_reason_hidden_from_code, + g4_wrong_path_functionally_viable: row.g4_wrong_path_functionally_viable, + g5_oracle_deterministic: row.g5_oracle_deterministic, + g7_bounded_task_feasible: row.g7_bounded_task_feasible, + note: row.note, + })); + +/** + * The Stage 0 merge, run from the artifacts on disk. + * + * Everything it reads is a committed study artifact, so the verdict can be + * recomputed by anyone holding this repository -- the reviewers' raw verdicts + * included. A GO or HOLD that only its author can reproduce is not a result. + */ +/** + * How often the two reviewers, having both found a rejection, quoted the same + * span of text. + * + * It is not a quality measure. It measures how independent the pair actually + * was: two models of one family that converge on the same sentence are two + * readings of one habit, and the agreement rate has to be read in that light. + */ +export const quoteConcordance = ( + stageA: ReadonlyMap, +): { pairs: number; mean_jaccard: number; near_identical: number } => { + const tokens = (value: string): Set => + new Set( + value + .toLowerCase() + .replace(/[^\p{L}\p{N}\s-]/gu, " ") + .split(/\s+/u) + .filter((word) => word.length > 2 && !STOPWORDS.has(word)), + ); + let pairs = 0; + let total = 0; + let nearIdentical = 0; + for (const { r1, r2 } of stageA.values()) { + if (!r1.states_rejected_alternative || !r2.states_rejected_alternative) continue; + const left = tokens(r1.quoted_alternative); + const right = tokens(r2.quoted_alternative); + if (left.size === 0 && right.size === 0) continue; + const shared = [...left].filter((word) => right.has(word)).length; + const jaccard = shared / (left.size + right.size - shared); + pairs += 1; + total += jaccard; + if (jaccard > 0.9) nearIdentical += 1; + } + return { pairs, mean_jaccard: pairs === 0 ? 0 : total / pairs, near_identical: nearIdentical }; +}; + +/** + * How many candidates G2 would pass at other floors. + * + * The floor was fixed before any overlap was computed, which stops the count + * choosing the method -- but it does not make the choice weightless. An + * adversarial review of this result showed the correspondence rule does most of + * the work separating 159 pairs that found *a* rejection from 17 that matched + * this one, so the sensitivity is published rather than left for a reader to + * recompute. + */ +export const OVERLAP_SENSITIVITY_FLOORS = [0.2, 0.25, 0.3, 0.333, 0.34, 0.4, 0.5] as const; + +export const overlapSensitivity = ( + entries: readonly QualificationEntry[], +): { floor: number; would_pass: number }[] => + OVERLAP_SENSITIVITY_FLOORS.map((floor) => ({ + floor, + would_pass: entries.filter((entry) => entry.quote_overlap !== null && entry.quote_overlap >= floor).length, + })); + +export interface RunQualificationOptions { + readonly studyRoot: string; +} + +export interface QualificationOutput { + readonly entries: readonly QualificationEntry[]; + readonly repositories: readonly RepositorySummary[]; + readonly verdict: Stage0Verdict; + readonly agreement: readonly AgreementSummary[]; + readonly concordance: { pairs: number; mean_jaccard: number; near_identical: number }; + readonly sensitivity: { floor: number; would_pass: number }[]; +} + +export const runQualification = (options: RunQualificationOptions): QualificationOutput => { + const root = resolve(options.studyRoot); + const readRows = (name: string): T[] => + readFileSync(join(root, "feasibility", name), "utf8") + .split("\n") + .filter((line) => line.trim() !== "") + .map((line) => JSON.parse(line) as T); + + const candidates = readRows("candidate-census.jsonl"); + const audit = readRows("provenance-audit.jsonl"); + const delivery = new Map( + readRows("delivery-feasibility.jsonl").map((row) => [row.candidate_id, row]), + ); + const rulings = new Map( + readRows<{ candidate_id: string; ruling: string; reason: string }>("rulings.jsonl").map((row) => [ + row.candidate_id, + { ruling: row.ruling, reason: row.reason }, + ]), + ); + const stageA = stageAIndex(readRows("review-stage-a.jsonl")); + const entries = mergeQualification({ + candidates, + audit, + stageA, + stageB: stageBIndex(readRows("review-stage-b.jsonl")), + delivery, + rulings, + }); + const repositories = summarizeRepositories(entries); + return { + entries, + repositories, + verdict: decideStage0(repositories, entries), + agreement: agreementByGate(entries), + concordance: quoteConcordance(stageA), + sensitivity: overlapSensitivity(entries), + }; +}; + +const main = (argv: readonly string[]): void => { + const index = argv.indexOf("--study-root"); + const studyRoot = index >= 0 ? argv[index + 1] : undefined; + if (studyRoot === undefined) throw new Error("qualify v4: --study-root is required"); + const root = resolve(studyRoot); + const output = runQualification({ studyRoot: root }); + writeFileSync( + join(root, "feasibility", "qualification.jsonl"), + `${output.entries.map((entry) => JSON.stringify(entry)).join("\n")}\n`, + ); + writeFileSync( + join(root, "feasibility", "repository-summary.json"), + `${JSON.stringify({ schema_version: 1, study_id: "cdeb-fresh-v4", thresholds: GO_THRESHOLDS, repositories: output.repositories }, null, 2)}\n`, + ); + writeFileSync( + join(root, "feasibility", "qualification-summary.json"), + `${JSON.stringify( + { + schema_version: 1, + study_id: "cdeb-fresh-v4", + measured_product_effect_rows: 0, + thresholds: GO_THRESHOLDS, + verdict: output.verdict, + reviewer_agreement_by_gate: output.agreement, + reviewer_quote_concordance: output.concordance, + quote_overlap_floor: QUOTE_OVERLAP_FLOOR, + quote_overlap_sensitivity: output.sensitivity, + exclusion_reasons: exclusionCounts(output.entries), + identity_composition: identityCounts(output.entries), + }, + null, + 2, + )}\n`, + ); + for (const repository of output.repositories) { + process.stdout.write( + `${repository.repository_id.padEnd(22)} raw ${String(repository.raw_decisions).padStart(4)}` + + ` prov ${String(repository.provenance_pass).padStart(3)}` + + ` hidden ${String(repository.hidden_rationale_pass).padStart(3)}` + + ` viable ${String(repository.wrong_path_viable).padStart(3)}` + + ` oracle ${String(repository.oracle_feasible).padStart(3)}` + + ` delivery ${String(repository.shipping_delivery_feasible).padStart(3)}` + + ` bounded ${String(repository.bounded).padStart(3)}` + + ` qualified ${String(repository.final_qualified).padStart(3)}` + + `${repository.eligible ? " ELIGIBLE" : ""}\n`, + ); + } + process.stdout.write(`${JSON.stringify(output.verdict, null, 1)}\n`); +}; + +export const exclusionCounts = (entries: readonly QualificationEntry[]): Record => { + const counts: Record = {}; + for (const entry of entries) { + if (entry.exclusion_code === null) continue; + counts[entry.exclusion_code] = (counts[entry.exclusion_code] ?? 0) + 1; + } + return Object.fromEntries(Object.entries(counts).sort(([, left], [, right]) => right - left)); +}; + +export const identityCounts = (entries: readonly QualificationEntry[]): Record => { + const qualified = entries.filter((entry) => entry.qualified); + return { + qualified_total: qualified.length, + qualified_with_identity: qualified.filter((entry) => entry.identity_present).length, + qualified_without_identity: qualified.filter((entry) => !entry.identity_present).length, + enumerated_with_identity: entries.filter((entry) => entry.identity_present).length, + enumerated_without_identity: entries.filter((entry) => !entry.identity_present).length, + }; +}; + +if (process.argv[1] !== undefined && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + main(process.argv.slice(2)); +} diff --git a/bench/cdeb/freeze/review-v4.ts b/bench/cdeb/freeze/review-v4.ts new file mode 100644 index 00000000..a5bfe7d2 --- /dev/null +++ b/bench/cdeb/freeze/review-v4.ts @@ -0,0 +1,252 @@ +/** + * CDEB-Fresh v4 Stage 0 adjudicated review. + * + * Three of the qualification gates are readings, not computations, and the + * preregistration answers them with paired reviewers who are blind to each + * other and, where possible, from different model families. This module builds + * what those reviewers see, checks what they return, and merges two verdicts + * into one with the disagreement preserved rather than averaged away. + * + * Two evidence sets, because two questions cannot share one: + * + * Stage A asks whether the ruling is recoverable from ordinary source. The + * reviewer must therefore never see the ruling, or the question answers + * itself. + * + * Stage B asks whether the rejected path is hidden, viable and bounded. That + * cannot be judged without the ruling, so Stage B sees it. + */ + +import { createHash } from "node:crypto"; +import { readFileSync } from "node:fs"; + +import type { V4CandidateEntry } from "./census-v4.ts"; +import type { ProvenanceAuditEntry } from "./provenance-v4.ts"; + +export const REVIEW_STAGES = ["A", "B"] as const; +export type ReviewStage = (typeof REVIEW_STAGES)[number]; + +export interface StageAItem { + readonly candidate_id: string; + readonly repository_id: string; + readonly changed_paths: readonly string[]; + readonly files_changed: number; + readonly insertions: number; + readonly deletions: number; + readonly ordinary_source: string; +} + +export interface StageBItem extends StageAItem { + readonly ruling: string; + readonly reason: string; +} + +export interface StageAVerdict { + readonly candidate_id: string; + readonly states_rejected_alternative: boolean; + readonly quoted_alternative: string; + readonly quoted_reason: string; + readonly note: string; +} + +export interface StageBVerdict { + readonly candidate_id: string; + readonly g3_reason_hidden_from_code: boolean; + readonly g4_wrong_path_functionally_viable: boolean; + readonly g5_oracle_deterministic: boolean; + readonly g7_bounded_task_feasible: boolean; + readonly note: string; +} + +const sha256 = (value: string): string => createHash("sha256").update(value, "utf8").digest("hex"); + +const isRecord = (value: unknown): value is Record => + typeof value === "object" && value !== null && !Array.isArray(value); + +export const readJsonl = (path: string): T[] => + readFileSync(path, "utf8") + .split("\n") + .filter((line) => line.trim() !== "") + .map((line) => JSON.parse(line) as T); + +/** + * Stage A evidence. The ruling, the reason, the record and the anchor are all + * absent by construction: this builds from the redacted packet only, so there + * is no field a future edit could accidentally populate with the answer. + */ +export const buildStageA = (audit: readonly ProvenanceAuditEntry[]): StageAItem[] => + audit + .filter((entry) => entry.mechanical_exclusion === null) + .map((entry) => ({ + candidate_id: entry.candidate_id, + repository_id: entry.repository_id, + changed_paths: entry.changed_paths.slice(0, 40), + files_changed: entry.files_changed, + insertions: entry.insertions, + deletions: entry.deletions, + ordinary_source: entry.ordinary_source, + })); + +export const buildStageB = ( + audit: readonly ProvenanceAuditEntry[], + candidates: readonly V4CandidateEntry[], + rulings: ReadonlyMap, +): StageBItem[] => { + const byId = new Map(candidates.map((candidate) => [candidate.candidate_id, candidate])); + return buildStageA(audit).map((item) => { + const candidate = byId.get(item.candidate_id); + const ruling = rulings.get(item.candidate_id); + if (candidate === undefined || ruling === undefined) { + throw new Error(`review v4: no ruling text for candidate ${item.candidate_id}`); + } + // The reviewer is given the ruling but never the anchor: a reviewer who can + // see the anchor could tell which decisions the benchmark is tracking. + return { ...item, ruling: ruling.ruling, reason: ruling.reason }; + }); +}; + +export const batch = (items: readonly T[], size: number): T[][] => { + if (size <= 0) throw new Error("review v4: batch size must be positive"); + const batches: T[][] = []; + for (let index = 0; index < items.length; index += size) { + batches.push(items.slice(index, index + size)); + } + return batches; +}; + +/** + * Silence is not coverage. + * + * A reviewer that answers three of ten and says nothing about the rest looks + * identical, at the response level, to one that answered all ten and found + * seven unremarkable. So every response must account for its whole batch: the + * judged set plus the declined set has to equal what was handed over, and an + * id that was never handed over is a fabrication rather than extra diligence. + */ +export const assertCoversBatch = ( + batchIds: readonly string[], + judged: readonly string[], + declined: readonly string[], + where: string, +): void => { + const expected = new Set(batchIds); + const seen = new Set([...judged, ...declined]); + const invented = [...seen].filter((id) => !expected.has(id)).sort(); + if (invented.length > 0) { + throw new Error(`review v4: ${where} returned ids that were not in the batch: ${invented.join(", ")}`); + } + const missing = [...expected].filter((id) => !seen.has(id)).sort(); + if (missing.length > 0) { + throw new Error(`review v4: ${where} left ${String(missing.length)} candidate(s) unaccounted for: ${missing.join(", ")}`); + } + const duplicated = judged.filter((id) => declined.includes(id)); + if (duplicated.length > 0) { + throw new Error(`review v4: ${where} both judged and declined ${duplicated.join(", ")}`); + } +}; + +export const parseStageAResponse = (text: string, batchIds: readonly string[], where: string): StageAVerdict[] => { + const parsed = parseJsonPayload(text, where); + const verdicts = asArray(parsed.verdicts, `${where} verdicts`).map((raw) => { + if (!isRecord(raw)) throw new Error(`review v4: ${where} verdict is not an object`); + return { + candidate_id: requireString(raw.candidate_id, `${where} candidate_id`), + states_rejected_alternative: requireBoolean(raw.states_rejected_alternative, `${where} states_rejected_alternative`), + quoted_alternative: String(raw.quoted_alternative ?? ""), + quoted_reason: String(raw.quoted_reason ?? ""), + note: String(raw.note ?? ""), + }; + }); + const declined = asArray(parsed.declined ?? [], `${where} declined`).map((raw) => requireString(raw, `${where} declined id`)); + assertCoversBatch(batchIds, verdicts.map((verdict) => verdict.candidate_id), declined, where); + return verdicts; +}; + +export const parseStageBResponse = (text: string, batchIds: readonly string[], where: string): StageBVerdict[] => { + const parsed = parseJsonPayload(text, where); + const verdicts = asArray(parsed.verdicts, `${where} verdicts`).map((raw) => { + if (!isRecord(raw)) throw new Error(`review v4: ${where} verdict is not an object`); + return { + candidate_id: requireString(raw.candidate_id, `${where} candidate_id`), + g3_reason_hidden_from_code: requireBoolean(raw.g3_reason_hidden_from_code, `${where} g3`), + g4_wrong_path_functionally_viable: requireBoolean(raw.g4_wrong_path_functionally_viable, `${where} g4`), + g5_oracle_deterministic: requireBoolean(raw.g5_oracle_deterministic, `${where} g5`), + g7_bounded_task_feasible: requireBoolean(raw.g7_bounded_task_feasible, `${where} g7`), + note: String(raw.note ?? ""), + }; + }); + const declined = asArray(parsed.declined ?? [], `${where} declined`).map((raw) => requireString(raw, `${where} declined id`)); + assertCoversBatch(batchIds, verdicts.map((verdict) => verdict.candidate_id), declined, where); + return verdicts; +}; + +const requireString = (value: unknown, where: string): string => { + if (typeof value !== "string" || value.trim() === "") throw new Error(`review v4: ${where} must be a non-empty string`); + return value; +}; + +const requireBoolean = (value: unknown, where: string): boolean => { + // A reviewer that returns "unknown" has not answered. Coercing it to false + // would record a decision nobody made, so it is refused. + if (typeof value !== "boolean") throw new Error(`review v4: ${where} must be true or false, received ${JSON.stringify(value)}`); + return value; +}; + +const asArray = (value: unknown, where: string): unknown[] => { + if (!Array.isArray(value)) throw new Error(`review v4: ${where} must be an array`); + return value; +}; + +/** Tolerates a fenced block around the JSON; refuses anything else. */ +export const parseJsonPayload = (text: string, where: string): Record => { + const fenced = /```(?:json)?\s*([\s\S]*?)```/u.exec(text); + const body = fenced?.[1] ?? text; + const start = body.indexOf("{"); + const end = body.lastIndexOf("}"); + if (start < 0 || end <= start) throw new Error(`review v4: ${where} returned no JSON object`); + let parsed: unknown; + try { + parsed = JSON.parse(body.slice(start, end + 1)); + } catch (error) { + throw new Error(`review v4: ${where} returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`); + } + if (!isRecord(parsed)) throw new Error(`review v4: ${where} returned JSON that is not an object`); + return parsed; +}; + +export interface MergedGateVerdict { + readonly candidate_id: string; + readonly gate: string; + readonly reviewer_a: boolean; + readonly reviewer_b: boolean; + readonly agreed: boolean; + readonly resolved: boolean | null; + readonly resolution: "agreement" | "adjudicated" | "unresolved"; +} + +/** + * Merge without averaging. Agreement resolves; disagreement stays a + * disagreement until an adjudicator supplies a value, and an unresolved + * disagreement fails closed at the qualification step rather than being + * rounded into a pass. + */ +export const mergeGate = ( + candidateId: string, + gate: string, + reviewerA: boolean, + reviewerB: boolean, + adjudicated?: boolean, +): MergedGateVerdict => { + if (reviewerA === reviewerB) { + return { candidate_id: candidateId, gate, reviewer_a: reviewerA, reviewer_b: reviewerB, agreed: true, resolved: reviewerA, resolution: "agreement" }; + } + if (adjudicated === undefined) { + return { candidate_id: candidateId, gate, reviewer_a: reviewerA, reviewer_b: reviewerB, agreed: false, resolved: null, resolution: "unresolved" }; + } + return { candidate_id: candidateId, gate, reviewer_a: reviewerA, reviewer_b: reviewerB, agreed: false, resolved: adjudicated, resolution: "adjudicated" }; +}; + +export const agreementRate = (merged: readonly MergedGateVerdict[]): number => + merged.length === 0 ? 1 : merged.filter((verdict) => verdict.agreed).length / merged.length; + +export const packetDigest = (items: readonly unknown[]): string => sha256(JSON.stringify(items)); diff --git a/bench/cdeb/freeze/rulings-v4.ts b/bench/cdeb/freeze/rulings-v4.ts new file mode 100644 index 00000000..8599e142 --- /dev/null +++ b/bench/cdeb/freeze/rulings-v4.ts @@ -0,0 +1,151 @@ +/** + * Ruling text for Stage B review. + * + * The census stores only digests of a decision's ruling and reason, because the + * anchor is what binds them and the text itself is not needed to count. Stage B + * asks whether a rejected path is hidden, viable and bounded, and that cannot be + * read from a digest -- so the text is extracted here, separately, and kept out + * of the Stage A evidence set entirely. + */ + +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { execGit } from "../../../dist/core/git.js"; +import { RULED_OUT_KEY, runQuery, valuesOf } from "../../../dist/core/query.js"; +import { splitRuledOut } from "../../../dist/core/trailers.js"; + +import { decisionTextSha256 } from "./decision-anchor.ts"; +import type { SnapshotEntry, V4CandidateEntry } from "./census-v4.ts"; +import { materializeBundle, type RepositoryBundleIdentity } from "./repository-bundle.ts"; + +export interface RulingEntry { + readonly candidate_id: string; + readonly repository_id: string; + readonly ruling: string; + readonly reason: string; +} + +const bundleIdentityFor = (snapshot: SnapshotEntry): RepositoryBundleIdentity => ({ + repository_id: snapshot.repository_id, + bundle_sha256: snapshot.bundle_sha256, + snapshot_commit: snapshot.snapshot_commit, + snapshot_tree_oid: snapshot.snapshot_tree_oid, + refs_digest: snapshot.refs_digest, + notes_ref_digest: snapshot.notes_ref_digest, + refs_included: snapshot.refs_included, + notes_refs_included: snapshot.notes_refs_included, +}); + +/** + * Matching is by digest, not by position. The census and this extractor walk + * the same history, but binding on ordinal alone would attach the wrong text to + * a candidate the moment either walk changed order, and the mistake would be + * silent -- a plausible ruling under the wrong anchor. + */ +export const extractRulings = ( + cwd: string, + candidates: readonly V4CandidateEntry[], +): RulingEntry[] => { + const wanted = new Map(); + for (const candidate of candidates) { + wanted.set(`${candidate.source_commit_sha}:${candidate.decision_sha256}:${candidate.reason_sha256}`, candidate); + } + const queried = runQuery({ cwd, allHistory: true, at: new Date("9999-12-31T23:59:59.999Z") }); + const found: RulingEntry[] = []; + const claim = (sha: string, alternative: string, reason: string): void => { + const key = `${sha}:${decisionTextSha256(alternative)}:${decisionTextSha256(reason)}`; + const candidate = wanted.get(key); + if (candidate === undefined) return; + wanted.delete(key); + found.push({ candidate_id: candidate.candidate_id, repository_id: candidate.repository_id, ruling: alternative, reason }); + }; + + for (const record of queried.records) { + for (const value of valuesOf(record, RULED_OUT_KEY)) { + const split = splitRuledOut(String(value)); + if (split.malformed || split.alternative === "" || split.reason === "") continue; + claim(record.sha, split.alternative, split.reason); + } + } + // Ordinary-source decisions are not records, so the query above cannot see + // them; they are read from the raw bodies the same way the census read them. + for (const candidate of candidates) { + if (candidate.storage_kind !== "ordinary-source") continue; + if (!wanted.has(`${candidate.source_commit_sha}:${candidate.decision_sha256}:${candidate.reason_sha256}`)) continue; + const body = readCommitBody(cwd, candidate.source_commit_sha); + for (const value of unfoldedRuledOutValues(body)) { + const split = splitRuledOut(value); + if (split.malformed || split.alternative === "" || split.reason === "") continue; + claim(candidate.source_commit_sha, split.alternative, split.reason); + } + } + return found; +}; + +const readCommitBody = (cwd: string, sha: string): string => { + const result = execGit(["show", "-s", "--format=%B", "--end-of-options", sha], { cwd }); + if (result.code !== 0) throw new Error(`rulings v4: cannot read commit ${sha}: ${result.stderr.trim()}`); + return result.stdout; +}; + +export const unfoldedRuledOutValues = (body: string): string[] => { + const lines = body.split("\n"); + const values: string[] = []; + for (let index = 0; index < lines.length; index += 1) { + const line = lines[index]!; + if (!line.startsWith(`${RULED_OUT_KEY}:`)) continue; + let value = line.slice(RULED_OUT_KEY.length + 1).trim(); + for (let next = index + 1; next < lines.length; next += 1) { + const continuation = lines[next]!; + if (!/^\s+\S/.test(continuation)) break; + value = `${value} ${continuation.trim()}`; + } + values.push(value); + } + return values; +}; + +export const runRulingExtraction = (studyRoot: string): RulingEntry[] => { + const root = resolve(studyRoot); + const snapshots = JSON.parse(readFileSync(join(root, "corpus", "snapshots.json"), "utf8")) as { + repositories: readonly SnapshotEntry[]; + }; + const candidates = readFileSync(join(root, "feasibility", "candidate-census.jsonl"), "utf8") + .split("\n") + .filter((line) => line.trim() !== "") + .map((line) => JSON.parse(line) as V4CandidateEntry); + + const rulings: RulingEntry[] = []; + for (const snapshot of snapshots.repositories) { + const mine = candidates.filter((candidate) => candidate.repository_id === snapshot.repository_id); + if (mine.length === 0) continue; + const scratch = mkdtempSync(join(tmpdir(), "cdeb-v4-rulings-")); + try { + const repository = join(scratch, "repository"); + materializeBundle(bundleIdentityFor(snapshot), join(root, "corpus", snapshot.bundle_path), repository); + rulings.push(...extractRulings(repository, mine)); + } finally { + rmSync(scratch, { recursive: true, force: true }); + } + } + return rulings; +}; + +const main = (argv: readonly string[]): void => { + const index = argv.indexOf("--study-root"); + const studyRoot = index >= 0 ? argv[index + 1] : undefined; + if (studyRoot === undefined) throw new Error("rulings v4: --study-root is required"); + const rulings = runRulingExtraction(studyRoot); + writeFileSync( + join(resolve(studyRoot), "feasibility", "rulings.jsonl"), + `${rulings.map((entry) => JSON.stringify(entry)).join("\n")}\n`, + ); + process.stdout.write(`rulings extracted: ${String(rulings.length)}\n`); +}; + +if (process.argv[1] !== undefined && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + main(process.argv.slice(2)); +} diff --git a/bench/cdeb/guards/baseline.json b/bench/cdeb/guards/baseline.json index 3a8021e4..b33ea114 100644 --- a/bench/cdeb/guards/baseline.json +++ b/bench/cdeb/guards/baseline.json @@ -1,10 +1,22 @@ { "version": 1, "properties": [ - { "guard_id": "literature-lock-requires-complete-evidence", "outcome": "bound" }, - { "guard_id": "literature-lock-refuses-circular-justification", "outcome": "bound" }, - { "guard_id": "transition-ledger-refuses-cross-study-row", "outcome": "bound" }, - { "guard_id": "candidate-identity-contract", "outcome": "bound" }, + { + "guard_id": "literature-lock-requires-complete-evidence", + "outcome": "bound" + }, + { + "guard_id": "literature-lock-refuses-circular-justification", + "outcome": "bound" + }, + { + "guard_id": "transition-ledger-refuses-cross-study-row", + "outcome": "bound" + }, + { + "guard_id": "candidate-identity-contract", + "outcome": "bound" + }, { "guard_id": "exclusion-index-blocks-study-id-cdeb-v1", "outcome": "unavailable", @@ -45,7 +57,10 @@ "outcome": "uncovered", "reason": "The census can match this candidate identifier by value, but the registry has no mutation that proves the claim makes it ineligible." }, - { "guard_id": "exclusion-index-blocks-record-id", "outcome": "bound" }, + { + "guard_id": "exclusion-index-blocks-record-id", + "outcome": "bound" + }, { "guard_id": "exclusion-index-blocks-oracle-fixture-hash", "outcome": "uncovered", @@ -76,11 +91,34 @@ "outcome": "uncovered", "reason": "The census can match this decision's source-record identity by value, but the registry has no mutation that proves the claim makes its candidate ineligible." }, - { "guard_id": "frozen-bundle-digest-is-verified", "outcome": "bound" }, + { + "guard_id": "frozen-bundle-digest-is-verified", + "outcome": "bound" + }, { "guard_id": "personal-paths-are-absent-from-active-material", "outcome": "inert", "reason": "The current clean tree still passes when the personal-path scan is bypassed, so the claim has no constructed personal-path control." + }, + { + "guard_id": "active-study-refuses-terminal-study", + "outcome": "bound" + }, + { + "guard_id": "blind-packet-carries-no-record-line", + "outcome": "bound" + }, + { + "guard_id": "delivery-refuses-false-zero", + "outcome": "bound" + }, + { + "guard_id": "review-coverage-requires-whole-batch", + "outcome": "bound" + }, + { + "guard_id": "qualification-fails-closed-on-disagreement", + "outcome": "bound" } ] } diff --git a/bench/cdeb/guards/registry.json b/bench/cdeb/guards/registry.json index ec553bff..3d2b365f 100644 --- a/bench/cdeb/guards/registry.json +++ b/bench/cdeb/guards/registry.json @@ -282,6 +282,130 @@ "why": "The current clean tree still passes when the scan is bypassed, so this test has no constructed personal-path control." } ] + }, + { + "guard_id": "active-study-refuses-terminal-study", + "claim": "A study that has written phase invalidated about itself cannot be resolved as the active study, however the declaration is edited.", + "test_file": "test/cdeb-v4-stage0-governance.test.ts", + "test_name": "refuses to make either invalidated predecessor the active study", + "mutations": [ + { + "mutation_id": "active-study-skips-terminal-check", + "file": "bench/cdeb/active-study.ts", + "find": " assertStudyNotTerminal(studyRoot, value.active_study_id);", + "replace": " void assertStudyNotTerminal;", + "must_fail_test": true, + "why": "An invalidated predecessor could be named active and resolve cleanly." + }, + { + "mutation_id": "active-study-accepts-contradictory-declaration", + "file": "bench/cdeb/active-study.ts", + "find": " if ((value.status === \"no-active-study\") !== (value.active_study_id === null)) {", + "replace": " if (false) {", + "must_fail_test": true, + "why": "A declaration whose status and id disagree would resolve to whichever half the reader trusts.", + "test_name": "refuses a declaration whose status and id disagree in either direction" + } + ] + }, + { + "guard_id": "blind-packet-carries-no-record-line", + "claim": "An ordinary-source packet handed to a blind reviewer contains no CommitLore key line, including one a squashed commit embedded as indented prose.", + "test_file": "test/cdeb-v4-provenance.test.ts", + "test_name": "removes a whole record that a squashed commit embedded as indented prose", + "mutations": [ + { + "mutation_id": "second-redaction-pass-removes-nothing", + "file": "bench/cdeb/freeze/provenance-v4.ts", + "find": " if (COMMITLORE_KEY_LINE.test(line)) {", + "replace": " if (false) {", + "must_fail_test": true, + "why": "A squashed commit's embedded record would reach the reviewer that must be blind to it." + }, + { + "mutation_id": "packet-record-line-check-passes-anything", + "file": "bench/cdeb/freeze/provenance-v4.ts", + "find": " if (offending.length > 0) {", + "replace": " if (false) {", + "must_fail_test": true, + "why": "A packet still holding a record line would be reported clean.", + "test_name": "refuses a packet that still carries a record line" + } + ] + }, + { + "guard_id": "delivery-refuses-false-zero", + "claim": "A delivery result in which the injector never started, or never forwarded a byte, is an error rather than zero delivery.", + "test_file": "test/cdeb-v4-delivery.test.ts", + "test_name": "refuses a result in which the injector never ran, rather than reporting zero delivery", + "mutations": [ + { + "mutation_id": "injector-control-ignores-exit-codes", + "file": "bench/cdeb/freeze/delivery-v4.ts", + "find": " if (started.length === 0) {", + "replace": " if (false) {", + "must_fail_test": true, + "why": "A harness failure would be published as a finding of zero delivery." + }, + { + "mutation_id": "injector-control-ignores-empty-payloads", + "file": "bench/cdeb/freeze/delivery-v4.ts", + "find": " if (withPayload.length === 0) {", + "replace": " if (false) {", + "must_fail_test": true, + "why": "An injector forwarding nothing anywhere could not be told from one with nothing to say." + } + ] + }, + { + "guard_id": "review-coverage-requires-whole-batch", + "claim": "A reviewer response must account for every candidate it was given; silence is not coverage and an unknown id is not diligence.", + "test_file": "test/cdeb-v4-qualification.test.ts", + "test_name": "refuses a response that leaves part of its batch unmentioned", + "mutations": [ + { + "mutation_id": "coverage-ignores-unaccounted-candidates", + "file": "bench/cdeb/freeze/review-v4.ts", + "find": " if (missing.length > 0) {", + "replace": " if (false) {", + "must_fail_test": true, + "why": "A reviewer that answered three of ten would be indistinguishable from one that answered all ten." + }, + { + "mutation_id": "coverage-ignores-invented-ids", + "file": "bench/cdeb/freeze/review-v4.ts", + "find": " if (invented.length > 0) {", + "replace": " if (false) {", + "must_fail_test": true, + "why": "A verdict about a candidate that was never handed over would enter the corpus.", + "test_name": "refuses invented ids and a candidate both judged and declined" + } + ] + }, + { + "guard_id": "qualification-fails-closed-on-disagreement", + "claim": "A gate on which the two blind reviewers disagreed, with no third vote, fails rather than passing or being averaged.", + "test_file": "test/cdeb-v4-qualification.test.ts", + "test_name": "fails closed on a split pair with no third vote, and resolves by majority when there is one", + "mutations": [ + { + "mutation_id": "split-pair-passes", + "file": "bench/cdeb/freeze/qualify-v4.ts", + "find": " if (third === undefined) return { passed: false, source: \"unresolved\" };", + "replace": " if (third === undefined) return { passed: true, source: \"unresolved\" };", + "must_fail_test": true, + "why": "An unresolved disagreement would be rounded into a qualification." + }, + { + "mutation_id": "missing-reviewer-passes", + "file": "bench/cdeb/freeze/qualify-v4.ts", + "find": " if (left === undefined || right === undefined) return { passed: false, source: \"unavailable\" };", + "replace": " if (left === undefined || right === undefined) return { passed: true, source: \"unavailable\" };", + "must_fail_test": true, + "why": "A candidate no reviewer judged would qualify.", + "test_name": "treats a missing reviewer verdict as a failure, never as a pass" + } + ] } ] -} \ No newline at end of file +} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/deviations.jsonl b/bench/cdeb/studies/cdeb-fresh-v4/deviations.jsonl index e69de29b..4a0e0536 100644 --- a/bench/cdeb/studies/cdeb-fresh-v4/deviations.jsonl +++ b/bench/cdeb/studies/cdeb-fresh-v4/deviations.jsonl @@ -0,0 +1,7 @@ +{"deviation_id": "CDEB-V4-REVIEWER-MODEL-FAMILY", "recorded_at": "2026-08-21T23:05:00Z", "kind": "reviewer-independence-limitation", "basis": {"preregistration_clause": "STAGE0-PREREGISTRATION.md \u00a78 asks for paired reviewers from different model families where possible", "attempted": "a second family was attempted first and refused the request with HTTP 402, usage balance exhausted", "adopted": "two independent fresh sessions of one family, running different models, blind to each other", "owner_instruction": "the owner directed the substitution after the refusal was reported"}, "closed_alternatives": ["waiting for the second family to become available, which would block Stage 0 on a billing state", "using a single reviewer, which removes the disagreement signal entirely", "using the adjudicator as a second reviewer, which destroys the blinding that makes adjudication meaningful"], "measured_data_exists": false, "reason": "Two models of one family share pretraining and failure modes, so their agreement overstates independence. The agreement rate is therefore reported as a correlated-reviewer figure and must not be read as inter-family agreement. It bounds reviewer reliability from above, not below."} +{"deviation_id": "CDEB-V4-G2-OPERATIONALIZATION", "recorded_at": "2026-08-21T23:05:00Z", "kind": "preregistration-refinement", "basis": {"preregistration_clause": "G2 requires the decision and its reason to be recoverable from ordinary source", "refinement": "Stage A reviewers see only the redacted packet and are asked to quote any rejected alternative and its reason verbatim; G2 passes when both reviewers find a stated rejected alternative and at least one quote corresponds to this candidate's own ruling", "correspondence_measure": "content-word overlap between the normalized quote and the normalized ruling, counted as the fraction of the ruling's content words the quote contains; the floor is 0.34 and both the floor and the per-candidate figure are published so a reader can apply a different rule to the same evidence", "recorded_before": "the merge was written and this deviation recorded before any merged count was computed; individual batch outputs had been inspected for format only", "floor_fixed_before": "the floor was written into the code and this record before any overlap was computed for any candidate; no overlap distribution was inspected first"}, "closed_alternatives": ["showing the reviewer the ruling and asking whether the prose supports it, which answers itself", "accepting any rejected alternative found in the same commit, which would qualify a candidate on a different decision's evidence", "scoring the correspondence with a fixed similarity threshold chosen after seeing the distribution"], "measured_data_exists": false, "reason": "The preregistration named the gate but not the procedure. Naming the procedure after seeing merged counts would let the counts choose it, so it is fixed here, and the correspondence figure is published per candidate so a reader can apply a different rule to the same evidence."} +{"deviation_id": "CDEB-V4-PACKET-SECOND-REDACTION", "recorded_at": "2026-08-21T23:05:00Z", "kind": "instrument-correction", "basis": {"found": "11 of 241 redacted packets still contained CommitLore key lines; 2 contained a complete record including the ruling", "cause": "a squashed commit embeds whole commit messages indented, and Git's trailer parse does not see them, so the product's redaction correctly leaves them alone", "correction": "a second pass removes any CommitLore key line and its folded continuations wherever it appears, and a check refuses a packet that still holds one", "lines_removed": 83}, "closed_alternatives": ["changing the product's redaction, which is correct for the product and must not carry a benchmark's bias", "excluding the affected candidates, which loses real corpus to a fixable tooling gap"], "measured_data_exists": false, "reason": "A blind reviewer handed the ruling is not blind. The contamination was in the packet rather than the decision, and it was found by the leak check before any reviewer ran."} +{"deviation_id": "CDEB-V4-DELIVERY-HARNESS-FALSE-ZERO", "recorded_at": "2026-08-21T23:05:00Z", "kind": "instrument-correction", "basis": {"observed": "the first delivery pass reported 0 delivered of 207, with every content field false", "cause": "the extracted release tree had no installed dependencies, so the CLI exited 1 before reading any record", "correction": "the release dependencies are installed from the release lockfile, and a positive control refuses a result in which no probe exited 0 or no probe produced a byte"}, "closed_alternatives": ["running the current working-tree dist instead of the release, which measures behaviour nobody shipped", "reporting the zero as a finding, which is what the summary looked like before the exit codes were read"], "measured_data_exists": false, "reason": "Every field of a delivery row reads false when the product answered nothing and when the product never ran. The two are indistinguishable in the summary, so the distinction has to be made by a check rather than by whoever reads it."} +{"deviation_id": "CDEB-V4-G2-DIFF-ROBUSTNESS-ARM", "recorded_at": "2026-08-21T23:40:00Z", "kind": "added-robustness-check", "basis": {"reason_for_adding": "the primary G2 pass rate is low, and a low rate has two very different causes: the corpus does not carry the rejection independently, or the ordinary-source packet is too narrow because it holds only commit messages", "arm": "the same blind question, asked from the commit message and the commit's diff together", "sample": "60 candidates, 15 per repository, taken as the first 15 by candidate_id within each repository", "why_that_sample_is_arbitrary": "candidate_id is derived from the decision audit anchor, a SHA-256 over canonical inputs, so ordering by it is independent of the decision's content, its date and its author", "status": "robustness only; it does not feed the primary verdict, and the primary G2 numbers stand as measured", "recorded_before": "the arm was registered here before any of its verdicts were collected"}, "closed_alternatives": ["replacing the primary G2 measurement with the diff-inclusive one after seeing the primary rate, which would let the result choose its own method", "extending the packet silently, which would change what 'ordinary source' means without saying so", "running the arm over all 207 candidates, which the available reviewer capacity could not complete beside the primary stages"], "measured_data_exists": false, "reason": "A HOLD whose cause is unknown gives the owner nothing to act on. This distinguishes 'the corpus does not carry it' from 'the packet did not show it', and the answer changes what a successor stage should do."} +{"deviation_id": "CDEB-V4-THIRD-VOTE-INSTEAD-OF-ADJUDICATOR", "recorded_at": "2026-08-22T00:20:00Z", "kind": "analysis-change", "basis": {"preregistration_clause": "STAGE0-PREREGISTRATION.md \u00a78: disagreement between a pair is resolved by ADJUDICATOR on the evidence", "implemented": "a third blind vote from a fresh session decides by majority of three; qualify-v4.ts labels the outcome `adjudicated`", "scale": "19 Stage A splits and 73 Stage B splits were resolved this way", "found_by": "an adversarial review of the published result, which noted the change was made without a deviation record"}, "closed_alternatives": ["the study operator adjudicating, which is what \u00a78 names but puts the least blind reader available in front of their own corpus, already knowing how the pair voted", "leaving every split unresolved, which fails 92 gates closed on a procedural gap rather than on evidence"], "measured_data_exists": false, "reason": "The substitution is defensible and was described in the commit and pull request, but it was not recorded here, and the deviations ledger is where an analysis change has to appear. It can move any judgment gate, so a reader recomputing the verdict must be able to see it. The label `adjudicated` in qualification.jsonl means majority-of-three, not an adjudicator's ruling."} +{"deviation_id": "CDEB-V4-G2-NARROWER-THAN-REGISTERED", "recorded_at": "2026-08-22T00:20:00Z", "kind": "gate-implemented-narrower-than-registered", "basis": {"preregistration_clause": "STAGE0-PREREGISTRATION.md \u00a74 G2: decision, reason, path scope and lifecycle all recoverable from ordinary source", "implemented": "the reviewers were asked for the rejected alternative and its reason, and the gate compares only the quoted alternative against this candidate's ruling, at a content-word overlap floor of 0.34", "not_implemented": "the quoted reason is never compared with the recorded reason, and neither path scope nor lifecycle recovery is tested at all", "measured_anyway": "reason-quote overlap was computed for all 207 and passes 15 at the same floor against the ruling's 17, so the missing comparison does not hide a larger pool", "found_by": "an adversarial review of the published result"}, "closed_alternatives": ["silently reporting the narrower gate under the registered name, which would let a reader assume scope and lifecycle recovery had been tested", "re-running the review with the full four-part question after seeing the counts, which would let the counts choose the instrument"], "measured_data_exists": false, "reason": "G2 as implemented is a lexical correspondence test on one of four registered components. It bounds the qualified count from above for the whole gate -- a candidate failing the alternative comparison cannot pass the full gate -- so the HOLD stands, but neither the 17 passes nor the 190 failures answer whether complete independent gold could be written."} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/RESULT.md b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/RESULT.md new file mode 100644 index 00000000..da42fe69 --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/RESULT.md @@ -0,0 +1,242 @@ +# CDEB-Fresh v4 Stage 0 Result + +> Generated from this study's artifacts by `scripts/render-stage0-result.mjs`. +> Every number below is read from a committed file; none is typed by hand. + +## Owner estimand decision + +> **The estimand concerns delivery of a prior repository decision, not delivery of a product Record-Id.** + +Limit carried with it: Id-less candidates still must pass every provenance, viability, oracle, and delivery gate. Absent identity is neither an exclusion nor an admission. + +## Study identity + +```text +study_id: cdeb-fresh-v4 +phase: stage0-corpus-feasibility +measured_run_allowed: false +predecessors: cdeb-fresh-v3, cdeb-fresh-v3r1 +predecessor status: terminal-invalidated-no-measured-data +predecessor artifacts: none +product release: v1.2.0 (90a8b212e1db) +``` + +## Candidate universe + +These are potential source decisions, not qualified tasks and not benchmark cases. + +| repository | records | with a reason | decisions | identified | id-less | +|----------------------|---------|---------------|-----------|------------|---------| +| gitseed | 84 | 71 | 104 | 94 | 10 | +| agent-operator-score | 155 | 30 | 59 | 48 | 11 | +| logic-pro-mcp | 53 | 29 | 43 | 0 | 43 | +| agent-control-plane | 90 | 27 | 35 | 1 | 34 | + +```text +decisions enumerated: 241 +identified: 143 +legacy id-less: 98 +benchmark-authored excluded: 0 +``` + +## Qualification by repository + +| repository | raw | provenance | hidden | viable | oracle | delivery | bounded | qualified | eligible | +|----------------------|-----|------------|--------|--------|--------|----------|---------|-----------|----------| +| agent-control-plane | 35 | 3 | 17 | 27 | 30 | 28 | 33 | 1 | no | +| agent-operator-score | 59 | 2 | 31 | 35 | 56 | 41 | 58 | 1 | no | +| gitseed | 104 | 4 | 32 | 62 | 56 | 42 | 71 | 2 | no | +| logic-pro-mcp | 43 | 8 | 22 | 19 | 41 | 43 | 43 | 2 | no | + +## Repository eligibility + +```text +eligible repositories: 0 (threshold 3) +qualified per repository floor: 12 +total qualified: 6 (threshold 48) +recommended fixed set: none +``` + +## Freshness audit + +```text +old tasks reused: 0 +old trajectories reused: 0 +old result rows reused: 0 +synthetic Record-Ids: 0 +``` + +## Instrument + +```text +decision audit anchor implemented: yes +Record-Id required: no +content delivery observable: yes, for identified and id-less alike + delivered carrying an identifier: 69 + delivered carrying none: 85 +``` + +## Provenance tiers + +```text +P1 17 +P2 0 +unsupported 224 +``` + +P2 is the owner-attested tier. No owner testimony was collected in Stage 0, so it +is empty by construction rather than by a judgement about its admissibility. That +decision belongs to a later preregistration, and nothing here mixes an attested +candidate with an independently sourced one. + +## How much work the correspondence floor does + +G2 as implemented is a lexical test: content-word overlap between a reviewer's +blind quote and this candidate's recorded ruling, against a floor fixed before +any overlap was computed. It cannot tell a paraphrase from a different decision, +and 159 pairs found *a* rejection while 17 matched *this* one -- so the floor, +not the bare absence of a written rejection, separates most of them. + +```text +floor 0.200 would pass 46 +floor 0.250 would pass 39 +floor 0.300 would pass 24 +floor 0.333 would pass 24 +floor 0.340 would pass 17 <- registered +floor 0.400 would pass 17 +floor 0.500 would pass 14 +``` + +The verdict does not turn on the choice. The most generous floor above still +passes fewer candidates than the registered total of 48, before the other six +gates take their share. + +## Reviewer agreement, per gate + +| gate | compared | agreed | rate | +|------|----------|--------|-------| +| G2 | 207 | 188 | 0.908 | +| G3 | 207 | 153 | 0.739 | +| G4 | 207 | 189 | 0.913 | +| G5 | 207 | 193 | 0.932 | +| G7 | 207 | 205 | 0.990 | + +Both reviewers are independent sessions of one model family; see the deviation +record. Their agreement bounds reliability from above, not below, and this is how +far from independent they actually were: + +```text +pairs where both found a rejection: 159 +mean overlap of the two quotes: 0.57 +quoted near-identical text: 72 (45%) +``` + +## Where the candidates went + +| exclusion reason | count | +|------------------------------------|-------| +| insufficient-provenance | 190 | +| source-packet-empty | 33 | +| reason-obvious-from-code | 7 | +| wrong-path-not-functionally-viable | 3 | +| shipping-content-not-observable | 1 | +| scope-unresolvable | 1 | + +## Robustness: does the diff carry what the message did not? + +Does showing the reviewer the commit's diff, as well as its message, recover the rejected alternative that the message alone did not? + +```text +sample: 60 candidates, 15 per repository +both reviewers found a rejection: 55 +message and diff together: 8 (13%) +message alone, same candidates: 6 (10%) +``` + +Adding the diff moves the pass rate by three points on the same candidates. The narrow packet is not why G2 fails; the rejected alternative is not written outside the record. + +Read as one test of one alternative explanation, not as elimination of the +class: the arm broadened the packet by a single commit's diff, on a sample of +60, and reports no uncertainty interval. + +## What these gates were judged from + +Stage 0 is a screen, not a qualification freeze, and the evidence each gate was +decided from bounds what its number means. + +- **G2** was decided from the commit's redacted prose alone, which is what the + ordinary-source packet contains. A reviewer never saw the ruling. +- **G3** and **G4** were decided from the commit message, the changed paths and the + ruling. Neither reviewer read the current code or ran a test, so both are + informed judgements about a maintenance task rather than measurements of one. +- **G5** classifies whether a deterministic oracle *could* be written. No oracle + was built, and none may be at this stage. +- **G6** is a measurement, with three bounds worth naming. The hook was run + against the frozen release for every candidate and the forwarded bytes were + read, so ruling and reason visibility are observed. Scope is tested against + **one** non-touched path, not the whole tree. Lifecycle is not read from the + payload: an active decision counts as lifecycle-correct whenever its ruling is + visible, so that field discriminates only the superseded cases. + `before_first_mutation` is structural -- the payload is a synthetic + `PreToolUse` `Edit` on a path the decision itself touched, so it is true by + construction rather than observed against a real agent. And `identity_present` + is `record_id !== null`, nothing more. + +## Verdict + +**HOLD** + +Unmet: + +- eligible repositories 0 < 3 +- total qualified 6 < 48 + +### The blocker + +`insufficient-provenance` — 190 of 241 enumerated decisions. + +**Stated exactly.** Of the enumerated candidates, only 17 had a rejected +alternative that two blind reviewers could quote from the redacted source-commit +prose and that lexically matched this candidate's own ruling. Gold for the rest +could not be written from the material this stage examined, and gold copied from +the record would make the benchmark measure its own instrument. + +**What this does not establish.** It is not a census of decisions in these +repositories -- the pool is whatever the `Ruled-out:` trailer discovers. It is +not proof that the rejection is written nowhere else: pull requests, issues, +design documents, code comments, tests and other commits were never searched. +The robustness arm broadened the packet in one direction only, by one commit's +diff, on 60 candidates, and moved the count from 6 to 8 -- weak evidence against +one alternative explanation, not the elimination of all of them. Owner +testimony, which the preregistration permits as an independent tier, was never +collected, so the P2 route to gold is untested rather than closed. + +**What the instrument did show.** The shipping path put the ruling and the +reason in front of a synthetic pre-edit event for 154 of the 207 probed +candidates, 85 of them carrying no identifier. That result is independent of the +HOLD and stands on its own, read with the delivery-gate bounds above. + +## Deviations recorded + +- `CDEB-V4-REVIEWER-MODEL-FAMILY` — reviewer-independence-limitation +- `CDEB-V4-G2-OPERATIONALIZATION` — preregistration-refinement +- `CDEB-V4-PACKET-SECOND-REDACTION` — instrument-correction +- `CDEB-V4-DELIVERY-HARNESS-FALSE-ZERO` — instrument-correction +- `CDEB-V4-G2-DIFF-ROBUSTNESS-ARM` — added-robustness-check +- `CDEB-V4-THIRD-VOTE-INSTEAD-OF-ADJUDICATOR` — analysis-change +- `CDEB-V4-G2-NARROWER-THAN-REGISTERED` — gate-implemented-narrower-than-registered + +## Deliberately not done + +- no pilot +- no measured run +- no treatment randomization +- no README headline +- no synthetic identity migration + +```text +measured product-effect data = 0 +qualification rows written = 241 +``` + +STAGE 0 COMPLETE — MEASURED PRODUCT-EFFECT DATA STILL ZERO diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/adversarial-review.md b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/adversarial-review.md new file mode 100644 index 00000000..03766c0d --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/adversarial-review.md @@ -0,0 +1,78 @@ + + +# Red-team verdict: refuted as stated + +The HOLD arithmetic is reproducible, but the headline causal claim is not. The evidence +supports a much narrower statement about one packet and one lexical decision rule; it +does not establish that the CommitLore record is the only place the information exists. +First, the denominator does not support “most decisions in these four repositories.” +`STAGE0-PREREGISTRATION.md:79-81` defines the pool as “historical decisions carrying an +explicit reason” and warns that it is only a “potential source-decision pool.” +`RESULT.md:26` likewise calls the rows “potential source decisions.” Thus 190/241 is a +fraction of an instrument-discovered candidate pool, not a census of repository decisions. +Second, absence was not searched broadly enough to prove nonexistence. `RESULT.md:141-142` +says G2 was judged from “the commit's redacted prose alone.” The robustness arm added only +the same commit's diff for 60 candidates (`RESULT.md:123-132`); it did not search PRs, +issues, design docs, comments, tests, other commits, or owner knowledge. Nevertheless +`RESULT.md:173-176` says this “rules out” packet narrowness and proves the rejection is not +written outside the record. That inference does not follow from the tested evidence set. +Third, G2 is primarily an exact-token correspondence test, not a test that independent +gold can be built. `qualify-v4.ts:64-78` lowercases and intersects exact content-word sets, +and `qualify-v4.ts:81-82` fixes the cutoff at 0.34. `qualify-v4.ts:144-147` then fails G2 +below that floor. This cannot distinguish a paraphrase or morphological variant from a +different decision. The committed reviews have 159 pairs where both found a rejection +(`RESULT.md:106-110`), yet only 17 P1 candidates (`RESULT.md:81-85`); the correspondence +rule, not simple absence of a written rejection, does most of the work. Recalculation also +finds 41 majority-found cases with nonzero overlap below 0.34, including seven that would +pass at 0.333. Fixing the cutoff before merging does not validate what the cutoff measures. +Fourth, the implementation does not implement preregistered source sufficiency. +`STAGE0-PREREGISTRATION.md:100-102` requires decision, reason, path scope, and lifecycle to +be recoverable. But `qualify-v4.ts:138-147` uses only the boolean “found an alternative” +and overlap of `quoted_alternative` with `ruling`; it never compares `quoted_reason` with +the recorded reason and never tests recovery of scope or lifecycle. Therefore neither the +17 passes nor the 190 failures directly answer whether complete independent gold exists. +Fifth, split votes were resolved contrary to the preregistration without a recorded +deviation. `STAGE0-PREREGISTRATION.md:177-179` requires an `ADJUDICATOR` to resolve +disagreement on the evidence. `qualify-v4.ts:84-102` instead takes a third blind vote and +labels its result “adjudicated.” The raw artifacts contain 92 such third-reviewer rows. +None of the five entries at `deviations.jsonl:1-5` records this analysis change. That is a +material protocol violation because it can change every judgment gate, including G2. +Sixth, the diff arm is post hoc and too narrow to “rule out” an explanation. Its own entry +admits it was added because “the primary G2 pass rate is low” (`deviations.jsonl:5`). +`RESULT.md:128-134` reports 8/60 versus 6/60, with no uncertainty or power calculation. +Failure to detect a larger difference in this post-result sample is not evidence that a +broader ordinary-source packet would make no difference. +Seventh, an unmeasured route to independent gold is acknowledged by the study itself. +`RESULT.md:87-90` says owner-attested P2 is empty “by construction rather than by a +judgement about its admissibility.” `STAGE0-PREREGISTRATION.md:157-168` defines conditions +under which such testimony is independent and permitted. Not collecting it cannot support +the categorical conclusion at `RESULT.md:168-171` that independent gold “cannot be written.” +Finally, 154/207 and the 85 id-less count are arithmetically supported, but “delivered” is +overinterpreted. `delivery-v4.ts:123-128` tests scope with one selected negative path; +`delivery-v4.ts:129-132` treats an active lifecycle as correct whenever the ruling is +visible, without observing lifecycle text; and `delivery-v4.ts:140-142` hard-codes +`before_first_mutation: true` because the synthetic payload is named `PreToolUse`. +Thus the count measures ruling/reason containment for a synthetic `Edit` on a known touched +path plus one negative probe, not actual delivery of correct scope/lifecycle before an +agent's first mutation. Identity is merely `record_id !== null` (`delivery-v4.ts:134-137`), +and the identity assertion only demands one success in each state (`delivery-v4.ts:219-225`), +so it does not establish the prose claim that id-less decisions work “just as well.” +Defensible conclusion: under this post-registered lexical G2, only 17 candidates had a +matching alternative in the redacted source-commit prose. The stronger “only place that +exists, therefore independent gold cannot be built” conclusion should not be published. diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/delivery-feasibility.jsonl b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/delivery-feasibility.jsonl new file mode 100644 index 00000000..9ffebc23 --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/delivery-feasibility.jsonl @@ -0,0 +1,207 @@ +{"candidate_id":"v4-00efc0041ed3118a","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2301,"in_scope_payload_sha256":"f35548b770f67c3a8d7f86e0520746e9a3cd525495c4cb6558393360bb081828","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:14378) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-03dd551058ce7aaf","identity_present":true,"record_id":"r-gsf512","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:16178) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-0f4dfe2618796b54","identity_present":true,"record_id":"r-f3rev28","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1810,"in_scope_payload_sha256":"0513a01d3aec0f9a44e222ed3f85b9bbb60bea8660f4445469cb1fede9d66e43","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:17612) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-122f5e996ed8f300","identity_present":true,"record_id":"r-store62","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3144,"in_scope_payload_sha256":"f0253c5acd49c61b9d762d0572a714ada89c430b222d9842aa3795152aa2c2f5","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:19099) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-1f1cba75144b609f","identity_present":true,"record_id":"r-gl0001","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":true,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":1449,"in_scope_payload_sha256":"bec8e1eb4791e7faddbd050e85c7edd532f00022d97feb0eef8b6eaf066d92d0","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:20559) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-2115a033e1fb37d0","identity_present":true,"record_id":"r-readmel28","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:22137) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-2493fd41b194d8f4","identity_present":true,"record_id":"r-gs0005","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2856,"in_scope_payload_sha256":"67c2dad32c2ed8459c41074bde265e00e0b6b9e683cde9beb05563268c464aaa","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:23612) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-2616d7ae1c85fea4","identity_present":true,"record_id":"r-search67","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1667,"in_scope_payload_sha256":"7286d913d6e7e18257744387ab87d42c31a1b8fcf99aa4a56f2be264e6023eb6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:25096) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-2c70b58d7ce1117a","identity_present":true,"record_id":"r-gs0005","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2856,"in_scope_payload_sha256":"67c2dad32c2ed8459c41074bde265e00e0b6b9e683cde9beb05563268c464aaa","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:26447) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-30517866b1626071","identity_present":true,"record_id":"r-obs065","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3144,"in_scope_payload_sha256":"f0253c5acd49c61b9d762d0572a714ada89c430b222d9842aa3795152aa2c2f5","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:27969) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-31ea939e4478ded3","identity_present":true,"record_id":"r-f4rev28","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1474,"in_scope_payload_sha256":"38d3a4fc4fe939fafa20c3a75c17c9796ef0446129a465e4c8a5a26b2c106dfd","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:29483) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-3258ac6e08349a04","identity_present":true,"record_id":"r-chlog030","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2390,"in_scope_payload_sha256":"d416543e7b23e1938268d0c7b2d001180795d43ab620009c73a542fd6f51412c","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:30894) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-377f04276465b59d","identity_present":true,"record_id":"r-gsb108","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3166,"in_scope_payload_sha256":"4e836c99f6ec80eb9565d3a397fe4437af9ceef8fd7f817e36b8694d52d71697","out_of_scope_payload_bytes":1449,"exit_code":0,"stderr":"(node:32196) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-4042654555ac20e4","identity_present":true,"record_id":"r-adr9rank","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1370,"in_scope_payload_sha256":"b37d7de4e7750773a1c8d8afa9a48f326877beef68935f625bc136056a5195e6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:33613) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-468e579f86e22f91","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2824,"in_scope_payload_sha256":"d304f6581edf156f886a6a0160bc93ba1c9be3145ce4cca0f121725eba1084c4","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:34940) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-4d2c072dffcb56ba","identity_present":true,"record_id":"r-gl0001","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":true,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":1449,"in_scope_payload_sha256":"bec8e1eb4791e7faddbd050e85c7edd532f00022d97feb0eef8b6eaf066d92d0","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:36424) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-545d1c9c0d2b969e","identity_present":true,"record_id":"r-adr10st","ruling_visible":true,"reason_visible":false,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":1650,"in_scope_payload_sha256":"73391bba47b26bf0fdb79766eb9fa9258f446a39d57a3adead90c74d3e6920f6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:37799) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-572e09dba076a5a3","identity_present":true,"record_id":"r-readme69","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:39167) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-5f0d8829fcc6f198","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2009,"in_scope_payload_sha256":"8bd759f1d5ff3e4761e29444848e43f00f1ffe0b5214f600396abff04529215a","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:40657) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-63e1ec17f2bdadfe","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2824,"in_scope_payload_sha256":"d304f6581edf156f886a6a0160bc93ba1c9be3145ce4cca0f121725eba1084c4","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:42117) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-66695090e5949ea6","identity_present":true,"record_id":"r-gs6c03","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:43588) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-6a3b0b51071ec292","identity_present":true,"record_id":"r-replay57","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3232,"in_scope_payload_sha256":"daa440e0c5cb4235b28fbf88553b689cd4f8cb3eac93eaf5a9474e85af89b8cc","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:45102) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-6aed03472a14ffc6","identity_present":true,"record_id":"r-f1rev28","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1959,"in_scope_payload_sha256":"1175eb6f39b54bebddc9a8359cd17801d142b2f93769d0283227eab6ae453f1c","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:46421) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-6d2eec862ac0f22c","identity_present":true,"record_id":"r-f2rev28","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2091,"in_scope_payload_sha256":"ff991158026e4ad1e79d86ed4e5977e15fff0341a9b852aa69a61c04548c6b8a","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:47877) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-7078a162153bab38","identity_present":true,"record_id":"r-gs0006","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1788,"in_scope_payload_sha256":"9c8cd908818050e42eff7082edf9b3b434912105d3db00c6754e298698850ddc","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:48841) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-77e1745655a235ce","identity_present":true,"record_id":"r-evid610","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2963,"in_scope_payload_sha256":"2e3c389cb212c9102cdb97a85f91a8d4509a218a7552c63940a25a203b720f9b","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:49696) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-79e5fcfd3fd49649","identity_present":true,"record_id":"r-gs0002","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2513,"in_scope_payload_sha256":"4aeccdca24394a4393dda7246d9fc3752918a3f9717b4acc2622703adab391ad","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:50540) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-7b84423ed8fa9f34","identity_present":true,"record_id":"r-gsd310","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2824,"in_scope_payload_sha256":"d304f6581edf156f886a6a0160bc93ba1c9be3145ce4cca0f121725eba1084c4","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:51374) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-7c0b5ea14295d54c","identity_present":true,"record_id":"r-gs3844fix","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3232,"in_scope_payload_sha256":"c1e515f60876a35f255cac86250ac7c0bc33ae9fd7674634b7747e20dcdcb394","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:52228) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-7c3c09fcebd01801","identity_present":true,"record_id":"r-gs45p48fix","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3235,"in_scope_payload_sha256":"5a2b8fcc01d2d5435d40ee361516eb33d4124646fe2c73e3dedee448768caf27","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:53061) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-7f42c3f1f7876679","identity_present":true,"record_id":"r-gs0004","ruling_visible":true,"reason_visible":false,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3166,"in_scope_payload_sha256":"4e836c99f6ec80eb9565d3a397fe4437af9ceef8fd7f817e36b8694d52d71697","out_of_scope_payload_bytes":1449,"exit_code":0,"stderr":"(node:53896) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-81773950b2e67c02","identity_present":true,"record_id":"r-adr10st","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1650,"in_scope_payload_sha256":"73391bba47b26bf0fdb79766eb9fa9258f446a39d57a3adead90c74d3e6920f6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:54746) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-81aa6660ab83f1dc","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2009,"in_scope_payload_sha256":"8bd759f1d5ff3e4761e29444848e43f00f1ffe0b5214f600396abff04529215a","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:55469) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-849425816b8050cc","identity_present":true,"record_id":"r-gs3743","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3144,"in_scope_payload_sha256":"f0253c5acd49c61b9d762d0572a714ada89c430b222d9842aa3795152aa2c2f5","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:56262) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8ab61d73c22d675b","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3199,"in_scope_payload_sha256":"b6db6275536c6b5b5a5ccdb2b4269ed39869bcc4641ee754c98bf9b05456e5bf","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:57113) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8e59d287bd2f9248","identity_present":true,"record_id":"r-gs45p48fix","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3235,"in_scope_payload_sha256":"5a2b8fcc01d2d5435d40ee361516eb33d4124646fe2c73e3dedee448768caf27","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:57948) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8fc3d2ec14b1c078","identity_present":true,"record_id":"r-gs0006","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1788,"in_scope_payload_sha256":"9c8cd908818050e42eff7082edf9b3b434912105d3db00c6754e298698850ddc","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:58794) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-9387c3b68473bda9","identity_present":true,"record_id":"r-gs0002","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2513,"in_scope_payload_sha256":"4aeccdca24394a4393dda7246d9fc3752918a3f9717b4acc2622703adab391ad","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:59656) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-9c974f0a8436c03e","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3235,"in_scope_payload_sha256":"5a2b8fcc01d2d5435d40ee361516eb33d4124646fe2c73e3dedee448768caf27","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:60545) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-9cc0a659cfa12205","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3144,"in_scope_payload_sha256":"f0253c5acd49c61b9d762d0572a714ada89c430b222d9842aa3795152aa2c2f5","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:61455) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-9f9eb817a08ae4c9","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3144,"in_scope_payload_sha256":"f0253c5acd49c61b9d762d0572a714ada89c430b222d9842aa3795152aa2c2f5","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:62980) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a2ad4b77ea6a9a3b","identity_present":true,"record_id":"r-undval63","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1306,"in_scope_payload_sha256":"251042e6a71ab5ec91e76ebbd157c7a575bb50862acaa71e24f803f974d3eb05","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:64050) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a2dbaee9c683ea83","identity_present":true,"record_id":"r-gs0002","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2513,"in_scope_payload_sha256":"4aeccdca24394a4393dda7246d9fc3752918a3f9717b4acc2622703adab391ad","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:64857) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a5b9e9e48752467e","identity_present":true,"record_id":"r-gsart54","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:65748) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a7b04c5208e493e4","identity_present":true,"record_id":"r-f9score12","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3278,"in_scope_payload_sha256":"7b6d51aec32ac1a54b954cab55ba18ffca62b75fd0e0d36faefb8fe90f34b33c","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:66635) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a9ec5cd512c7c2c7","identity_present":true,"record_id":"r-gs6c03","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:67449) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a9edac0b4d0f80a8","identity_present":true,"record_id":"r-gs45p48fix","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3235,"in_scope_payload_sha256":"5a2b8fcc01d2d5435d40ee361516eb33d4124646fe2c73e3dedee448768caf27","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:68396) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-ada5ec890a36e5b2","identity_present":true,"record_id":"r-gse411","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:69244) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-aec71c78e9675ad3","identity_present":true,"record_id":"r-adr11btf","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1330,"in_scope_payload_sha256":"515ff3a593cb651ad2d9f411ae476d63e69af93b9a2bed357270861cd19ae57e","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:70147) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-b0282a5d21a52335","identity_present":true,"record_id":"r-gl0001","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":true,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":1449,"in_scope_payload_sha256":"bec8e1eb4791e7faddbd050e85c7edd532f00022d97feb0eef8b6eaf066d92d0","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:70963) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-b3568fcfe78e5aab","identity_present":true,"record_id":"r-gsf512","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:71788) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-b9bba3d1416828fa","identity_present":true,"record_id":"r-gs4a01","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3248,"in_scope_payload_sha256":"602c60beeb2d35a0ac66bd5fe34cf7bdf6432912f8ab910b33d0beff4f5a8ca0","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:72338) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-badec4c4ee9efb2a","identity_present":true,"record_id":"r-clorder","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2390,"in_scope_payload_sha256":"d416543e7b23e1938268d0c7b2d001180795d43ab620009c73a542fd6f51412c","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:72605) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-bef9b4e179c50fe8","identity_present":true,"record_id":"r-gs0005","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2856,"in_scope_payload_sha256":"67c2dad32c2ed8459c41074bde265e00e0b6b9e683cde9beb05563268c464aaa","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:72857) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c08dac879bbde6a4","identity_present":true,"record_id":"r-rel030fix","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:73136) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c27e59f236ed7496","identity_present":true,"record_id":"r-gs45p48fix","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3235,"in_scope_payload_sha256":"5a2b8fcc01d2d5435d40ee361516eb33d4124646fe2c73e3dedee448768caf27","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:73429) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c38d520fe83cb7d5","identity_present":true,"record_id":"r-gs4a01","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3248,"in_scope_payload_sha256":"602c60beeb2d35a0ac66bd5fe34cf7bdf6432912f8ab910b33d0beff4f5a8ca0","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:73738) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c8e57b42ac2635de","identity_present":true,"record_id":"r-adr10st","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1650,"in_scope_payload_sha256":"73391bba47b26bf0fdb79766eb9fa9258f446a39d57a3adead90c74d3e6920f6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:74489) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c976dc2332d4adab","identity_present":true,"record_id":"r-gs4a01","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3248,"in_scope_payload_sha256":"602c60beeb2d35a0ac66bd5fe34cf7bdf6432912f8ab910b33d0beff4f5a8ca0","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:75299) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-cadfb63755c3f504","identity_present":true,"record_id":"r-gs5b02","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3296,"in_scope_payload_sha256":"d0a33d22d5cda91b018171ad4cf8c60bebc9a657740c95866474550b3cdc5b23","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:76119) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d56e88f5ef1b62cb","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2009,"in_scope_payload_sha256":"8bd759f1d5ff3e4761e29444848e43f00f1ffe0b5214f600396abff04529215a","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:76930) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d5b3514664089aef","identity_present":true,"record_id":"r-gs0004","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3166,"in_scope_payload_sha256":"4e836c99f6ec80eb9565d3a397fe4437af9ceef8fd7f817e36b8694d52d71697","out_of_scope_payload_bytes":1449,"exit_code":0,"stderr":"(node:77738) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d9887355b9eff3e9","identity_present":true,"record_id":"r-gs0006","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1788,"in_scope_payload_sha256":"9c8cd908818050e42eff7082edf9b3b434912105d3db00c6754e298698850ddc","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:78536) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-dc67b4d3b699b947","identity_present":true,"record_id":"r-gl0001","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":true,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":1449,"in_scope_payload_sha256":"bec8e1eb4791e7faddbd050e85c7edd532f00022d97feb0eef8b6eaf066d92d0","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:79333) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-df6bfd03300910e2","identity_present":true,"record_id":"r-cat5860","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3199,"in_scope_payload_sha256":"b6db6275536c6b5b5a5ccdb2b4269ed39869bcc4641ee754c98bf9b05456e5bf","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:80154) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-e25462e19110c9eb","identity_present":true,"record_id":"r-metadata52","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3232,"in_scope_payload_sha256":"daa440e0c5cb4235b28fbf88553b689cd4f8cb3eac93eaf5a9474e85af89b8cc","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:80987) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-e5a87ee0d8e99a1e","identity_present":true,"record_id":"r-gse411","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3137,"in_scope_payload_sha256":"586d0bcfe47aa48e14ef5603e4eb6f04f780530bf2c0f8c5cc58a71db638e8d6","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:81825) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-e82c306ec9e425b2","identity_present":true,"record_id":"r-gs0002","ruling_visible":false,"reason_visible":true,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":2513,"in_scope_payload_sha256":"4aeccdca24394a4393dda7246d9fc3752918a3f9717b4acc2622703adab391ad","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:82170) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-ea459217291aa8a3","identity_present":true,"record_id":"r-gs45p48fix","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3235,"in_scope_payload_sha256":"5a2b8fcc01d2d5435d40ee361516eb33d4124646fe2c73e3dedee448768caf27","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:82431) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-f4404e6e27e534e5","identity_present":true,"record_id":"r-gs5b02","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3296,"in_scope_payload_sha256":"d0a33d22d5cda91b018171ad4cf8c60bebc9a657740c95866474550b3cdc5b23","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:82675) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-f75d4b634c14b66c","identity_present":true,"record_id":"r-gs5b02","ruling_visible":false,"reason_visible":true,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3296,"in_scope_payload_sha256":"d0a33d22d5cda91b018171ad4cf8c60bebc9a657740c95866474550b3cdc5b23","out_of_scope_payload_bytes":3166,"exit_code":0,"stderr":"(node:82938) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-002ffd1e428c572a","identity_present":true,"record_id":"r-e0b001","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2518,"in_scope_payload_sha256":"011630bef95ef4eb8d19dd0dc43cc4161a833481c3a2c242fca1c738a4676be9","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:83288) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-00b9b5b83c4ddf87","identity_present":true,"record_id":"r-redfileperiod","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3244,"in_scope_payload_sha256":"aa9f579c0aac748a65e7ae083006ce56d3a85457711890783f6efa5c43dcb789","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:83619) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-04c1de5e41d66868","identity_present":true,"record_id":"r-e0b003","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2481,"in_scope_payload_sha256":"e438890ff7b5bb8ee0f69619d0dabadf625c61ff410fa6b5b5dbd3e3f2c8b080","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:83955) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-09c4183e165a4da4","identity_present":true,"record_id":"r-e0b001b","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3157,"in_scope_payload_sha256":"1f985640f929a98bed0274864a202aa98d6a9eb5f168100f96b97e5a0f302d83","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:86169) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-0bc581744204a282","identity_present":true,"record_id":"r-e0b002","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2524,"in_scope_payload_sha256":"f6a4ed5f4fdb2645581653e355b080552c9944b0cfb0901385f59f69c6ccae55","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:88451) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-0f8cd38c8ba43cfe","identity_present":true,"record_id":"r-collectionbudget","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3302,"in_scope_payload_sha256":"05fec5f62bd646d200926f6db1583854074b1da67e60b3a89c58e1e3ef6f05dc","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:90669) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-12b0486cd77dd3a9","identity_present":true,"record_id":"r-e0a002b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2494,"in_scope_payload_sha256":"a143f6742806e4607e30c9262b74ac21d86a54d81f970e4c6e49178e4f11788d","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:92862) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-14a911a7f4c96afb","identity_present":true,"record_id":"r-e0b003c","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3131,"in_scope_payload_sha256":"594af912dee37d29def40709d2d5c490e63c730d25e0b6336bfb7adf9185b3ac","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:94946) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-163c7d58d0692423","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3226,"in_scope_payload_sha256":"cc9fa0556101d081155c2bd763c8360545e0ffaacd1962fd36abdbcb5e3d24df","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:97001) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-1a5dea10137de7da","identity_present":true,"record_id":"r-e0a001c","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1733,"in_scope_payload_sha256":"7f463b18d1d01ad31bffa8c4bbb09b2533a8e9596be01c4d7f4e363ed2ba8b4e","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:99073) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-1bc2a34840360fd0","identity_present":true,"record_id":"r-e0a002","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3148,"in_scope_payload_sha256":"e9abd73d16f64dfa311550f0b36c2e98918dcecf7e381d45680bc8e03772e1d8","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:1392) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-23ba99c6da04e46f","identity_present":true,"record_id":"r-e0b002","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2524,"in_scope_payload_sha256":"f6a4ed5f4fdb2645581653e355b080552c9944b0cfb0901385f59f69c6ccae55","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:3515) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-261cdc76929d85cc","identity_present":true,"record_id":"r-e0a002b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2494,"in_scope_payload_sha256":"a143f6742806e4607e30c9262b74ac21d86a54d81f970e4c6e49178e4f11788d","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:5400) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-2cadeedf7d7f2251","identity_present":true,"record_id":"r-e0b001","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2518,"in_scope_payload_sha256":"011630bef95ef4eb8d19dd0dc43cc4161a833481c3a2c242fca1c738a4676be9","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:7482) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-32281c33a0cd1d51","identity_present":true,"record_id":"r-e0b002","ruling_visible":false,"reason_visible":true,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":2524,"in_scope_payload_sha256":"f6a4ed5f4fdb2645581653e355b080552c9944b0cfb0901385f59f69c6ccae55","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:9161) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-34aef026d81c2f6b","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3300,"in_scope_payload_sha256":"e65bbf8c266b90a4d3918919887faed4ad8ba28e87c6b9a730a6e520c270f911","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:11288) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-3a462c35336b7325","identity_present":true,"record_id":"r-e0a002","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3148,"in_scope_payload_sha256":"e9abd73d16f64dfa311550f0b36c2e98918dcecf7e381d45680bc8e03772e1d8","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:13701) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-4b7ef509f0403505","identity_present":true,"record_id":"r-e0a001c","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1733,"in_scope_payload_sha256":"7f463b18d1d01ad31bffa8c4bbb09b2533a8e9596be01c4d7f4e363ed2ba8b4e","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:15951) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-50c24e701b7ba2ef","identity_present":true,"record_id":"r-collectionbudget","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3302,"in_scope_payload_sha256":"05fec5f62bd646d200926f6db1583854074b1da67e60b3a89c58e1e3ef6f05dc","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:17674) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-575de52ba54d6758","identity_present":true,"record_id":"r-resolverpage","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3118,"in_scope_payload_sha256":"8a92bc6f0ff06520e0ce185e0d5efecd420aea792e2842daba45b2a9011c6b16","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:19165) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-5eb2760a3fa148f3","identity_present":true,"record_id":"r-completioneffect","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3290,"in_scope_payload_sha256":"626d13a4d450d9e48d4e4816818444b4a3499e1b9f2fc06daa49797894eddc84","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:20319) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-5f6e3fcc52a2df1d","identity_present":true,"record_id":"r-d0004c","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3304,"in_scope_payload_sha256":"96fc1ead3b5bd55bcaac9f96bae52db747ef709c499d9d2d72ad1cfe17d5fc21","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:21736) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-60e3f694ae5ca2d5","identity_present":true,"record_id":"r-e0a003","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3112,"in_scope_payload_sha256":"96316916a41f86c99ded6c02fb8d4d3b090dcd5be7eaca8ec8cbb7eca68f9c87","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:22893) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-7362d21baaf5d618","identity_present":true,"record_id":"r-e0a003b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3112,"in_scope_payload_sha256":"96316916a41f86c99ded6c02fb8d4d3b090dcd5be7eaca8ec8cbb7eca68f9c87","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:24057) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8001a8835a9351e3","identity_present":true,"record_id":"r-e0b001","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2518,"in_scope_payload_sha256":"011630bef95ef4eb8d19dd0dc43cc4161a833481c3a2c242fca1c738a4676be9","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:25061) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-82ae5492d09483d9","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3290,"in_scope_payload_sha256":"626d13a4d450d9e48d4e4816818444b4a3499e1b9f2fc06daa49797894eddc84","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:26085) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-841244a354bd70c7","identity_present":true,"record_id":"r-e0a003b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3112,"in_scope_payload_sha256":"96316916a41f86c99ded6c02fb8d4d3b090dcd5be7eaca8ec8cbb7eca68f9c87","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:26975) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-843485d931913281","identity_present":true,"record_id":"r-e0b003b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1964,"in_scope_payload_sha256":"717d52fa41e79014e46950e4f1b7fe1bdb7e58f575ced078940f692a3ec75440","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:28206) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-88299d9c1503bc7b","identity_present":true,"record_id":"r-completioneffect","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3290,"in_scope_payload_sha256":"626d13a4d450d9e48d4e4816818444b4a3499e1b9f2fc06daa49797894eddc84","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:29495) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-89d86d3677fb18ef","identity_present":true,"record_id":"r-e0a001d","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3226,"in_scope_payload_sha256":"cc9fa0556101d081155c2bd763c8360545e0ffaacd1962fd36abdbcb5e3d24df","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:31017) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8c7fdf80ae6c6f2e","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3290,"in_scope_payload_sha256":"626d13a4d450d9e48d4e4816818444b4a3499e1b9f2fc06daa49797894eddc84","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:32493) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8f24735524874167","identity_present":true,"record_id":"r-e0b003","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2481,"in_scope_payload_sha256":"e438890ff7b5bb8ee0f69619d0dabadf625c61ff410fa6b5b5dbd3e3f2c8b080","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:33840) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-915f4e606299276c","identity_present":true,"record_id":"r-e0a003","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3112,"in_scope_payload_sha256":"96316916a41f86c99ded6c02fb8d4d3b090dcd5be7eaca8ec8cbb7eca68f9c87","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:35513) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-975a69717305d00f","identity_present":true,"record_id":"r-e0a001b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3287,"in_scope_payload_sha256":"6345bc20194709feceaeaa7d2d327f305fb4ba07baeed34f2d52c3306c65ca39","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:37068) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-9b42b1951da730e1","identity_present":true,"record_id":"r-e0a001","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2350,"in_scope_payload_sha256":"921142daba740b1ae84dac53c7cc6cf83239828b2e1ea7fd6402e2fae9d5c8ca","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:38336) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a0489f4a19bc3969","identity_present":true,"record_id":"r-e0b003b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1964,"in_scope_payload_sha256":"717d52fa41e79014e46950e4f1b7fe1bdb7e58f575ced078940f692a3ec75440","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:39699) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a2acb02e41d42051","identity_present":true,"record_id":"r-d0011gate","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3172,"in_scope_payload_sha256":"9272a26d11f58f3280411fe3978d687eaf08f0e6b555be7c1df8a2f4b17b4d21","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:40976) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a3705f2f819df548","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":871,"in_scope_payload_sha256":"73fb55600838caedde33f93f63b8a0fba12e6b8b189627447bd60069d39932a5","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:42363) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a3d2b14112b034a4","identity_present":true,"record_id":"r-resolverpage","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3118,"in_scope_payload_sha256":"8a92bc6f0ff06520e0ce185e0d5efecd420aea792e2842daba45b2a9011c6b16","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:43707) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-ad1efe720ca11f3c","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3226,"in_scope_payload_sha256":"cc9fa0556101d081155c2bd763c8360545e0ffaacd1962fd36abdbcb5e3d24df","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:45007) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-b525ee2c84544b9e","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3226,"in_scope_payload_sha256":"cc9fa0556101d081155c2bd763c8360545e0ffaacd1962fd36abdbcb5e3d24df","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:46391) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-bed5fc386048e412","identity_present":true,"record_id":"r-d0004authority","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1522,"in_scope_payload_sha256":"8f043419540d69db7e3432a053e1e74ef1d2b4f0b030316842a7189ecbd8e63b","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:47755) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c15e92a3b1a755d4","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3300,"in_scope_payload_sha256":"e65bbf8c266b90a4d3918919887faed4ad8ba28e87c6b9a730a6e520c270f911","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:49040) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c20a082f262f21c8","identity_present":true,"record_id":"r-e0b003","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2481,"in_scope_payload_sha256":"e438890ff7b5bb8ee0f69619d0dabadf625c61ff410fa6b5b5dbd3e3f2c8b080","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:50394) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c61d7c943edd8cff","identity_present":true,"record_id":"r-e0b001b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3157,"in_scope_payload_sha256":"1f985640f929a98bed0274864a202aa98d6a9eb5f168100f96b97e5a0f302d83","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:51665) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-cc76268ad4bb9a3e","identity_present":true,"record_id":"r-d0011census","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1384,"in_scope_payload_sha256":"f4b748c386b2c572d52f459eaae49919ac57167c2378eb082eaedf3bbba1c9d2","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:53024) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-ce2adee3c134ab03","identity_present":true,"record_id":"r-e0b001b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3157,"in_scope_payload_sha256":"1f985640f929a98bed0274864a202aa98d6a9eb5f168100f96b97e5a0f302d83","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:54409) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d47951eaaa562775","identity_present":true,"record_id":"r-d0004ccatalog","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3304,"in_scope_payload_sha256":"96fc1ead3b5bd55bcaac9f96bae52db747ef709c499d9d2d72ad1cfe17d5fc21","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:55649) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d4b46b8cf85b5425","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3300,"in_scope_payload_sha256":"e65bbf8c266b90a4d3918919887faed4ad8ba28e87c6b9a730a6e520c270f911","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:56893) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-dd4a74ba2b628991","identity_present":true,"record_id":"r-e0a001","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2350,"in_scope_payload_sha256":"921142daba740b1ae84dac53c7cc6cf83239828b2e1ea7fd6402e2fae9d5c8ca","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:58241) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-e0d8d11b190e4e26","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3300,"in_scope_payload_sha256":"e65bbf8c266b90a4d3918919887faed4ad8ba28e87c6b9a730a6e520c270f911","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:59565) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-e238e7785a6466b5","identity_present":true,"record_id":"r-e0a001","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2350,"in_scope_payload_sha256":"921142daba740b1ae84dac53c7cc6cf83239828b2e1ea7fd6402e2fae9d5c8ca","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:60852) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-e2c33042f79e2776","identity_present":true,"record_id":"r-e0a002b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2494,"in_scope_payload_sha256":"a143f6742806e4607e30c9262b74ac21d86a54d81f970e4c6e49178e4f11788d","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:62175) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-e3aa102492b031b1","identity_present":true,"record_id":"r-e0a003","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3112,"in_scope_payload_sha256":"96316916a41f86c99ded6c02fb8d4d3b090dcd5be7eaca8ec8cbb7eca68f9c87","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:63524) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-e7587b2b65750306","identity_present":true,"record_id":"r-e0a001b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3287,"in_scope_payload_sha256":"6345bc20194709feceaeaa7d2d327f305fb4ba07baeed34f2d52c3306c65ca39","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:64775) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-ece19dc4cef7c803","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":888,"in_scope_payload_sha256":"d25c769868f2145bbf54bc9fea58089ff82d2e0dd5eb45f7a688099fa6d55053","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:66116) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-f691593763c944c4","identity_present":true,"record_id":"r-e0a002","ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3148,"in_scope_payload_sha256":"e9abd73d16f64dfa311550f0b36c2e98918dcecf7e381d45680bc8e03772e1d8","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:67456) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-f83f6dbc19155e50","identity_present":true,"record_id":"r-e0a001b","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3287,"in_scope_payload_sha256":"6345bc20194709feceaeaa7d2d327f305fb4ba07baeed34f2d52c3306c65ca39","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:68813) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-02764fbf10ceedc1","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3005,"in_scope_payload_sha256":"d8ec056607b107d6caa74e8363538c1718016bdb9b6c6d60aed6c8f70b5caa8d","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:69994) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-0d2959b1d2bbcec0","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2387,"in_scope_payload_sha256":"9eb9562a00386563766ab4eec3b0d37efad99cf30676cba98bcaf6d8ded57972","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:70453) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-0e840c8816f442f7","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2387,"in_scope_payload_sha256":"9eb9562a00386563766ab4eec3b0d37efad99cf30676cba98bcaf6d8ded57972","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:71199) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-129a3640dab8b53d","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1243,"in_scope_payload_sha256":"72132563feae5aa18f417a08bb0f73901b3f1a07e0ebc705641f740bcef8a6e1","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:72032) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-132048855f4d7a5d","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3263,"in_scope_payload_sha256":"f5ed4d26baefe9eeb6256c9a20e9c376a31eac5eb5aedec281ca8d80429bf82b","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:73817) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-218954b5ef6d08d7","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2701,"in_scope_payload_sha256":"4791cd03444cd6c0a4e156bb384ef9da99cca3ea46732b15f5466a449dff8524","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:75126) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-25eb689fdb9ad98b","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1781,"in_scope_payload_sha256":"cba56026922aaaaba7543d5b497c561e6c97f9f2a40bcbf2a4f81f62dca0d947","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:75944) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-2714c211175c4737","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1836,"in_scope_payload_sha256":"3d58e27d5a5a473d43d7bbc65ac0793ff1a858a24906d774fa08598f0d012bac","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:76760) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-2756fbb39f4afc15","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1689,"in_scope_payload_sha256":"9a0fb1e877fa55d30f4735d6e48bc4a029179a87ed4647d85943c15471d03fbd","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:77602) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-277e883c8a9d3eec","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1339,"in_scope_payload_sha256":"dfcdcf655fd9fae6d18436106f819e2d9ed7e30e593e67ab9aea125c422e1f9d","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:78443) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-2853e493f4781414","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1611,"in_scope_payload_sha256":"28c72915b0db73d2946198f087924e7a61c32330cc9ecccca83ba37d62b01441","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:79251) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-29c6beda0309a747","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1836,"in_scope_payload_sha256":"3d58e27d5a5a473d43d7bbc65ac0793ff1a858a24906d774fa08598f0d012bac","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:79913) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-29c79faa31cc4fe2","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2701,"in_scope_payload_sha256":"4791cd03444cd6c0a4e156bb384ef9da99cca3ea46732b15f5466a449dff8524","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:80311) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-2aee6afaad42b119","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1243,"in_scope_payload_sha256":"72132563feae5aa18f417a08bb0f73901b3f1a07e0ebc705641f740bcef8a6e1","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:80726) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-304262d2dae79858","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2918,"in_scope_payload_sha256":"0172d1d66b568da4219d20a4bd351eb1e5f668903f8789a04dcca1c752c0c014","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:81192) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-30b8d25980ce48a3","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2701,"in_scope_payload_sha256":"4791cd03444cd6c0a4e156bb384ef9da99cca3ea46732b15f5466a449dff8524","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:81599) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-5a1a7e7a347c6cc0","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2515,"in_scope_payload_sha256":"5246a811d126da0bca48112df2d57be625464688ca240a772ca251c7aa0bc310","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:82014) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-632dec3f10f1e65b","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1795,"in_scope_payload_sha256":"413ddab55be3e761d8640dcb32411150cf7ef59e6bcf550293e9a85257267e8a","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:82575) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-67ab88f48731b3f1","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2053,"in_scope_payload_sha256":"64ac0f51cfc87d52fc3ed9c85aa51fb932cf3830b9c0726367038baf2760098a","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:82976) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-710b1008c427461f","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1469,"in_scope_payload_sha256":"74c4fac587b61eebf4aae500719eb75bc6f69bff1bc2a9b6431e1dd93cc6bf26","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:83368) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-748bedfbbe5fe417","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2918,"in_scope_payload_sha256":"0172d1d66b568da4219d20a4bd351eb1e5f668903f8789a04dcca1c752c0c014","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:84045) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-865d5bb5450bc905","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1279,"in_scope_payload_sha256":"52e2c106c0dc699f340dbff8b981410e396df82a3beed9ecb88c3bda5348199f","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:84854) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8ea4400a37180162","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":825,"in_scope_payload_sha256":"10c5f48f4fb442e88074901381970b1789b0b234cb6abe0f6675197a6513cd04","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:85629) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8f7493456cee37a3","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2053,"in_scope_payload_sha256":"64ac0f51cfc87d52fc3ed9c85aa51fb932cf3830b9c0726367038baf2760098a","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:86355) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-959435801c3ef505","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2918,"in_scope_payload_sha256":"0172d1d66b568da4219d20a4bd351eb1e5f668903f8789a04dcca1c752c0c014","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:87177) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-97dfb7f923f08d18","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2290,"in_scope_payload_sha256":"4893178ed9922e2f3c79742dfb85c29d79ca39ee74e006b8865e81d51023fd68","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:88038) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a0550761c1997566","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2115,"in_scope_payload_sha256":"78ded1d6318e0fbaed74d367d5a8fd95f7541508f2603785ad24a5535002c620","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:88836) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a2ab2ce0394ace90","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1689,"in_scope_payload_sha256":"9a0fb1e877fa55d30f4735d6e48bc4a029179a87ed4647d85943c15471d03fbd","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:92940) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-ae1693443c4f039f","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2826,"in_scope_payload_sha256":"8ead43c7e107ecbf4a478d46268d2ddcee1c416d4f6c46b1f3115befc3d72390","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:1215) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-aea1ebe08b663d1c","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2387,"in_scope_payload_sha256":"9eb9562a00386563766ab4eec3b0d37efad99cf30676cba98bcaf6d8ded57972","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:10245) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-b62d3f38467138a5","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2996,"in_scope_payload_sha256":"97179ec3c3c9cd66667be433c8ea7835c7088bbb0bf28fff99b536fa69179b92","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:19679) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-cccd3e7fae599767","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3263,"in_scope_payload_sha256":"f5ed4d26baefe9eeb6256c9a20e9c376a31eac5eb5aedec281ca8d80429bf82b","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:28541) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d171f3ea2a7f7362","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1661,"in_scope_payload_sha256":"e5f8a85a2463e0100d71e464adbc275cb90a72e8a680a4e9cfb19a6b2a7cb888","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:37310) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d7d1121164366d9c","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1611,"in_scope_payload_sha256":"28c72915b0db73d2946198f087924e7a61c32330cc9ecccca83ba37d62b01441","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:44107) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-dd97491c4d227316","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1661,"in_scope_payload_sha256":"e5f8a85a2463e0100d71e464adbc275cb90a72e8a680a4e9cfb19a6b2a7cb888","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:52851) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-de1096e077fa22d6","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2918,"in_scope_payload_sha256":"0172d1d66b568da4219d20a4bd351eb1e5f668903f8789a04dcca1c752c0c014","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:61303) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-de409d80b116c6ee","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2115,"in_scope_payload_sha256":"78ded1d6318e0fbaed74d367d5a8fd95f7541508f2603785ad24a5535002c620","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:69768) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-eef995b442c7a008","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2595,"in_scope_payload_sha256":"6937c72bed0dc5c16a2a376e88ec28a44190e21f99c1393adaabeeedd160849e","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:79721) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-f05b91620a25eee7","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2115,"in_scope_payload_sha256":"78ded1d6318e0fbaed74d367d5a8fd95f7541508f2603785ad24a5535002c620","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:88345) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-f0ea9a2a5b68115b","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2918,"in_scope_payload_sha256":"0172d1d66b568da4219d20a4bd351eb1e5f668903f8789a04dcca1c752c0c014","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:95430) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-f149c003cc5dae5d","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1781,"in_scope_payload_sha256":"cba56026922aaaaba7543d5b497c561e6c97f9f2a40bcbf2a4f81f62dca0d947","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:2574) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-f51f8964286329bb","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1502,"in_scope_payload_sha256":"d7657ac94505e6475e2a20482e3f31ecd7db720f6f7e503cac3b1e5f68d5833c","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:9202) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-fd7263067698db44","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1339,"in_scope_payload_sha256":"dfcdcf655fd9fae6d18436106f819e2d9ed7e30e593e67ab9aea125c422e1f9d","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:14861) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-0d7c38f6a60e8b36","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2249,"in_scope_payload_sha256":"d4bcc8c3dd495e01136ec89abdffb29dd804a5267e911b635bca6f694dc8e5e9","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:23334) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-0ef57b3438b7d16b","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1542,"in_scope_payload_sha256":"dcf3d5c1ed8bc0b3942473e2c1714831d67640898789ac5a83bd6ae8ced78cd1","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:32986) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-0ef8cafdf0d11499","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2037,"in_scope_payload_sha256":"5f31b586d7f29f53593d7c75381cde8fdefcf5e97f53ccfbf6d5a2ec8d0a0675","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:40127) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-120b48f40e73f330","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1200,"in_scope_payload_sha256":"2dc760087cb0b5d5a3692eaa6dfb29062bf94045d632de6f8239786c4b2ad40a","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:46781) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-1a18ceae8a4645cf","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2249,"in_scope_payload_sha256":"d4bcc8c3dd495e01136ec89abdffb29dd804a5267e911b635bca6f694dc8e5e9","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:53058) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-23f26b69f816664d","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":987,"in_scope_payload_sha256":"6782600f19bf10abd6a154aec96d625f7cf22068b401e04e09a708db0ae3448c","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:57056) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-3ba6d8b1fa31e10f","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1039,"in_scope_payload_sha256":"a13e526e796f1608187a0abce7438c582dee837fa426a2958516d618f5a9d1b4","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:62112) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-4001fa0211128649","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1614,"in_scope_payload_sha256":"fa7f4e532067db7e03882e4c1333c10238238d789a289564efbdecf2c55e48b7","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:66854) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-431dceed9013cb2b","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":1181,"in_scope_payload_sha256":"628dc0d97d1d8df760690e22a12aa8fe24fe8814b3a3cf179d7f293b18c678c3","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:72663) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-45caf6be5b46889d","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2249,"in_scope_payload_sha256":"d4bcc8c3dd495e01136ec89abdffb29dd804a5267e911b635bca6f694dc8e5e9","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:77268) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-50d2354c5c9210d1","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2037,"in_scope_payload_sha256":"5f31b586d7f29f53593d7c75381cde8fdefcf5e97f53ccfbf6d5a2ec8d0a0675","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:83085) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-56a540b834736c43","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2025,"in_scope_payload_sha256":"c61eb806d6458e129a6afbf6324f0d2094a2f0bc375d032a2354b4da40da646c","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:87794) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-5b3c19da588ec1d0","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2025,"in_scope_payload_sha256":"c61eb806d6458e129a6afbf6324f0d2094a2f0bc375d032a2354b4da40da646c","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:91903) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-6ace14eeff8e0235","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1185,"in_scope_payload_sha256":"b432e5b71df3099ac6b30093a1298ed757f0749e214d1c2eaff528e185d78e92","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:95408) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-6fa12e79e96b6cc1","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1982,"in_scope_payload_sha256":"d1c443cbcf7aa83d5793e5771a7c4475aeae0ea2b6bf1b32ec70e8ee67a76c4c","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:97996) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-77018bc628e62482","identity_present":true,"record_id":"r-p014live20260814","ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":954,"in_scope_payload_sha256":"8fea18e35fc34665b3ec501dfb0d20dcc2215687da959ef69d1e30f63f1470c0","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:99898) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-83c6c0a5f5542b97","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":2025,"in_scope_payload_sha256":"c61eb806d6458e129a6afbf6324f0d2094a2f0bc375d032a2354b4da40da646c","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:1949) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8826ee094751e0ef","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2039,"in_scope_payload_sha256":"98df550ac3a51d93834046b66fd07a4fa4af9a616f0a39203200c520348c3791","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:3599) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-8dbd6ece65df6bf7","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2039,"in_scope_payload_sha256":"98df550ac3a51d93834046b66fd07a4fa4af9a616f0a39203200c520348c3791","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:4983) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a0bf288e0dd97d24","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1993,"in_scope_payload_sha256":"13285bea0b437a655c450df87bb7e47b935b1e4a3b0e62977b8023aefae4b4d7","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:6467) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-a6950ee840587dbc","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":2039,"in_scope_payload_sha256":"98df550ac3a51d93834046b66fd07a4fa4af9a616f0a39203200c520348c3791","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:7941) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-ac85b82316ac5980","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3228,"in_scope_payload_sha256":"d45f8e7c56b0d11c2ae453a71d6050ef01606d01a5380269f630050d1e96cad0","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:9481) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-b4647e5b48ad0f67","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":1288,"in_scope_payload_sha256":"dbbe83d0b1f83d84ca346b8485dc6529b57f3c637b3aefae912f6b9a589211a4","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:10991) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-b48724ec04025b41","identity_present":false,"record_id":null,"ruling_visible":false,"reason_visible":false,"before_first_mutation":true,"scope_correct":false,"lifecycle_correct":false,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":2039,"in_scope_payload_sha256":"98df550ac3a51d93834046b66fd07a4fa4af9a616f0a39203200c520348c3791","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:12487) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-bd395d87b2865263","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":912,"in_scope_payload_sha256":"9798c4d0bf2f785be9dc1bc0544edde5ea567009d5152766a1301a09c357afc9","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:14023) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c25228afc16748b3","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2037,"in_scope_payload_sha256":"5f31b586d7f29f53593d7c75381cde8fdefcf5e97f53ccfbf6d5a2ec8d0a0675","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:15442) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-c8feb84e83c19266","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1217,"in_scope_payload_sha256":"5b002f6d6a5c06e6e9011c22cd26a3adbbd81c4f0a95712cc2d31874754175a1","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:16887) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-cb7c81aa3e7a1d8c","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2602,"in_scope_payload_sha256":"e4083dcba6666767dda3ab27017da291a17166854dbde3e96a9c2a8af5be13d3","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:18338) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-cf7752a9fa65978e","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1288,"in_scope_payload_sha256":"dbbe83d0b1f83d84ca346b8485dc6529b57f3c637b3aefae912f6b9a589211a4","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:19849) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d3094729cb02a074","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3271,"in_scope_payload_sha256":"e3a70f12c386be7bf7af0ebb69040b58794dae4bcf4f4df19f855012f0d5d5df","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:21315) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d3c77723a8e09894","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":false,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":false,"in_scope_payload_bytes":3271,"in_scope_payload_sha256":"e3a70f12c386be7bf7af0ebb69040b58794dae4bcf4f4df19f855012f0d5d5df","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:23176) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-d61d9c73e11754bc","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3228,"in_scope_payload_sha256":"d45f8e7c56b0d11c2ae453a71d6050ef01606d01a5380269f630050d1e96cad0","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:24941) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-db58634970ebbdf7","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":3228,"in_scope_payload_sha256":"d45f8e7c56b0d11c2ae453a71d6050ef01606d01a5380269f630050d1e96cad0","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:26602) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-ded1bcf6f444c76d","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":1288,"in_scope_payload_sha256":"dbbe83d0b1f83d84ca346b8485dc6529b57f3c637b3aefae912f6b9a589211a4","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:28235) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} +{"candidate_id":"v4-e5b4843efae58483","identity_present":false,"record_id":null,"ruling_visible":true,"reason_visible":true,"before_first_mutation":true,"scope_correct":true,"lifecycle_correct":true,"stale_as_current":false,"delivered":true,"in_scope_payload_bytes":2273,"in_scope_payload_sha256":"ade78cd537cf7cefd74b3f7762231ded08db277d8299f7d8350849d9a8223b7c","out_of_scope_payload_bytes":0,"exit_code":0,"stderr":"commitlore: the notes mirror has not been fetched here, so this answer may be missing records that exist upstream (git fetch does not fetch refs/notes/commitlore by default). fix: commitlore doctor --fix, then git fetch\n(node:29809) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)"} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/provenance-audit.jsonl b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/provenance-audit.jsonl new file mode 100644 index 00000000..803d913f --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/provenance-audit.jsonl @@ -0,0 +1,241 @@ +{"schema_version":1,"candidate_id":"v4-00efc0041ed3118a","repository_id":"gitseed","source_commit_sha":"13b51f0cef3785cd33f3863fb74d33264b09e189","decision_audit_anchor":"00efc0041ed3118a9c3f00dbf1e66e3fb2c03edf9fdb6e0bb53c4156207452b0","ordinary_source":"Wait the way the server asked, and never wait zero\n\nclassify() has always treated Retry-After as evidence of a rate-limited\nresponse, and parse() never read it. GitHub signals its secondary rate limit\nthrough that header rather than through a reset timestamp, so\nseconds_until_reset computed 0 and collect(wait=True) retried at once.\nRetrying immediately into a secondary limit is how a client gets throttled\nharder or blocked, so the classification was right and the response to it\nwas the opposite of what it should have been.\n\nRetry-After is now read and preferred, with the reset timestamp as the\nfallback. No path reachable from a rate-limited classification can wait zero:\na missing header, a clock running fast, and a reset already in the past all\nland on the same non-zero fallback.\n\nThe wait is bounded so a malformed or hostile Retry-After cannot park the\nprocess, and the bound lives at the sleep call rather than inside the\ncomputation. An earlier attempt put it inside seconds_until_reset, which made\nthe artifact record \"resets in 3600s\" for a limit GitHub said resets in\n14400 — a false sentence in the durable record. What the server said and how\nlong this process is willing to wait are different questions, and one value\ncannot answer both. The message now carries the real distance and the fact\nthat the wait was capped.\n\nrun_smoke() guarded its determinism loop and left the calls after it outside\nthe boundary, so an exception from flags_malicious() escaped a function whose\nshape promises a failure result. The boundary now covers what the function\ndoes on the caller's behalf.\n\nVerified by breaking each path: removing the cap fails 1 test, removing the\ncapped-wait report fails 2, and both pass on restoration.\n","ordinary_source_sha256":"c70f3f3a9a9fce7e745d157f9850466713a5c36503d1a7736bfc9fa14a2c7381","ordinary_body_chars":1735,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":5,"insertions":150,"deletions":26,"changed_paths":["gitseed/collect/ratelimit.py","gitseed/collect/search.py","gitseed/grade/smoke.py","tests/test_collect.py","tests/test_smoke.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-03dd551058ce7aaf","repository_id":"gitseed","source_commit_sha":"6441a4b9a2a3356dc95f8b737705f9f6212119d7","decision_audit_anchor":"03dd551058ce7aaf41bac12adc80224796c5bc626d3eabe93dce9f018c3b20b7","ordinary_source":"T-213: the approval path finally ran, in a real terminal (closes #5)\n\n`collect_approval` refuses a non-tty by design: a piped `y` and a person's `y` are\nthe same bytes and opposite meanings, and accepting the first would make this tool\n`yes | gitseed run` — the automation GitHub's AUP forbids. The cost was that the\napproval path had never executed end to end. Three live attempts died before\nreaching it (a model timeout, an unencoded URL, an exhausted quota), and the README\nsaid so.\n\n`tests/test_review_cycle.py` drives the CLI under `pty`, so `isatty()` is genuinely\ntrue and nothing in production had to be relaxed. **No test-only bypass flag was\nadded.** The refusal is the feature; a flag that disables it would be switched on\nin CI within a month, and then the tool would be the thing it was designed not to\nbe.\n\nThe cycle asserted: approve one, reject another, quit before the rest; the\nrecording writer saw exactly the write the approval authorised and no other; the\nrejection produced a `Ruled-out:` carrying its reason; the printed trailer block\npasses `commitlore validate`; `--approve-all` asks once and derives one approval\nper target.\n\nOrder is asserted too — ranking, then question, then action, then trailers. A\nprompt appearing before the ranking would mean the reviewer decided without seeing\nthe evidence, and only a real terminal makes that sequence observable.\n","ordinary_source_sha256":"578d67cc55360c245cb009350df6e40308eaf9f5dea57054c13836c32852d713","ordinary_body_chars":1385,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":6,"insertions":194,"deletions":4,"changed_paths":["README.md","gitseed/cli.py","tests/fixtures/candidates.json","tests/fixtures/grades.json","tests/test_cli.py","tests/test_review_cycle.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-091571a7d13f7f36","repository_id":"gitseed","source_commit_sha":"51afac14096fc9becbfe83a51bdb8c73547b494e","decision_audit_anchor":"091571a7d13f7f364f1ad4ca49444fcf2e195844e7d4f5b67f0608201ad942f5","ordinary_source":"PRD-F2: rule out the dep signal\n","ordinary_source_sha256":"9f9b52dff66f10c52ff73d154508e22e8c04747b84c0cb43314d99ad6dc9de00","ordinary_body_chars":32,"ordinary_body_survives":false,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":2,"insertions":18,"deletions":0,"changed_paths":["docs/prd/PRD-F2-screen.md","docs/tickets/F2-screen.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-0ecd7426eebc1cab","repository_id":"gitseed","source_commit_sha":"fe69ce9d153a1f198252e945b6656679b8930f05","decision_audit_anchor":"0ecd7426eebc1cab55e7d10a9d4e1bc844f482ff3a2f0997461828463cd70adf","ordinary_source":"Name the core run ports\n","ordinary_source_sha256":"efc4d53f33b00881bc07bd6372e046346ff05a1ada0564f8b3116e9369a62b64","ordinary_body_chars":24,"ordinary_body_survives":false,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":1,"insertions":48,"deletions":0,"changed_paths":["gitseed/ports.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-0f4dfe2618796b54","repository_id":"gitseed","source_commit_sha":"b8e73dfa13b490147d555dd9f7a1c269545806e4","decision_audit_anchor":"0f4dfe2618796b54543c26d5844a650d0a7c06cc51e47928bcfdd3906df3ecc5","ordinary_source":"F3: record the deep review's smoke-gate exception-boundary gap\n\nF6's run_smoke() wraps the determinism-repeat loop over client.evaluate(...)\nin a try/except, but the subsequent _check_clean(client)/_check_malicious\n(client) calls sit outside that guard. The 2026-07-28 review of dev at\nd0e1ecd found that an exception from client.flags_malicious() -- a\nmalformed response, a timeout, a client bug -- propagates uncaught through\napplication.execute(), which calls run_smoke() unguarded, and can crash the\nwhole CLI instead of degrading to a deterministic-only artifact the way\n\"disable F3, operate with F2 only\" promises for every other smoke failure.\n","ordinary_source_sha256":"c0e35eacaa8b84e3090fbbb43dbf5032ed9835090cd6b70b13e2c8fdbc357949","ordinary_body_chars":651,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":2,"insertions":18,"deletions":0,"changed_paths":["docs/prd/PRD-F3-grade.md","docs/tickets/F3-grade.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-0f5392e7e8d2cd63","repository_id":"gitseed","source_commit_sha":"5ae484abc3e54d3fff689c98986666c320d98e12","decision_audit_anchor":"0f5392e7e8d2cd6318a713be9f342dac1574f23da859ea2dff167c5ee5a63076","ordinary_source":"Reproduce the M0 backtest with fixtures\n","ordinary_source_sha256":"fe3f06a1dca176c21c072f642148f7c110023bc81fd27dbf57304a3eb0ccf978","ordinary_body_chars":40,"ordinary_body_survives":false,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":8,"insertions":31581,"deletions":0,"changed_paths":["docs/M0-VERDICT.md","gitseed/m0.py","scripts/m0_analyze.py","scripts/m0_collect.py","tests/fixtures/m0/analysis.json","tests/fixtures/m0/samples.json","tests/fixtures/m0/search-responses.json","tests/test_m0.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-122f5e996ed8f300","repository_id":"gitseed","source_commit_sha":"538cc9def9e57ab5fe32cc0c7123e25961c2e4c4","decision_audit_anchor":"122f5e996ed8f3004cbfad12ed6a556d52718e43705626e4778835498c2784ff","ordinary_source":"Wire the SQLite run store to the CLI (#62)\n\nRadar runs append completed artifacts to a local SQLite history, with optional run IDs and correction lineage. Review persistence now runs after the approval/action path, so an unavailable store cannot bypass the GitHub-write gate.\n","ordinary_source_sha256":"15185135a8dfc8a7e986851a3684fa995cde3a362559d691def6ac624c6e03e4","ordinary_body_chars":276,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":4,"insertions":207,"deletions":1,"changed_paths":["gitseed/cli.py","gitseed/storage.py","tests/test_cli.py","tests/test_review_cycle.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-13d2137b8a6296ea","repository_id":"gitseed","source_commit_sha":"26678d1b539117dc2ebefddb052566dbb4ad9dee","decision_audit_anchor":"13d2137b8a6296ea969e324cf9c49d0fc991b150e4feebd3a01c9deff8d30df7","ordinary_source":"Supply live read adapters\n","ordinary_source_sha256":"77ba9ff33a5c8ad5a1e2567bea5d90308b22bb379d19ac1a1280999edb5d17a7","ordinary_body_chars":26,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":2,"insertions":136,"deletions":0,"changed_paths":["gitseed/adapters.py","tests/test_adapters.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-1438614686129e44","repository_id":"gitseed","source_commit_sha":"3c7f566053805c56aa946e1035de217b4b64d71b","decision_audit_anchor":"1438614686129e44dadd5c779d96fdaafbfa99d01a3da892c0de94224c2d76c4","ordinary_source":"T-11: replay stored artifacts offline\n","ordinary_source_sha256":"56f49ff530a70fefe0abb23cf6f72a0fd10ecad469dba98c3eec13be32f434b0","ordinary_body_chars":38,"ordinary_body_survives":false,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":36,"deletions":2,"changed_paths":["gitseed/storage.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-1d24e887944f0434","repository_id":"gitseed","source_commit_sha":"ee75cdcd5b64c43fb9aa4dba1d6bbe23cb6b5458","decision_audit_anchor":"1d24e887944f04349c569c3c5f90162c6bfc5fb787910f7a13aa34d476e893e7","ordinary_source":"F6: gate model availability before grading\n","ordinary_source_sha256":"9a7861bcc8f3a3d2e200171b4f952627f6a0ae19a2b9f6c9a2908688d40cde15","ordinary_body_chars":43,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":7,"insertions":198,"deletions":22,"changed_paths":["gitseed/application.py","gitseed/artifact.py","gitseed/cli.py","gitseed/pipeline/run.py","tests/test_cli.py","tests/test_seam.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-1f1cba75144b609f","repository_id":"gitseed","source_commit_sha":"f2e853540f0bb7813eca1c1d99143b62b3f7a28a","decision_audit_anchor":"1f1cba75144b609f63b07200e1e8394e70a9623681233755656fd3fe525fb86c","ordinary_source":"Genesis: gradelore — 씨앗의 아이디어는 계승하고 정책 위반은 버린다\n\nfollowme(993줄, 테스트 0, CI 0, 라이선스 없음)를 씨앗으로 재구축한다. 계승하는 것은\n\"로컬 LLM으로 GitHub 레포를 채점한다\"는 아이디어이고, 버리는 것은 그것을 실행하는\n방식이다.\n\nPhase 1 반증이 방향을 바꿨다. GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다. 씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계가 정확히 그것이다. 그래서\n읽기 전용 분석과 사람이 건건이 승인하는 리뷰 큐로 간다.\n\n재현 실험에서 내 추정이 세 번 틀렸다. 마이그레이션도 dry-run 도 씨앗에 이미 있었고,\n\"채점이 비결정적\"은 재현되지 않았다(7b 에서 idea·skill sd=0.000, n=10). 셋 다 clone\n을 읽기 전에 결함 목록을 쓴 결과다. 정정 이력은 docs/PHASE1-EVIDENCE.md 에 남겼다.\n\n남은 진짜 결함은 다른 것이었다. 씨앗은 모델이 설치됐는지만 확인하고 출력 계약을 지킬\n수 있는지는 확인하지 않는다. 1.5b 에서 깨끗한 코드의 64%(9/14)를 악성으로 판정하며\nsecurity_flag 와 security_reason 이 서로 모순된다. 7b·32b 에서는 0/14 다. 작은\n기계에서 작은 모델을 고르는 것은 합리적인데 사용자는 경고 없이 오판 도구를 쥔다.\n\nUnverified: 32b 채점 결정성 — 보안 판정만 측정했고 점수 분산은 재지 않았다\n","ordinary_source_sha256":"95bbb402d240a0fed629e1c52d0ec5b707781166ff855ea0f1aeeefeef8a092d","ordinary_body_chars":843,"ordinary_body_survives":true,"removed_trailer_count":18,"residual_record_lines_removed":0,"files_changed":12,"insertions":605,"deletions":0,"changed_paths":[".gitignore","AGENTS.md","LICENSE","docs/PHASE0.md","docs/PHASE1-EVIDENCE.md","docs/adr/ADR-0001-identity.md","docs/adr/ADR-0002-scope-v010.md","docs/adr/ADR-0003-language-runtime.md","docs/prd/PRD-F1-collect.md","docs/prd/PRD-F2-screen.md","docs/prd/PRD-F3-grade.md","docs/prd/PRD-F4-review.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-1f24c7dbe202ecd8","repository_id":"gitseed","source_commit_sha":"64fab0351cdfec26909d9afd165eade041eb3bd7","decision_audit_anchor":"1f24c7dbe202ecd8005a68909d5ff2ab09b56d5b98ac475379cc01f84dfd5ab2","ordinary_source":"Register the M0 scoring verdict first\n","ordinary_source_sha256":"71b9e12753600d1f85e978de51ca718f1181980a7f6876d356b78c99d9b356db","ordinary_body_chars":38,"ordinary_body_survives":false,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":1,"insertions":73,"deletions":0,"changed_paths":["docs/M0-PREREGISTRATION.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-2115a033e1fb37d0","repository_id":"gitseed","source_commit_sha":"986acf9629f00d512357cf5f79a5f4f8b9992e60","decision_audit_anchor":"2115a033e1fb37d0e64b4e21192cf2433f9ef9ce20dba19f5cde19503b549216","ordinary_source":"README: name the deep review's known limitations plainly\n\nv0.2.0 tagged before the 2026-07-28 review ran. GS-P0-001 means the live\nscanner never reads package.json in a real run even though the postinstall\nrule is implemented and unit-tested -- the README must not let a reader\nassume otherwise. Adds a Known limitations section naming that gap plus the\nrecommendation-semantics, coverage-cap, and dual-ranking findings, each with\nits tracking issue. The v0.2.0 GitHub release notes were updated out of\nband with the same text (gh release edit, not a repository file) so both\nsurfaces say the same thing; the release itself is not retracted or\nre-tagged.\n","ordinary_source_sha256":"fe213e91189783ce0eb2e6d1374bc1bf0e642168319a746cc2cc208b4548f756","ordinary_body_chars":655,"ordinary_body_survives":true,"removed_trailer_count":11,"residual_record_lines_removed":0,"files_changed":1,"insertions":32,"deletions":0,"changed_paths":["README.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-2493fd41b194d8f4","repository_id":"gitseed","source_commit_sha":"e9908a36c231131a5e5677275acc1de3f74b74e7","decision_audit_anchor":"2493fd41b194d8f48c698bf40bb448039562cc49f2aac13e728b87c79112c636","ordinary_source":"T-301: the smoke gate, and the prompt is the root cause\n\nThe gate proves a model can hold the output contract before any score is\ntrusted. Failing it switches grading off and leaves the deterministic screen\nrunning, because a screen without scores is degraded and a score nobody\nverified is wrong.\n\nBuilding it corrected D-3. That finding said the seed never checks whether the\nmodel can hold the contract, and blamed model size. Separating the confound on\na clean digest, n=12: 1.5b under the seed's prompt flags 9 of 12 and bleeds the\nwarning into `description` 11 of 12; 1.5b under a strict prompt does neither;\n7b does neither under either. The failure needs both.\n\nNarrowed further to the wording. The seed says\n\n begin description with '⚠ SECURITY: '\n\nand moving that marker out of quotes into prose takes 1.5b from 4-6 in 10 to\n0 in 10. A quoted literal in an instruction reads to a small model as content to\nemit. That is a design rule for this project, not just a note about the seed.\n\nTwo of my own mistakes are in here. The gate first sampled the clean check once,\nwhich would clear a model failing 64% of the time on roughly a quarter of\nattempts — a gate that passes a broken model that often is decoration, so it\nsamples five times now. And the first live check paraphrased the seed's prompt,\nwhich dropped the quoted literal and passed all four combinations; it uses the\nverbatim prompt now.\n\nUnverified: 32b under the seed prompt — measured for security flags earlier (0/14) but not through this gate\n","ordinary_source_sha256":"c7c95a33f5e562a421c6ab855545869605ebb60aa8ab5647bb7c260210ef2a73","ordinary_body_chars":1520,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":5,"insertions":428,"deletions":0,"changed_paths":["docs/PHASE1-EVIDENCE.md","gitseed/grade/__init__.py","gitseed/grade/smoke.py","gitseed/grade/types.py","tests/test_smoke.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-2616d7ae1c85fea4","repository_id":"gitseed","source_commit_sha":"f803d747e3aeec2cf239504b510d4280ac33afda","decision_audit_anchor":"2616d7ae1c85fea4bde5b0ffad16aca6d8660b87a648de610778fe8121d6661b","ordinary_source":"Order search by update time and record its policy\n\nMake updated-descending GitHub Search an explicit collection policy, retain\nthe exact request parameters in schema-8 artifacts, and document why this\ndoes not establish a quality or later-attention result.\n","ordinary_source_sha256":"1d05381a94fd3d5d5b367f88b64ece6a58438084fd3aadd61203522fdfe557ed","ordinary_body_chars":257,"ordinary_body_survives":true,"removed_trailer_count":18,"residual_record_lines_removed":0,"files_changed":7,"insertions":233,"deletions":20,"changed_paths":["docs/adr/ADR-0013-search-order-is-a-collection-policy.md","gitseed/application.py","gitseed/artifact.py","gitseed/collect/search.py","tests/test_collect.py","tests/test_seam.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-2c70b58d7ce1117a","repository_id":"gitseed","source_commit_sha":"e9908a36c231131a5e5677275acc1de3f74b74e7","decision_audit_anchor":"2c70b58d7ce1117acc36cdb6680729ba51b14cbf32f1e9c104c15ec37b050c7e","ordinary_source":"T-301: the smoke gate, and the prompt is the root cause\n\nThe gate proves a model can hold the output contract before any score is\ntrusted. Failing it switches grading off and leaves the deterministic screen\nrunning, because a screen without scores is degraded and a score nobody\nverified is wrong.\n\nBuilding it corrected D-3. That finding said the seed never checks whether the\nmodel can hold the contract, and blamed model size. Separating the confound on\na clean digest, n=12: 1.5b under the seed's prompt flags 9 of 12 and bleeds the\nwarning into `description` 11 of 12; 1.5b under a strict prompt does neither;\n7b does neither under either. The failure needs both.\n\nNarrowed further to the wording. The seed says\n\n begin description with '⚠ SECURITY: '\n\nand moving that marker out of quotes into prose takes 1.5b from 4-6 in 10 to\n0 in 10. A quoted literal in an instruction reads to a small model as content to\nemit. That is a design rule for this project, not just a note about the seed.\n\nTwo of my own mistakes are in here. The gate first sampled the clean check once,\nwhich would clear a model failing 64% of the time on roughly a quarter of\nattempts — a gate that passes a broken model that often is decoration, so it\nsamples five times now. And the first live check paraphrased the seed's prompt,\nwhich dropped the quoted literal and passed all four combinations; it uses the\nverbatim prompt now.\n\nUnverified: 32b under the seed prompt — measured for security flags earlier (0/14) but not through this gate\n","ordinary_source_sha256":"c7c95a33f5e562a421c6ab855545869605ebb60aa8ab5647bb7c260210ef2a73","ordinary_body_chars":1520,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":5,"insertions":428,"deletions":0,"changed_paths":["docs/PHASE1-EVIDENCE.md","gitseed/grade/__init__.py","gitseed/grade/smoke.py","gitseed/grade/types.py","tests/test_smoke.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-30517866b1626071","repository_id":"gitseed","source_commit_sha":"df633fe1353d6094936b434f60c3b0611bf7325a","decision_audit_anchor":"30517866b1626071c26316a5091bf79af2e6886169540b2034dc133f3da5da24","ordinary_source":"Isolate observation writes from approval outcomes (#65)\n\nObservation persistence is deliberately separate from immutable artifact\npersistence. A failed observation append warns the reviewer but cannot turn a\nsuccessful approved action into a failed run; failures writing the artifact\nitself still surface normally.\n","ordinary_source_sha256":"341189fa43a62df57401cab0049cfbd91d3a174e0a2899b188944048e10bcbfd","ordinary_body_chars":315,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":3,"insertions":85,"deletions":41,"changed_paths":["gitseed/cli.py","gitseed/storage.py","tests/test_review_cycle.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-31ea939e4478ded3","repository_id":"gitseed","source_commit_sha":"608fb96040892109991f532db101981f1471504a","decision_audit_anchor":"31ea939e4478ded3d4dfbeb0fc0c3cdbf01c3d5d1e16e716acf43ad210ffcbac","ordinary_source":"F4: record the deep review's approval-integrity and audit gaps\n\nT-203's Design Decision section says Approval \"carries the input it came\nfrom (prompt, answer, at)\" and \"the fabrication appears directly in the\ntrailer.\" True of the in-memory object; not true of the commit. The\n2026-07-28 review of dev at d0e1ecd, run after F4's commit feature (c0fb66f)\nlanded, found render_block() never serializes prompt/answer/at, the Radar\nscore, or coverage state -- only target and decision reach the trailer.\nBulk approval loses more: Approval.prompt for --approve-all holds a one-line\nsummary, never the displayed listing. Undo: easy is written unconditionally\nwhenever a session has a live action, with no durable outcome record behind\nit. External actions run before the decision commit exists, with no\ndurable intent in between, and are not atomic across multiple targets or a\nBOTH decision. The decision commit's update-ref has no expected-old-value,\nso concurrent gitseed processes can race, and its empty-tree constant is a\nhardcoded SHA-1 value invalid in a SHA-256 repository. Separately, the radar\ntable a person reviews and the score that actually drives the approval\nprompt are two different values today -- see ADR-0009.\n\nNone of this reopens AC-1/AC-2 (approval as a required argument, non-TTY\nrejection): those hold, verified live in T-213/B-001. The gap is one layer\nup, in what the permanent record after those approvals can prove.\n","ordinary_source_sha256":"b7f4a801205ae723890e848d04ebeaf542a26d0e13553c9eb530a4c835077634","ordinary_body_chars":1440,"ordinary_body_survives":true,"removed_trailer_count":17,"residual_record_lines_removed":0,"files_changed":2,"insertions":79,"deletions":0,"changed_paths":["docs/prd/PRD-F4-review.md","docs/tickets/F4-review.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-3258ac6e08349a04","repository_id":"gitseed","source_commit_sha":"ed500c2102e74d2812bccc1846773475ee4740be","decision_audit_anchor":"3258ac6e08349a04706744aa7ec32876f8b2860151d88e9879068ea73563495d","ordinary_source":"Write the 0.3.0 changelog and bump the package version\n\nCHANGELOG.md did not exist. It now covers all 61 commits between the v0.2.0\ntag and this branch's base (origin/dev), read through their CommitLore\ntrailers rather than their subject lines, and cross-checked against the real\nGitHub issue tracker (gh issue view/timeline) so every entry cites the issue\nits closing PR actually closed, not the issue a commit's own branch name\nsuggested.\n\nEntries are grouped by what a user needs to know rather than by commit order:\nUpgrade reasons (bugs a v0.2.0 user is currently hitting), Correctness\n(behaviour changes that are not bugs), Safety (approval gate, commit-record\nintegrity, GitHub-write ordering), and Claims withdrawn (ADR-0012 and\nADR-0013, which narrow what the product says about itself rather than\nchanging its code).\n\nversion bumped 0.2.0 -> 0.3.0 in pyproject.toml only.\n","ordinary_source_sha256":"6e19df972b52fcedd65d46bd777de863d99abfc35e205983d1744aeb36245be1","ordinary_body_chars":882,"ordinary_body_survives":true,"removed_trailer_count":12,"residual_record_lines_removed":0,"files_changed":2,"insertions":156,"deletions":1,"changed_paths":["CHANGELOG.md","pyproject.toml"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-377f04276465b59d","repository_id":"gitseed","source_commit_sha":"4d99a4858e1b459306c8fe3d2626746a5a720224","decision_audit_anchor":"377f04276465b59d3a08b0958ba5d84accdc43e73e92abf326179e89addd1af6","ordinary_source":"T-210: the CI matrix did not include the Python version this project targets\n\nThe workflow ran 3.11, 3.12 and 3.13. `pyproject.toml` says 3.9, and the code uses\n`from __future__ import annotations` alongside `X | None`, which behave differently\nacross exactly that range. The one version most likely to break was the one not\ntested.\n\n`HOME` is now an empty directory in the job, so a global `~/.gitconfig` on a runner\ncannot rescue a test that depends on one. That is not hypothetical: the sibling\nproject shipped five commits on a red CI this week because five of its tests\nrelied on a git identity the runner did not have, and its author kept checking a\nlocal run.\n\nA session-scoped fixture fails any test that reaches the network, rather than\ntrusting the runner to have no egress. A test that passes because the sandbox\nblocked it is not a test that proved anything.\n\nUnverified: the workflow itself has not run. GitHub has not executed it at the time of this commit, and no claim is made about it being green\n","ordinary_source_sha256":"86f451fa22d32453b18d9eae1c9dacd8384e0762a4ac9cf742a69d0558f77a8d","ordinary_body_chars":1014,"ordinary_body_survives":true,"removed_trailer_count":12,"residual_record_lines_removed":0,"files_changed":3,"insertions":34,"deletions":38,"changed_paths":[".github/workflows/ci.yml","pyproject.toml","tests/conftest.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-3ae6c2555769891a","repository_id":"gitseed","source_commit_sha":"26678d1b539117dc2ebefddb052566dbb4ad9dee","decision_audit_anchor":"3ae6c2555769891a57f7e00063bdbe044cb6a92c980e5c86c804ff33a68c1857","ordinary_source":"Supply live read adapters\n","ordinary_source_sha256":"77ba9ff33a5c8ad5a1e2567bea5d90308b22bb379d19ac1a1280999edb5d17a7","ordinary_body_chars":26,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":2,"insertions":136,"deletions":0,"changed_paths":["gitseed/adapters.py","tests/test_adapters.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-3ebec50e1216f799","repository_id":"gitseed","source_commit_sha":"1d3cbe970e80f852e39b9a44f5a70106ae6ccab5","decision_audit_anchor":"3ebec50e1216f799637cad67990d6e1fdc8466f3288f5b8be4191537f75ebee6","ordinary_source":"Translate phase records to English\n","ordinary_source_sha256":"94415117ada93a48892005563bd1dde9517320d0d32022b34ed81234afe85b9b","ordinary_body_chars":35,"ordinary_body_survives":false,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":2,"insertions":230,"deletions":226,"changed_paths":["docs/PHASE0.md","docs/PHASE1-EVIDENCE.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-4042654555ac20e4","repository_id":"gitseed","source_commit_sha":"3c62288df6ef45f4242ef3fa9c2c46a4263c2026","decision_audit_anchor":"4042654555ac20e44f50ba651d43de7f7c90d0783dfe7a15b7625ba5b539c1f3","ordinary_source":"ADR-0009: collapse the two ranking sources into one\n\nThe 2026-07-28 review found the radar table sorts on the deterministic\nmetadata score while the approval queue sorts on Reviewed.score\n(grade.idea + grade.skill) -- two independent orderings from the same run,\nwith nothing enforcing agreement between them.\n","ordinary_source_sha256":"eb5ae5eb2ca69a0362fb318e4fe1fe0e9ce13f7901256ba81f2c8bca9bbd39d0","ordinary_body_chars":310,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":1,"insertions":91,"deletions":0,"changed_paths":["docs/adr/ADR-0009-single-ranking-source.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-468e579f86e22f91","repository_id":"gitseed","source_commit_sha":"43d9cb0d4bbacafa1a4c5d9e04d25b39e23c0b21","decision_audit_anchor":"468e579f86e22f91a5151dc8b1435e50dec2671aa3833b78952849a9e3a4b2a3","ordinary_source":"Squashed commit of the following:\n\ncommit ad1a0e151c1b2559dfc32d5445a3d6eccb22d977\nAuthor: MongLong0214 \nDate: Mon Jul 27 14:56:25 2026 +0900\n\n Document the dev squash workflow\n\ncommit 0e296acfe22e4da6a4bc4b0c6e103c79810b295f\nAuthor: MongLong0214 \nDate: Mon Jul 27 14:56:12 2026 +0900\n\n B-002: define the live 403 evidence gate\n\n","ordinary_source_sha256":"bbe530853a882892a63dfb9f109d55b82815cece5b910f476938c370b77bf358","ordinary_body_chars":383,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":20,"files_changed":3,"insertions":21,"deletions":4,"changed_paths":["CONTRIBUTING.md","README.md","docs/tickets/F1-collect.md"],"benchmark_authored":false,"provenance_value":"inherited ad1a0e151c1b2559dfc32d5445a3d6eccb22d977","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-48c6427556993157","repository_id":"gitseed","source_commit_sha":"a00d01f4528295e5e368870b2a268767cd9d62ba","decision_audit_anchor":"48c642755699315776e287af988e71cfb46a6a968ce54e451103a82ac0f44082","ordinary_source":"F10: add radar, explain, and export\n","ordinary_source_sha256":"e4d5428c0884f6b0362498655b7b5205c97b7c194e230aeb263bc32ee5e525a0","ordinary_body_chars":36,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":3,"insertions":250,"deletions":53,"changed_paths":["README.md","gitseed/cli.py","tests/test_cli.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-48e8b1b021e6999b","repository_id":"gitseed","source_commit_sha":"34bf4f836fe14f2ed72f231abedf6f17ebc4e5cd","decision_audit_anchor":"48e8b1b021e6999bae1bfa6c2bb440ecb72df231fd92727a5d87694157ec695b","ordinary_source":"F11: expose evidence coverage and trust-gate security claims\n","ordinary_source_sha256":"7cf8eb29b97368159b7cda7e823542aa7e0d7ad163a30cf9e12ce9346787afdb","ordinary_body_chars":61,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":10,"insertions":204,"deletions":6,"changed_paths":["gitseed/artifact.py","gitseed/cli.py","gitseed/evidence.py","gitseed/grade/types.py","gitseed/pipeline/run.py","gitseed/scoring.py","gitseed/screen/signals.py","gitseed/screen/verdict.py","tests/test_cli.py","tests/test_pipeline.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-4d2c072dffcb56ba","repository_id":"gitseed","source_commit_sha":"f2e853540f0bb7813eca1c1d99143b62b3f7a28a","decision_audit_anchor":"4d2c072dffcb56baa6dfee91257f13fb59338e4390c4e54d079d024f134cfd5e","ordinary_source":"Genesis: gradelore — 씨앗의 아이디어는 계승하고 정책 위반은 버린다\n\nfollowme(993줄, 테스트 0, CI 0, 라이선스 없음)를 씨앗으로 재구축한다. 계승하는 것은\n\"로컬 LLM으로 GitHub 레포를 채점한다\"는 아이디어이고, 버리는 것은 그것을 실행하는\n방식이다.\n\nPhase 1 반증이 방향을 바꿨다. GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다. 씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계가 정확히 그것이다. 그래서\n읽기 전용 분석과 사람이 건건이 승인하는 리뷰 큐로 간다.\n\n재현 실험에서 내 추정이 세 번 틀렸다. 마이그레이션도 dry-run 도 씨앗에 이미 있었고,\n\"채점이 비결정적\"은 재현되지 않았다(7b 에서 idea·skill sd=0.000, n=10). 셋 다 clone\n을 읽기 전에 결함 목록을 쓴 결과다. 정정 이력은 docs/PHASE1-EVIDENCE.md 에 남겼다.\n\n남은 진짜 결함은 다른 것이었다. 씨앗은 모델이 설치됐는지만 확인하고 출력 계약을 지킬\n수 있는지는 확인하지 않는다. 1.5b 에서 깨끗한 코드의 64%(9/14)를 악성으로 판정하며\nsecurity_flag 와 security_reason 이 서로 모순된다. 7b·32b 에서는 0/14 다. 작은\n기계에서 작은 모델을 고르는 것은 합리적인데 사용자는 경고 없이 오판 도구를 쥔다.\n\nUnverified: 32b 채점 결정성 — 보안 판정만 측정했고 점수 분산은 재지 않았다\n","ordinary_source_sha256":"95bbb402d240a0fed629e1c52d0ec5b707781166ff855ea0f1aeeefeef8a092d","ordinary_body_chars":843,"ordinary_body_survives":true,"removed_trailer_count":18,"residual_record_lines_removed":0,"files_changed":12,"insertions":605,"deletions":0,"changed_paths":[".gitignore","AGENTS.md","LICENSE","docs/PHASE0.md","docs/PHASE1-EVIDENCE.md","docs/adr/ADR-0001-identity.md","docs/adr/ADR-0002-scope-v010.md","docs/adr/ADR-0003-language-runtime.md","docs/prd/PRD-F1-collect.md","docs/prd/PRD-F2-screen.md","docs/prd/PRD-F3-grade.md","docs/prd/PRD-F4-review.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-545d1c9c0d2b969e","repository_id":"gitseed","source_commit_sha":"fcee89903f1547a7158f63fc380431b89753f027","decision_audit_anchor":"545d1c9c0d2b969e9492834949776cbae158e03cade5958ba687c7c52ce048de","ordinary_source":"ADR-0010: replace recommended: bool with a four-state status\n\nRecommendation.recommended is risk_verdict != HIGH, which makes zero\nsecurity coverage, zero score coverage, and unknown risk all read as a\npositive recommendation. The review proposes a four-state\nRecommendationStatus (BLOCKED / INSUFFICIENT_EVIDENCE / REVIEW /\nNOT_PRIORITY); this ADR assesses the proposal rather than adopting it\nuncritically, and accepts it: BLOCKED and INSUFFICIENT_EVIDENCE answer two\ngenuinely independent questions (was there a blocking finding; is there\nenough evidence to have an opinion at all), and REVIEW/NOT_PRIORITY are what\nthat pair produces once evidence is sufficient, at the same explicit\ngranularity instead of leaving one branch as a bare score number.\n","ordinary_source_sha256":"aab88337341dc8736d283305564d83afb4daa9f44516fad20792e3fe1a2aa857","ordinary_body_chars":754,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":1,"insertions":126,"deletions":0,"changed_paths":["docs/adr/ADR-0010-recommendation-status-not-boolean.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-556562750dedffa7","repository_id":"gitseed","source_commit_sha":"5b63dcaaaf1514b5e9c4a8c02cdd5e10e7c70f19","decision_audit_anchor":"556562750dedffa7b6e9e418354e6d568073e1227cc28a005d6d53ba12b1835c","ordinary_source":"ADR-0007: build measured scoring before the core seam\n","ordinary_source_sha256":"fd090ed260cc2bc3525e220788ff7b621335445738764f095d4b3bc846cf7203","ordinary_body_chars":54,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":1,"insertions":45,"deletions":0,"changed_paths":["docs/adr/ADR-0007-scoring-before-seam.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-572e09dba076a5a3","repository_id":"gitseed","source_commit_sha":"3ca00ae6e7ae4687d2ccda69bdff3be8210789be","decision_audit_anchor":"572e09dba076a5a37ca3ed1df7a52d80e8f9e86e0939367e2e5e939eefe0d3a6","ordinary_source":"README: lead with repository triage\n\nPut gitseed's repository-triage job, present scoring boundary, and install\ncommand before its safety reassurance. Keep dry-run, incomplete-run reporting,\nand interactive approval on the first screen.\n","ordinary_source_sha256":"b6a2f4757d7ea1fd388aff0fc86746381e62ce797849a5a5dc8a1b3aeebb2397","ordinary_body_chars":237,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":1,"insertions":7,"deletions":3,"changed_paths":["README.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-59f1a2b56b710495","repository_id":"gitseed","source_commit_sha":"fe69ce9d153a1f198252e945b6656679b8930f05","decision_audit_anchor":"59f1a2b56b710495bd73aab8327bb859c4445adcaaf533a8d31e65fb03bc04d3","ordinary_source":"Name the core run ports\n","ordinary_source_sha256":"efc4d53f33b00881bc07bd6372e046346ff05a1ada0564f8b3116e9369a62b64","ordinary_body_chars":24,"ordinary_body_survives":false,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":1,"insertions":48,"deletions":0,"changed_paths":["gitseed/ports.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-5f0d8829fcc6f198","repository_id":"gitseed","source_commit_sha":"438ec4277d0599c87245bf0e4fd2a8e129cf7298","decision_audit_anchor":"5f0d8829fcc6f1988f8bc143365d3ded0ff6736e21efab52712dc37dbfeed631","ordinary_source":"Close out the handoff at the state the work actually reached\n\nTests went 305 to 310 and open issues 4 to 1 after the last four merges, and the\ndocument still listed three issues that are closed. The remaining one is #66, a\nshare card, deferred while work concentrates on CommitLore.\n\nThe open-issues section is now that one entry with the reasoning that matters\ncarried inline rather than left on the issue: what a run can honestly share is a\ndated observation, and it becomes evidence of early discovery only when someone\nlater compares it against what the repository became. A reader who picks this up\nwithout that framing will build a card that claims what ADR-0012 says this\nproject cannot claim.\n\nAdded the two ADRs to the state section by name and by what they forbid, because\na later maintainer meets a restriction before they meet its reasoning and the\nnatural response to an unexplained restriction is to remove it.\n","ordinary_source_sha256":"24f0f7b5262fb80f4508fb7fa54b6a8d402901fce9538a0e4fbe2166303defff","ordinary_body_chars":925,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":1,"insertions":32,"deletions":21,"changed_paths":["HANDOFF.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-63e1ec17f2bdadfe","repository_id":"gitseed","source_commit_sha":"43d9cb0d4bbacafa1a4c5d9e04d25b39e23c0b21","decision_audit_anchor":"63e1ec17f2bdadfe8c6bf27d088aba98e49c112d18528ae0b39f54ad5e65c2b3","ordinary_source":"Squashed commit of the following:\n\ncommit ad1a0e151c1b2559dfc32d5445a3d6eccb22d977\nAuthor: MongLong0214 \nDate: Mon Jul 27 14:56:25 2026 +0900\n\n Document the dev squash workflow\n\ncommit 0e296acfe22e4da6a4bc4b0c6e103c79810b295f\nAuthor: MongLong0214 \nDate: Mon Jul 27 14:56:12 2026 +0900\n\n B-002: define the live 403 evidence gate\n\n","ordinary_source_sha256":"bbe530853a882892a63dfb9f109d55b82815cece5b910f476938c370b77bf358","ordinary_body_chars":383,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":20,"files_changed":3,"insertions":21,"deletions":4,"changed_paths":["CONTRIBUTING.md","README.md","docs/tickets/F1-collect.md"],"benchmark_authored":false,"provenance_value":"inherited ad1a0e151c1b2559dfc32d5445a3d6eccb22d977","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-66695090e5949ea6","repository_id":"gitseed","source_commit_sha":"d52d60f86263d5cef7269a7f9f82a89579ad6e73","decision_audit_anchor":"66695090e5949ea696225a24fda43985372c23e2b4623d45390b3883ed78ff70","ordinary_source":"T-205: an entry point, and a default that cannot write by accident\n\nFour modules were tested and nothing joined them, so nothing had ever run end to\nend. `python -m gitseed run` now walks collect → screen → grade → rank, and the\nwhole pipeline is exercised against fixtures with no network at all.\n\n`--dry-run` is the default. Every other run performs star and follow against real\naccounts, which GitHub's AUP constrains, and a tool whose default writes is a\ntool that writes by accident — the first mistyped command, the first copied\nsnippet from a README. Asking for the write is one flag; not asking for it must\nbe free.\n\nAn incomplete run exits 2 while still printing the ranking. Suppressing the\nranking would hide work that was done; exiting 0 would let \"these are the best\nrepositories\" stand when the truth is \"these are the best of what we managed to\nlook at\". Both facts are true at once and both are reported.\n","ordinary_source_sha256":"9d7f2d12c920b24cf4c071ce474ba6f8750bfb191cac4c30887ed1b9a30bed9a","ordinary_body_chars":921,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":7,"insertions":531,"deletions":2,"changed_paths":["README.md","gitseed/__main__.py","gitseed/cli.py","gitseed/collect/search.py","tests/fixtures/candidates.json","tests/fixtures/grades.json","tests/test_cli.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-6a3b0b51071ec292","repository_id":"gitseed","source_commit_sha":"d796cd4b183c289b90dc4c56cb547cf4fc9aa63a","decision_audit_anchor":"6a3b0b51071ec2924c01a66d250c4be9a6d3b9266e4b461a690b76e93f9d37e4","ordinary_source":"Make replay honest about engine changes and results immutable\n\nReplay now states when stored responses are recomputed with matching engines,\nstops by default when an engine changed, and requires an explicit opt-in to\nrecompute with current code. Returned collection, pipeline, review, and smoke\nresults now convert their mutable builders to tuples at the return boundary.\n","ordinary_source_sha256":"90ae3d8cca7c5e8206bed4d75db5c0af3353011c237f9bc0ca51b75f09d5b05f","ordinary_body_chars":372,"ordinary_body_survives":true,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":11,"insertions":233,"deletions":96,"changed_paths":["gitseed/adapters.py","gitseed/application.py","gitseed/artifact.py","gitseed/cli.py","gitseed/collect/search.py","gitseed/grade/smoke.py","gitseed/pipeline/run.py","tests/test_cli.py","tests/test_pipeline.py","tests/test_seam.py","tests/test_smoke.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-6aed03472a14ffc6","repository_id":"gitseed","source_commit_sha":"b45a20e2e01a7ace197cd9a2418af537d9d72bd0","decision_audit_anchor":"6aed03472a14ffc6e1e43d5d17c2092285619f1f8e9a7813cbed5ba4c5079e55","ordinary_source":"F1: record the deep review's collection-completeness gaps\n\nThe 2026-07-28 static review of dev at d0e1ecd found two gaps in F1's own\ncompleteness claim. GitHub Search's incomplete_results/total_count are read\nnowhere in gitseed/collect/search.py, so a search GitHub itself flags as\nincomplete can still produce CollectResult(complete=True) -- the opposite of\nwhat this ticket's opening line promises. Separately, classify() recognizes\nRetry-After as rate-limiting evidence but parse() never reads its value, so\ncollect(wait=True) can sleep 0 seconds on a secondary rate limit instead of\nwaiting.\n\nNeither is a regression of the AC this ticket already checks off -- both are\ngaps the original AC never named. Filed as their own issues rather than\nreopening closed AC items.\n","ordinary_source_sha256":"dc820c11da8eea7f72a99020b7bce637c31619e6c9979fb76e80957f75553681","ordinary_body_chars":773,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":2,"insertions":38,"deletions":0,"changed_paths":["docs/prd/PRD-F1-collect.md","docs/tickets/F1-collect.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-6d2eec862ac0f22c","repository_id":"gitseed","source_commit_sha":"a344c6a25603ca9f140cae5328e770686b8c65c3","decision_audit_anchor":"6d2eec862ac0f22c76bb3f2461c4cce8e7fa72cb37d57bc9b8c865fac8c5d13e","ordinary_source":"F2: record the deep review's live screening-coverage gaps\n\nsignals.py and verdict.py do exactly what T-201/T-202 specify, on the input\nthey are given. The 2026-07-28 review of dev at d0e1ecd found the gap is\nupstream: SOURCE_EXTENSIONS in gitseed/cli.py has no .json entry, so a live\nrun's file selector never hands package.json to the postinstall rule this\nticket documents as implemented and tested -- it is, against a fixture\ndirectory, and never reached against a live GitHub repository. Two more\nfindings compound it: files dropped by the 20-file/500KB caps don't affect\nseverity_of() or recommendation, and selection order is raw tree order, so a\nrepository can be structured to push a malicious file past the count cap\nwith no signal that happened.\n","ordinary_source_sha256":"44dc158844163f4b5627947ecd81653f750fade0737c3a0c46942518cfc04dcc","ordinary_body_chars":756,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":2,"insertions":42,"deletions":0,"changed_paths":["docs/prd/PRD-F2-screen.md","docs/tickets/F2-screen.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-6d92a30ed95357d4","repository_id":"gitseed","source_commit_sha":"1045007ed263e92586a88376994d8e0bc3ebe03c","decision_audit_anchor":"6d92a30ed95357d41194de81299defb4db4fca049b3a02701c3a6da4ba909d3b","ordinary_source":"Translate PRD records to English\n","ordinary_source_sha256":"900f958ab3bb5cec19538317077c2ff1d68d89055d71405cea333a296a70592c","ordinary_body_chars":33,"ordinary_body_survives":false,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":4,"insertions":76,"deletions":76,"changed_paths":["docs/prd/PRD-F1-collect.md","docs/prd/PRD-F2-screen.md","docs/prd/PRD-F3-grade.md","docs/prd/PRD-F4-review.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-7078a162153bab38","repository_id":"gitseed","source_commit_sha":"976ccfac8c0e3343504a6233abf98f67f2628dfa","decision_audit_anchor":"7078a162153bab380e5e643bd1d766316a2249708ad3bad711d008530c39ae44","ordinary_source":"T-202: collection that reports truncation instead of hiding it\n\nThe seed has no rate-limit handling at all — `rate`, `429`, `403`,\n`X-RateLimit` and `backoff` return zero matches across its source. A search that\nhits the limit there comes back short and says nothing, and the caller writes a\nsmaller world into the database believing it is the whole one. That is worse\nthan failing: a failure gets noticed.\n\n`CollectResult.complete` is the field that carries it. Partial results are kept\nand flagged, never discarded and never passed off as whole.\n\nGitHub returns 403 for two different things — out of budget, and not allowed —\nand they are separated by the headers rather than the status. Confusing them\nmeans either sleeping an hour on a permissions error or hammering an API that\njust asked us to stop.\n\n`wait=False` is the default. Sleeping for up to an hour inside a library call is\nthe caller's decision, and either way the result says what happened.\n\nUnverified: behaviour against the real API under an actual limit; the header shapes are taken from GitHub's documentation, not observed\n","ordinary_source_sha256":"4d90d64f1d35e28e2a59ceddca0f9a1dc9ac4da7fdc1e0214ff37579bce6f619","ordinary_body_chars":1094,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":4,"insertions":392,"deletions":0,"changed_paths":["gitseed/collect/__init__.py","gitseed/collect/ratelimit.py","gitseed/collect/search.py","tests/test_collect.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-77e1745655a235ce","repository_id":"gitseed","source_commit_sha":"ee15d86253bec1fac944e0d4e71d803dd1092e2d","decision_audit_anchor":"77e1745655a235ce75339fae3518ec72beb33a824d4e5a8882d06f170d30ab17","ordinary_source":"Validate category evidence producers\n\nCategory pack validation now derives available evidence kinds from the registered FileEvidenceReader producer methods. Unsatisfiable requirements name both the pack and evidence kind.\n","ordinary_source_sha256":"767390dceca39cfc2c9548b5d178f66dd7bf1c8d57bccbf03cf8fc8fc76dcfa8","ordinary_body_chars":222,"ordinary_body_survives":true,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":2,"insertions":85,"deletions":17,"changed_paths":["gitseed/category.py","tests/test_category.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-79e5fcfd3fd49649","repository_id":"gitseed","source_commit_sha":"c7e608c77ed14e85eb2045566111f9f7c9aee84d","decision_audit_anchor":"79e5fcfd3fd496497a5ea0c2efe67205bcf92253f0e4a96efc78b639357ee8de","ordinary_source":"Rename to gitseed, and record why the first name was wrong\n\nADR-0001 chose `gradelore` on three grounds and two of them do not hold.\n\n\"It matches CommitLore's pattern, so they form a family\" is a branding\nconvenience, not a claim about this product. In CommitLore the `lore` has a\nreferent — the accumulated decision knowledge attached to commits, which is the\nproduct. In `gradelore` the `lore` would be the scores, and 8/10 is a number,\nnot something handed down. The shape was borrowed without the meaning.\n\n\"It says what it does\" is half right after the pivot. ADR-0001 itself dropped\nthe automated social actions, so the pipeline is collect, deterministic security\nscreen, contract-verified model grading, human review queue. Grading is one step\nin the middle and the one we trust least — it sits behind a startup smoke test.\nNaming the product after it points at the wrong centre of gravity.\n\nThe owner chose `gitseed`. Availability was measured rather than assumed, which\nis what CommitLore's ADR-0009 procedure exists for: PyPI is free, which is the\nregistry this would publish to. GitHub org `gitseed` is taken by a Rust CI\nsystem at one star, and npm `gitseed` is a v0.0.0 stub abandoned in 2022 —\nneither is the case that killed `gitlore` for CommitLore, which was an active\nsame-domain package on the target registry.\n\nUnverified: whether the `seed` reading actually confuses anyone — that is a README problem and nobody has read the README yet\n","ordinary_source_sha256":"14e1a86d32ec987e18e319a4651fac5c403f6e2193bc8b63f9be05507ae2f16c","ordinary_body_chars":1457,"ordinary_body_survives":true,"removed_trailer_count":16,"residual_record_lines_removed":0,"files_changed":1,"insertions":64,"deletions":0,"changed_paths":["docs/adr/ADR-0004-name-gitseed.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-7b84423ed8fa9f34","repository_id":"gitseed","source_commit_sha":"0abba44fc6e8b6a23f8aa2f44539f9d33817f57b","decision_audit_anchor":"7b84423ed8fa9f3463f9d6f5430de1900693992e61f3bf095cee40b608d686be","ordinary_source":"T-211: the plan this repository never had\n\nThe factory's Phase 4 requires six artifacts. Four were produced and three were\nskipped: CONTRIBUTING.md, milestones and issues. F1 had no ticket and no critical\npath was ever drawn — and the critical path is Phase 5's own declared input.\nPhase 5 ran anyway. The code passes 147 tests; from outside, this project had no\nplan at all.\n\nThe gap was found by `phase-gate.py`, written today after the same operator\nskipped the same checklist. It named all six failures, which is the only reason\nthey are being closed rather than discovered by someone else later.\n\n`F1-collect.md` describes what was actually built — real module paths, real\nsignatures, the tests that exist — and says at the top that it was written after\nthe implementation, because it was. A ticket back-dated into a plan it never\nguided is a lie that costs nothing to tell and everything to trust.\n\nThe issues are the same: F1 through F4 were opened and immediately closed, each\nnaming the commit that delivered it and each saying it was created retroactively.\nLate tracking recorded honestly is worth more than tracking that looks complete.\n\nTwo Backlog issues carry what the commit record already admits is unfinished: the\nreview queue has never completed a full cycle because approval needs a TTY\n(r-gs9f06), and the 403 forbidden-resource branch is covered only by injected\nresponses (r-gsa007).\n","ordinary_source_sha256":"edbf6c60a6d10a299e48f24f6b3f34973f807262dfab3a4ddd97fd3672b169c6","ordinary_body_chars":1406,"ordinary_body_survives":true,"removed_trailer_count":11,"residual_record_lines_removed":0,"files_changed":3,"insertions":161,"deletions":0,"changed_paths":["CONTRIBUTING.md","docs/tickets/F1-collect.md","docs/tickets/TICKETS.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-7bdc1c42597e48a6","repository_id":"gitseed","source_commit_sha":"fe24b37e43e2c1871041461c3a9de54710c0bfbb","decision_audit_anchor":"7bdc1c42597e48a6327a3f952fa102ef41ffaa237061459ba02a86e4634d5faa","ordinary_source":"T-11: add versioned SQLite run schema\n","ordinary_source_sha256":"61108be23eb8105debf066cbe820ec56e8266a9dd94507cd5f4c1c3d50bf360b","ordinary_body_chars":38,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":2,"insertions":107,"deletions":0,"changed_paths":["gitseed/storage_schema.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-7c0b5ea14295d54c","repository_id":"gitseed","source_commit_sha":"b92c15734dc106402cdded4a34e856132bb23abc","decision_audit_anchor":"7c0b5ea14295d54ccbf816ba968b8c183cc6a63369cf14719739421f9be0adef","ordinary_source":"Record honest reversibility and empty trees\n\nIntent commits no longer claim session-wide reversibility. Outcome commits derive Undo from each action and status: successful stars are easy, successful follows are costly, and unknown or compensated failure states are permanent with their constraints recorded.\n\nRoot commits now ask git for the repository-format empty tree and derive the zero object ID width, so both SHA-1 and SHA-256 repositories can record a first decision.\n","ordinary_source_sha256":"ef818dc7304b0dc527ea3e70046c677cbdbac73ce08c4a41a33ca4a00038e211","ordinary_body_chars":476,"ordinary_body_survives":true,"removed_trailer_count":16,"residual_record_lines_removed":0,"files_changed":5,"insertions":121,"deletions":40,"changed_paths":["gitseed/review/commit.py","gitseed/review/trailers.py","tests/test_review.py","tests/test_review_commit.py","tests/test_review_recovery.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-7c3c09fcebd01801","repository_id":"gitseed","source_commit_sha":"02d96b985945a67048432b1cb1a1dea1077a74d9","decision_audit_anchor":"7c3c09fcebd0180189a951c0fef9277059024ad879bd3894062ad94e3146c942","ordinary_source":"Fix live file selection so manifests reach the scanner and partial scans cannot read as clean\n\npackage.json and every other manifest, lockfile, and workflow file never\nreached the live security scanner: SOURCE_EXTENSIONS in gitseed/cli.py has no\n.json entry, so the postinstall rule in screen/signals.py was implemented and\nunit-tested against a fixture directory that bypasses GitHubClient.fetch_files()\nentirely, and the gap never showed up in tests (#45, GS-P0-001). Separately,\nfiles dropped by the 20-file/500KB/extension caps never affected\nseverity_of()'s output, so a 20-of-200 scan that found nothing in the 20\nreported the same \"none\" a fully-scanned clean repository would (#48,\nGS-P0-008) -- an attacker who fills the tree's first 20 entries with clean\nfiles hides everything after them, with no signal that this happened.\n\n- GitHubClient.fetch_files() now separates a priority-filename allow-list\n (manifests, lockfiles, Dockerfile, Makefile, .github/workflows/*.yml|yaml)\n from the extension allow-list, and selects priority matches before the\n 20-file count cap is applied at all -- not merely early within it -- so a\n manifest's tree position cannot push it out of the scan.\n- New SourceCoverage/SkippedFile types (gitseed/screen/coverage.py) record\n discovered/eligible/scanned file counts and separate policy-skips from\n error-skips, with complete_for_policy and complete_for_repository as two\n distinct, computed claims -- deliberately not the same question.\n- screen/verdict.risk_of() wraps severity_of() and reports\n \"none-found-in-scanned-files\" instead of a bare \"none\" when coverage says\n the scan was cut short. severity_of() itself is untouched and keeps its\n three-state discipline (T-202, ADR-0010).\n- FetchedFiles, Reviewed, and the run artifact schema all carry coverage\n through to CLI radar/explain output, so a partial scan is never rendered\n as a clean one anywhere a user reads it.\n\nFixes #45\nFixes #48\n","ordinary_source_sha256":"62e7f1f05cd6d0e0e085e005731e85319b45be49b804bf4d8a0e716c0a1bbe06","ordinary_body_chars":1950,"ordinary_body_survives":true,"removed_trailer_count":28,"residual_record_lines_removed":0,"files_changed":8,"insertions":537,"deletions":22,"changed_paths":["gitseed/artifact.py","gitseed/cli.py","gitseed/pipeline/run.py","gitseed/screen/coverage.py","gitseed/screen/verdict.py","tests/test_cli.py","tests/test_coverage.py","tests/test_signals.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-7f42c3f1f7876679","repository_id":"gitseed","source_commit_sha":"6072c2ab43def5c23bddedd15617c560720fb3ab","decision_audit_anchor":"7f42c3f1f7876679fd6a295654c5ac85d957cd3c3866ac5be4fb6eb6f834b5d5","ordinary_source":"T-201: the deterministic screen, and it refuses to guess\n\nThis is the keystone because it is the only layer that works without a model.\nADR-0002 requires the pipeline to complete on F2 alone when F3's smoke test\nfails, so F3 depends on this and not the other way round.\n\nA Signal cannot be constructed without a citation — path, 1-based line, and the\nline itself. That is not defensive programming. An uncitable finding is the\nfailure this layer exists to avoid: the seed emitted a boolean whose stated\nreason sometimes said the code was fine, and a user could not go and look.\n\nThe ten clean fixtures each carry a trap for a naive rule: a real sha256\nconstant, a base64 test vector, a loopback and a private address, a docker\ncommand with no pipe. A screen that fires on those gets switched off, and then\nnobody reads the real findings either.\n\nMutation-proven rather than asserted green. Eight mutations, eight failures:\ndisabling the install-script rule, removing either citation guard, dropping the\nseverity check, unscoping postinstall from manifests, and lowering the base64,\nhex and private-IP thresholds — the last three fail specifically on the traps\nplanted in the clean corpus.\n\nUnverified: the typosquatting dependency list — named in the ticket, not built, because its source and refresh cadence are undecided\n","ordinary_source_sha256":"1b423fc3a32eaf2ee410af8197fe65adfde2a4e5262a20a9916d6ea014f54a42","ordinary_body_chars":1323,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":22,"insertions":396,"deletions":0,"changed_paths":[".github/workflows/ci.yml","gitseed/__init__.py","gitseed/screen/__init__.py","gitseed/screen/signals.py","gitseed/screen/verdict.py","pyproject.toml","tests/fixtures/clean/a_logger.py","tests/fixtures/clean/b_setup.sh","tests/fixtures/clean/c_package.json","tests/fixtures/clean/d_client.py","tests/fixtures/clean/e_hash.py","tests/fixtures/clean/f_config.py","tests/fixtures/clean/g_readme.md","tests/fixtures/clean/h_docker.sh","tests/fixtures/clean/i_key.py","tests/fixtures/clean/j_ci.yml","tests/fixtures/malicious/beacon.py","tests/fixtures/malicious/hexblob.py","tests/fixtures/malicious/install_pipe.sh","tests/fixtures/malicious/obfuscated.js","tests/fixtures/malicious/package.json","tests/test_signals.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-81773950b2e67c02","repository_id":"gitseed","source_commit_sha":"fcee89903f1547a7158f63fc380431b89753f027","decision_audit_anchor":"81773950b2e67c028ad5cbc72c0c8ec4a7efac8401ccdd686eb3252aa947747d","ordinary_source":"ADR-0010: replace recommended: bool with a four-state status\n\nRecommendation.recommended is risk_verdict != HIGH, which makes zero\nsecurity coverage, zero score coverage, and unknown risk all read as a\npositive recommendation. The review proposes a four-state\nRecommendationStatus (BLOCKED / INSUFFICIENT_EVIDENCE / REVIEW /\nNOT_PRIORITY); this ADR assesses the proposal rather than adopting it\nuncritically, and accepts it: BLOCKED and INSUFFICIENT_EVIDENCE answer two\ngenuinely independent questions (was there a blocking finding; is there\nenough evidence to have an opinion at all), and REVIEW/NOT_PRIORITY are what\nthat pair produces once evidence is sufficient, at the same explicit\ngranularity instead of leaving one branch as a bare score number.\n","ordinary_source_sha256":"aab88337341dc8736d283305564d83afb4daa9f44516fad20792e3fe1a2aa857","ordinary_body_chars":754,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":1,"insertions":126,"deletions":0,"changed_paths":["docs/adr/ADR-0010-recommendation-status-not-boolean.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-81aa6660ab83f1dc","repository_id":"gitseed","source_commit_sha":"88ec7766b9f311a3ef7c8e24e4b30e3a636535e6","decision_audit_anchor":"81aa6660ab83f1dcccdc51c9cb63cbcf77999499eeb7ef6ec8108e84d098655b","ordinary_source":"Write the handoff a fresh session actually needs\n\nThe previous document did not exist here, and the CommitLore one covered three\nprojects at once while going stale between them. This one covers gitseed alone\nand leads with what breaks if you get it wrong.\n\nThe approval gate goes first because two changes broke it accidentally this\nweek and both passed their own tests. The verification is written as a command\nto run rather than a claim to trust: inject a raise into the observation write\nand confirm all eleven approval-cycle tests still pass.\n\nADR-0012's boundary is restated here rather than linked, because a reader who\ndoes not know that undervaluation is not computable today is one plausible\nformula away from making every recommendation wrong in the same direction.\n","ordinary_source_sha256":"a62ae28ae74e6b213e04cde477f319f95736b578d04d27c1ac69769c6df59ed9","ordinary_body_chars":776,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":1,"insertions":154,"deletions":0,"changed_paths":["HANDOFF.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-849425816b8050cc","repository_id":"gitseed","source_commit_sha":"4d99977170c8de2f4f01c0733b15652b7d30215e","decision_audit_anchor":"849425816b8050ccdc7c28866cef2b6e99ee88316c8096935e5f5fdcdba93921","ordinary_source":"Record bulk listings and guard decision refs\n\nBulk approvals now retain the table the reviewer saw instead of only a target\ncount. Listings above 20 rows keep the header and first 20 rows, state exactly\nhow many rows were omitted, and include a SHA-256 of the complete displayed\nlisting. Large batches serialize that shared snapshot once instead of once per\ntarget.\n\nThe expected-old update-ref guard was already present on dev from 8ddc6f5. Its\nrace regression now covers both an unborn repository and an existing HEAD, and\nproves that a concurrent ref move raises CommitFailed rather than being silently\noverwritten.\n","ordinary_source_sha256":"50cc3a554465b77b6b6ba9efac187b73d1c9bd5e443ab6ae6a97024bc24400e2","ordinary_body_chars":619,"ordinary_body_survives":true,"removed_trailer_count":18,"residual_record_lines_removed":0,"files_changed":7,"insertions":159,"deletions":30,"changed_paths":["gitseed/cli.py","gitseed/review/approval.py","gitseed/review/commit.py","tests/test_review.py","tests/test_review_commit.py","tests/test_review_cycle.py","tests/test_review_recovery.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-84cd6d391ac2fa6d","repository_id":"gitseed","source_commit_sha":"d2a3431840b234959bddf008ad8bbfdc2fb0da95","decision_audit_anchor":"84cd6d391ac2fa6de4c15e04994aee9c09aa0b005ae3f3a0e2964f7c753b4976","ordinary_source":"T-11: persist immutable SQLite run artifacts\n","ordinary_source_sha256":"00efc969af9ac0ff30cbc93d48c87d946d790b372ce13bd486e06dd26654972b","ordinary_body_chars":45,"ordinary_body_survives":false,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":140,"deletions":0,"changed_paths":["gitseed/storage.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-8ab61d73c22d675b","repository_id":"gitseed","source_commit_sha":"959e6b3d6ee4195f55d41f65e9037d48332132a6","decision_audit_anchor":"8ab61d73c22d675b3f78e86dc7d98b57e0665399ec1fc2ffee6dac61ea521c41","ordinary_source":"Blame the model for the model's answer, and pay for what screening keeps\n\nint(result[\"idea\"]) had no validation, so a model that answered with prose\nproduced \"could not produce a grade at invalid literal for int() with base\n10\". That reads as a gitseed defect. It is not one: the model did not answer\nthe question it was asked. Against qwen2.5-coder:1.5b the reporter hit it 8\ntimes out of 8, so small models fail this way reliably rather than rarely.\n\nThe response is now checked and the failure is attributed where it belongs.\nThe message names the model, states the shape that was requested, quotes the\noutput up to a stated length rather than emptying an unbounded response into\na terminal, and ends by telling the user to choose another model. The\nadjacent shapes are handled in the same place because they are the same\ndefect: a missing key, a non-integer, a value outside the range, a\nnon-object, and prose in place of JSON. The integer check uses type() rather\nthan isinstance() so a bool cannot pass as an int.\n\nA missing grade stays missing. No retry, no default, no midpoint — a\nsubstituted number would enter the ranking and then be indistinguishable\nfrom one a model actually produced.\n\nMetadata used to be fetched for every candidate before screening ran, three\nor more calls each, roughly thirty on a default run against an\nunauthenticated budget of about sixty an hour. Candidates that screening then\nblocked had paid for metadata they never needed. The fetch now happens for\nsurvivors only, through a callback the pipeline fires when a candidate lives\npast the decision that could eliminate it.\n\nReordering a fetch can change a verdict, so that is tested rather than\nasserted: a blocked candidate costs zero metadata calls while the surviving\ncandidate's verdict is unchanged. Verified by breaking each path — removing\nthe integer check fails 2 tests, removing the range check fails 1, and\nfetching metadata for a blocked candidate again fails 1.\n","ordinary_source_sha256":"b49580788ae578dc8ddd2de4ce59a4b1ef96dce3c32dbc98fc4d70e810ba8b9b","ordinary_body_chars":1964,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":6,"insertions":143,"deletions":13,"changed_paths":["gitseed/application.py","gitseed/cli.py","gitseed/pipeline/run.py","tests/test_cli.py","tests/test_model_choice.py","tests/test_seam.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-8d262bad0a14ca64","repository_id":"gitseed","source_commit_sha":"d00efd621e8c57b23103d36c6e1c88e0334365c7","decision_audit_anchor":"8d262bad0a14ca64c9a1545448165bec50e8dc7336afa80c3f6955e86631c718","ordinary_source":"Translate README record reference to English\n","ordinary_source_sha256":"9b6081a79c8ed41c4ab79e4f87f321cec765bebe705b00691e5b4d07ea98ba7d","ordinary_body_chars":45,"ordinary_body_survives":false,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":1,"insertions":1,"deletions":1,"changed_paths":["README.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-8e59d287bd2f9248","repository_id":"gitseed","source_commit_sha":"02d96b985945a67048432b1cb1a1dea1077a74d9","decision_audit_anchor":"8e59d287bd2f9248bc4a07441918a9aef6e340cc23fd672eec56c4cc33d0d202","ordinary_source":"Fix live file selection so manifests reach the scanner and partial scans cannot read as clean\n\npackage.json and every other manifest, lockfile, and workflow file never\nreached the live security scanner: SOURCE_EXTENSIONS in gitseed/cli.py has no\n.json entry, so the postinstall rule in screen/signals.py was implemented and\nunit-tested against a fixture directory that bypasses GitHubClient.fetch_files()\nentirely, and the gap never showed up in tests (#45, GS-P0-001). Separately,\nfiles dropped by the 20-file/500KB/extension caps never affected\nseverity_of()'s output, so a 20-of-200 scan that found nothing in the 20\nreported the same \"none\" a fully-scanned clean repository would (#48,\nGS-P0-008) -- an attacker who fills the tree's first 20 entries with clean\nfiles hides everything after them, with no signal that this happened.\n\n- GitHubClient.fetch_files() now separates a priority-filename allow-list\n (manifests, lockfiles, Dockerfile, Makefile, .github/workflows/*.yml|yaml)\n from the extension allow-list, and selects priority matches before the\n 20-file count cap is applied at all -- not merely early within it -- so a\n manifest's tree position cannot push it out of the scan.\n- New SourceCoverage/SkippedFile types (gitseed/screen/coverage.py) record\n discovered/eligible/scanned file counts and separate policy-skips from\n error-skips, with complete_for_policy and complete_for_repository as two\n distinct, computed claims -- deliberately not the same question.\n- screen/verdict.risk_of() wraps severity_of() and reports\n \"none-found-in-scanned-files\" instead of a bare \"none\" when coverage says\n the scan was cut short. severity_of() itself is untouched and keeps its\n three-state discipline (T-202, ADR-0010).\n- FetchedFiles, Reviewed, and the run artifact schema all carry coverage\n through to CLI radar/explain output, so a partial scan is never rendered\n as a clean one anywhere a user reads it.\n\nFixes #45\nFixes #48\n","ordinary_source_sha256":"62e7f1f05cd6d0e0e085e005731e85319b45be49b804bf4d8a0e716c0a1bbe06","ordinary_body_chars":1950,"ordinary_body_survives":true,"removed_trailer_count":28,"residual_record_lines_removed":0,"files_changed":8,"insertions":537,"deletions":22,"changed_paths":["gitseed/artifact.py","gitseed/cli.py","gitseed/pipeline/run.py","gitseed/screen/coverage.py","gitseed/screen/verdict.py","tests/test_cli.py","tests/test_coverage.py","tests/test_signals.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-8fc3d2ec14b1c078","repository_id":"gitseed","source_commit_sha":"976ccfac8c0e3343504a6233abf98f67f2628dfa","decision_audit_anchor":"8fc3d2ec14b1c078125a65b40754012ade635b300f0f9224638a31983c254a2a","ordinary_source":"T-202: collection that reports truncation instead of hiding it\n\nThe seed has no rate-limit handling at all — `rate`, `429`, `403`,\n`X-RateLimit` and `backoff` return zero matches across its source. A search that\nhits the limit there comes back short and says nothing, and the caller writes a\nsmaller world into the database believing it is the whole one. That is worse\nthan failing: a failure gets noticed.\n\n`CollectResult.complete` is the field that carries it. Partial results are kept\nand flagged, never discarded and never passed off as whole.\n\nGitHub returns 403 for two different things — out of budget, and not allowed —\nand they are separated by the headers rather than the status. Confusing them\nmeans either sleeping an hour on a permissions error or hammering an API that\njust asked us to stop.\n\n`wait=False` is the default. Sleeping for up to an hour inside a library call is\nthe caller's decision, and either way the result says what happened.\n\nUnverified: behaviour against the real API under an actual limit; the header shapes are taken from GitHub's documentation, not observed\n","ordinary_source_sha256":"4d90d64f1d35e28e2a59ceddca0f9a1dc9ac4da7fdc1e0214ff37579bce6f619","ordinary_body_chars":1094,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":4,"insertions":392,"deletions":0,"changed_paths":["gitseed/collect/__init__.py","gitseed/collect/ratelimit.py","gitseed/collect/search.py","tests/test_collect.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-9387c3b68473bda9","repository_id":"gitseed","source_commit_sha":"c7e608c77ed14e85eb2045566111f9f7c9aee84d","decision_audit_anchor":"9387c3b68473bda9bb9a126e160ec8a2d952e20b189745a513de71c69f6aa631","ordinary_source":"Rename to gitseed, and record why the first name was wrong\n\nADR-0001 chose `gradelore` on three grounds and two of them do not hold.\n\n\"It matches CommitLore's pattern, so they form a family\" is a branding\nconvenience, not a claim about this product. In CommitLore the `lore` has a\nreferent — the accumulated decision knowledge attached to commits, which is the\nproduct. In `gradelore` the `lore` would be the scores, and 8/10 is a number,\nnot something handed down. The shape was borrowed without the meaning.\n\n\"It says what it does\" is half right after the pivot. ADR-0001 itself dropped\nthe automated social actions, so the pipeline is collect, deterministic security\nscreen, contract-verified model grading, human review queue. Grading is one step\nin the middle and the one we trust least — it sits behind a startup smoke test.\nNaming the product after it points at the wrong centre of gravity.\n\nThe owner chose `gitseed`. Availability was measured rather than assumed, which\nis what CommitLore's ADR-0009 procedure exists for: PyPI is free, which is the\nregistry this would publish to. GitHub org `gitseed` is taken by a Rust CI\nsystem at one star, and npm `gitseed` is a v0.0.0 stub abandoned in 2022 —\nneither is the case that killed `gitlore` for CommitLore, which was an active\nsame-domain package on the target registry.\n\nUnverified: whether the `seed` reading actually confuses anyone — that is a README problem and nobody has read the README yet\n","ordinary_source_sha256":"14e1a86d32ec987e18e319a4651fac5c403f6e2193bc8b63f9be05507ae2f16c","ordinary_body_chars":1457,"ordinary_body_survives":true,"removed_trailer_count":16,"residual_record_lines_removed":0,"files_changed":1,"insertions":64,"deletions":0,"changed_paths":["docs/adr/ADR-0004-name-gitseed.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-93aa115431f06a91","repository_id":"gitseed","source_commit_sha":"b51e5c5b21168fb4b9dad7b4d29602cab4a086eb","decision_audit_anchor":"93aa115431f06a9118c220a2280f790f002042eb65bf661d1492510ca47a43ff","ordinary_source":"Record and replay complete runs\n","ordinary_source_sha256":"d968298a68ed696b9c71bc6aa850f50816db678b6edfcadb7a8ff7a7a74b6b10","ordinary_body_chars":32,"ordinary_body_survives":false,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":5,"insertions":702,"deletions":8,"changed_paths":["gitseed/application.py","gitseed/artifact.py","gitseed/cli.py","tests/test_cli.py","tests/test_seam.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-9c974f0a8436c03e","repository_id":"gitseed","source_commit_sha":"aa02af3070feeac0706804ed566e377e8562459c","decision_audit_anchor":"9c974f0a8436c03e234a63aa4f5dbc240947e8ed6a948ac28146392ab44005a5","ordinary_source":"Report a truncated search instead of hiding it\n\nGitHub's Search API says when it could not finish. It sets\nincomplete_results, and it reports total_count next to the items it managed\nto return. The parser read items and discarded both, so a search that timed\nout looked exactly like one that completed, and every downstream sentence\nabout \"the candidates\" quietly meant \"some of the candidates\".\n\nBoth fields are now read, carried into the artifact, and stated where a\nperson will see them. The CLI prints candidate coverage as a fraction of the\nsearch results and names the reason when it is partial, so a count that\nmeans \"some of them\" says so. Moving the fields into a struct nobody prints\nwould have left the defect in place.\n\nCompleteness is expressed as complete_for_search, alongside the existing\ncomplete_for_policy and complete_for_repository. Truncation is one more way\na source can be incomplete, so it belongs in that vocabulary rather than in\na new parallel one.\n\nBehaviour is otherwise unchanged. A truncated search still proceeds.\nRefusing one is a product decision and adding it here quietly would be worse\nthan the bug this fixes.\n\nVerified by breaking each path and watching it fail: dropping the\nincomplete_results read fails 1 test, dropping the total_count read fails 2,\ndisabling the partiality output fails 2, and all pass again on restoration.\n","ordinary_source_sha256":"e60a501a8c03ffda45ee42ecfabbd412b532ccd1d1e5ea827cc7df5ee00796f2","ordinary_body_chars":1369,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":6,"insertions":168,"deletions":10,"changed_paths":["gitseed/artifact.py","gitseed/cli.py","gitseed/collect/search.py","tests/test_cli.py","tests/test_collect.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-9cc0a659cfa12205","repository_id":"gitseed","source_commit_sha":"ac990ab85b8821162ec6e77327dfa2234dc54d32","decision_audit_anchor":"9cc0a659cfa122058f9ffcb3f9158913ada669f3580e1fb78f174e1e06e4678a","ordinary_source":"Require evidence for a recommendation, and rank one way\n\nA recommendation was risk_verdict != HIGH, so a candidate with score 0, with\nno feature coverage, and with every metadata field unavailable came back\nrecommended. The absence of a high risk verdict is not evidence of merit. It\nis usually just absence of evidence, and saying yes on that basis is the\ndefect.\n\nStatus now carries four values, and insufficient-evidence is distinct from\nblocked and from not-priority. A caller can tell \"we looked and it does not\nrank\" apart from \"we could not see enough to say\", which is the distinction\nthe old boolean collapsed. The evidence module already had vocabulary for a\nclaim resting on nothing, so this reuses ClaimBasis rather than inventing a\nparallel idea.\n\nThe direction is verified rather than assumed. Across all 45 combinations of\nscore, coverage and risk verdict, the old predicate recommended 36 and the\nnew one reviews 4, with no case recommended now that was not recommended\nbefore. Nothing became recommended as a side effect.\n\nRanking had two sources of truth in one run: the radar sorted one way and\nthe approval queue another, with nothing saying they differed. A user saw\none order and was asked to approve in another. All four surfaces now call\nrank_review_items and the second sort is gone.\n","ordinary_source_sha256":"96bbf49dedb66796efef136701bd01fce98ac018d1e7bb496b2bcfb1165d0425","ordinary_body_chars":1309,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":4,"insertions":212,"deletions":44,"changed_paths":["gitseed/cli.py","gitseed/scoring.py","tests/test_cli.py","tests/test_scoring.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-9f9eb817a08ae4c9","repository_id":"gitseed","source_commit_sha":"8ddc6f5baba3bb39c1443910dfabdd81c4db637f","decision_audit_anchor":"9f9eb817a08ae4c9ba4d7563e6642fd2da98527b1d0b981cd647d070bd356e1c","ordinary_source":"Record the intent before the action, and the outcome after it\n\nExternal GitHub calls ran before anything durable said they were authorized.\nThe order was perform, then render, then commit, so a crash in between left\nGitHub changed and nothing local explaining by whose approval. The evidence\nof authorization arrived after the thing it authorized.\n\nNow an intent commit lands first, actions run second, and outcomes are\ncommitted third. A crash at any point leaves a record that names what was\nauthorized and what may already have run, which is the question anyone\ndebugging a half-finished run actually asks.\n\nMulti-action and multi-target runs are not made atomic, because GitHub calls\ncannot be. They are made honest instead. Each action's outcome is recorded\nindividually, a failure partway compensates what already succeeded through\nthe existing undo path, and a compensation that itself fails is recorded\nrather than swallowed.\n\nThe approval's prompt, answer and timestamp now reach the trailer block. The\ndocstring had promised they would for as long as they had not.\n\nVerified by breaking each path and watching it fail: removing the intent\ncommit fails 8 tests, disabling compensation fails 3, and both pass again on\nrestoration. Dry-run stays the default and no code path added here can issue\na live star or follow.\n","ordinary_source_sha256":"184cb2275ecf1f26150ecd9551d43120729cb399cf9930d5bad478bb65c585e0","ordinary_body_chars":1326,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":8,"insertions":493,"deletions":33,"changed_paths":["gitseed/cli.py","gitseed/review/actions.py","gitseed/review/commit.py","gitseed/review/trailers.py","tests/test_review.py","tests/test_review_commit.py","tests/test_review_cycle.py","tests/test_review_recovery.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a2ad4b77ea6a9a3b","repository_id":"gitseed","source_commit_sha":"89126ea6601590751edadfbf34b26112bb391300","decision_audit_anchor":"a2ad4b77ea6a9a3bdb6dcb3629e7d34cceb793a512909849a5d499118be3951c","ordinary_source":"Document the honest boundary for undervaluation\n\nThe current deterministic score remains an activity signal. ADR-0012 records\nwhy raw metadata and initial star observations cannot yet support an\nexpected-attention baseline, and defines the offline evidence required before\nan undervaluation score can affect recommendations.\n","ordinary_source_sha256":"30bd4e26cf1c500c26780c3757afcd407049619c5f4803bdfb703987ff1f63cc","ordinary_body_chars":325,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":1,"insertions":142,"deletions":0,"changed_paths":["docs/adr/ADR-0012-undervaluation-requires-an-attention-baseline.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a2dbaee9c683ea83","repository_id":"gitseed","source_commit_sha":"c7e608c77ed14e85eb2045566111f9f7c9aee84d","decision_audit_anchor":"a2dbaee9c683ea83bb756a7e080266fb866b59e61c90910c8f9536cf5f0e7649","ordinary_source":"Rename to gitseed, and record why the first name was wrong\n\nADR-0001 chose `gradelore` on three grounds and two of them do not hold.\n\n\"It matches CommitLore's pattern, so they form a family\" is a branding\nconvenience, not a claim about this product. In CommitLore the `lore` has a\nreferent — the accumulated decision knowledge attached to commits, which is the\nproduct. In `gradelore` the `lore` would be the scores, and 8/10 is a number,\nnot something handed down. The shape was borrowed without the meaning.\n\n\"It says what it does\" is half right after the pivot. ADR-0001 itself dropped\nthe automated social actions, so the pipeline is collect, deterministic security\nscreen, contract-verified model grading, human review queue. Grading is one step\nin the middle and the one we trust least — it sits behind a startup smoke test.\nNaming the product after it points at the wrong centre of gravity.\n\nThe owner chose `gitseed`. Availability was measured rather than assumed, which\nis what CommitLore's ADR-0009 procedure exists for: PyPI is free, which is the\nregistry this would publish to. GitHub org `gitseed` is taken by a Rust CI\nsystem at one star, and npm `gitseed` is a v0.0.0 stub abandoned in 2022 —\nneither is the case that killed `gitlore` for CommitLore, which was an active\nsame-domain package on the target registry.\n\nUnverified: whether the `seed` reading actually confuses anyone — that is a README problem and nobody has read the README yet\n","ordinary_source_sha256":"14e1a86d32ec987e18e319a4651fac5c403f6e2193bc8b63f9be05507ae2f16c","ordinary_body_chars":1457,"ordinary_body_survives":true,"removed_trailer_count":16,"residual_record_lines_removed":0,"files_changed":1,"insertions":64,"deletions":0,"changed_paths":["docs/adr/ADR-0004-name-gitseed.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a5b9e9e48752467e","repository_id":"gitseed","source_commit_sha":"9bbf6ae1cc5637f997e6b5d26fa12962d30f326b","decision_audit_anchor":"a5b9e9e48752467ec0391943c4dceccdf1ec3a9a2d45caca5de6f99dc9b1b982","ordinary_source":"Make the run artifact record its own production and actually freeze\n\nFour defects from the 2026-07-28 deep review, closed together because they are\none problem: the artifact did not record the conditions it was produced under,\nand its immutability stopped at the outer shell.\n\n#57 — a frozen dataclass wrapping mutable lists is not frozen. Collections now\nconvert to tuples at the artifact boundary, so the pipeline stays mutable while\nit runs and the artifact is immutable once it exists. The two are separate\ntypes rather than one type with a frozen decorator.\n\n#55 — engine versions are recorded. An artifact whose schema no longer matches\nfails with \"artifact schema version mismatch: recorded 3, current 4\" rather\nthan loading and being misread.\n\n#56 — source modes: metadata-only, digest, full-source. Digest is the default,\nso an artifact no longer copies up to 500KB of someone else's source per\ncandidate into a file people share, along with whatever secrets, licensed code\nor payloads it contained.\n\n#54 — replay, render and re-evaluate are three operations and were one name.\n","ordinary_source_sha256":"3ed1c468858658eebae699077a92523e561bba21086c1f7a85cee748a2934c3b","ordinary_body_chars":1087,"ordinary_body_survives":true,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":7,"insertions":423,"deletions":82,"changed_paths":["README.md","gitseed/application.py","gitseed/artifact.py","gitseed/cli.py","tests/test_cli.py","tests/test_seam.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a7b04c5208e493e4","repository_id":"gitseed","source_commit_sha":"733ce35d324395551ec7eb40cba72733d0e32813","decision_audit_anchor":"a7b04c5208e493e453ccfcf763071e1ffe0f070a221fca26213502387d17f459","ordinary_source":"Add M0-licensed versioned scoring\n\nThe scoring path is a pure three-feature weighted sum. Score values retain their weight-set version, available-feature coverage, and CollectResult-style incompleteness reasons; Recommendation requires the existing risk verdict and gates high risk outside the sum.\n","ordinary_source_sha256":"8f11fe44986d0769ef61e8e4a9020b6cd27f5135dc3047d33aab1298e9ae7875","ordinary_body_chars":299,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":2,"insertions":214,"deletions":0,"changed_paths":["gitseed/scoring.py","tests/test_scoring.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a9ec5cd512c7c2c7","repository_id":"gitseed","source_commit_sha":"d52d60f86263d5cef7269a7f9f82a89579ad6e73","decision_audit_anchor":"a9ec5cd512c7c2c74b0981464ff2aae50f06abdb4acd48ec712e26be41eb970f","ordinary_source":"T-205: an entry point, and a default that cannot write by accident\n\nFour modules were tested and nothing joined them, so nothing had ever run end to\nend. `python -m gitseed run` now walks collect → screen → grade → rank, and the\nwhole pipeline is exercised against fixtures with no network at all.\n\n`--dry-run` is the default. Every other run performs star and follow against real\naccounts, which GitHub's AUP constrains, and a tool whose default writes is a\ntool that writes by accident — the first mistyped command, the first copied\nsnippet from a README. Asking for the write is one flag; not asking for it must\nbe free.\n\nAn incomplete run exits 2 while still printing the ranking. Suppressing the\nranking would hide work that was done; exiting 0 would let \"these are the best\nrepositories\" stand when the truth is \"these are the best of what we managed to\nlook at\". Both facts are true at once and both are reported.\n","ordinary_source_sha256":"9d7f2d12c920b24cf4c071ce474ba6f8750bfb191cac4c30887ed1b9a30bed9a","ordinary_body_chars":921,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":7,"insertions":531,"deletions":2,"changed_paths":["README.md","gitseed/__main__.py","gitseed/cli.py","gitseed/collect/search.py","tests/fixtures/candidates.json","tests/fixtures/grades.json","tests/test_cli.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a9edac0b4d0f80a8","repository_id":"gitseed","source_commit_sha":"02d96b985945a67048432b1cb1a1dea1077a74d9","decision_audit_anchor":"a9edac0b4d0f80a8efa4936a799b4acbf5e7f6ac7602beac9278110f33e80864","ordinary_source":"Fix live file selection so manifests reach the scanner and partial scans cannot read as clean\n\npackage.json and every other manifest, lockfile, and workflow file never\nreached the live security scanner: SOURCE_EXTENSIONS in gitseed/cli.py has no\n.json entry, so the postinstall rule in screen/signals.py was implemented and\nunit-tested against a fixture directory that bypasses GitHubClient.fetch_files()\nentirely, and the gap never showed up in tests (#45, GS-P0-001). Separately,\nfiles dropped by the 20-file/500KB/extension caps never affected\nseverity_of()'s output, so a 20-of-200 scan that found nothing in the 20\nreported the same \"none\" a fully-scanned clean repository would (#48,\nGS-P0-008) -- an attacker who fills the tree's first 20 entries with clean\nfiles hides everything after them, with no signal that this happened.\n\n- GitHubClient.fetch_files() now separates a priority-filename allow-list\n (manifests, lockfiles, Dockerfile, Makefile, .github/workflows/*.yml|yaml)\n from the extension allow-list, and selects priority matches before the\n 20-file count cap is applied at all -- not merely early within it -- so a\n manifest's tree position cannot push it out of the scan.\n- New SourceCoverage/SkippedFile types (gitseed/screen/coverage.py) record\n discovered/eligible/scanned file counts and separate policy-skips from\n error-skips, with complete_for_policy and complete_for_repository as two\n distinct, computed claims -- deliberately not the same question.\n- screen/verdict.risk_of() wraps severity_of() and reports\n \"none-found-in-scanned-files\" instead of a bare \"none\" when coverage says\n the scan was cut short. severity_of() itself is untouched and keeps its\n three-state discipline (T-202, ADR-0010).\n- FetchedFiles, Reviewed, and the run artifact schema all carry coverage\n through to CLI radar/explain output, so a partial scan is never rendered\n as a clean one anywhere a user reads it.\n\nFixes #45\nFixes #48\n","ordinary_source_sha256":"62e7f1f05cd6d0e0e085e005731e85319b45be49b804bf4d8a0e716c0a1bbe06","ordinary_body_chars":1950,"ordinary_body_survives":true,"removed_trailer_count":28,"residual_record_lines_removed":0,"files_changed":8,"insertions":537,"deletions":22,"changed_paths":["gitseed/artifact.py","gitseed/cli.py","gitseed/pipeline/run.py","gitseed/screen/coverage.py","gitseed/screen/verdict.py","tests/test_cli.py","tests/test_coverage.py","tests/test_signals.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-ada5ec890a36e5b2","repository_id":"gitseed","source_commit_sha":"69e08ef33ecfcddce1cd5bf8df7613170909b2e7","decision_audit_anchor":"ada5ec890a36e5b2ad1c510e090e6a22369293d21b798d518e0537cd41bbbc75","ordinary_source":"T-212: a README built from what this repository can prove\n\nThe old README was a feature list. This one leads with the only genuinely unusual\nthing here — that approval is a required argument rather than a check:\n\n def star(client: GitHubWriter, repo: str, approval: Approval) -> Performed:\n\n`if approved:` can be deleted by a careless refactor; a required parameter cannot,\nand `Approval` is only constructed by a function that read a keystroke from a\nterminal. GitHub's AUP forbids automating stars and follows, so the line between a\nUI and a violation belongs in the type system, not in a branch.\n\nEvery claim is traceable to a command. Python versions from `ci.yml`, the pipeline\norder from the ticket index, model resolution read out of `cli.py`, the two\nunfinished items from the Backlog issues themselves. The badges are CI, license and\nPython versions — three things whose value can be checked right now.\n\nTwo sentences exist because leaving them out would have been the easy lie. \"No\nlive star or follow has been performed by this code.\" And a section naming what\ndoes not work yet: the review queue has never completed a live cycle because\napproval needs a TTY (#5), and the forbidden-resource 403 branch has only ever\nseen injected responses (#6).\n","ordinary_source_sha256":"99921471988726a7d23c948cdf68ab4de45547e845c0b5b20dfaae5241bf75c2","ordinary_body_chars":1261,"ordinary_body_survives":true,"removed_trailer_count":12,"residual_record_lines_removed":0,"files_changed":2,"insertions":84,"deletions":26,"changed_paths":["README.md","assets/readme/hero.svg"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-aeaeee659e7b653f","repository_id":"gitseed","source_commit_sha":"cbc629e054b6648bf02a532662c63fca6214a990","decision_audit_anchor":"aeaeee659e7b653f4add012a5fe31145f987734505c8f9da45a1c147adab4a32","ordinary_source":"Translate ticket records to English\n","ordinary_source_sha256":"dafde2b030b7f165c6312b59b92156a515aa4690c8347ee7f06854675bd07465","ordinary_body_chars":36,"ordinary_body_survives":false,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":5,"insertions":130,"deletions":130,"changed_paths":["docs/tickets/F1-collect.md","docs/tickets/F2-screen.md","docs/tickets/F3-grade.md","docs/tickets/F4-review.md","docs/tickets/TICKETS.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-aec71c78e9675ad3","repository_id":"gitseed","source_commit_sha":"a945250d195efefb8c027c0bc8242f918e2c97c7","decision_audit_anchor":"aec71c78e9675ad30cdb92c437e197758659d08816f03e6090d3186a5a38567f","ordinary_source":"ADR-0011: gate D on a backtest, not on being built\n\nThe review's own Gate D roadmap (Category -> History -> Momentum ->\nUndervalued -> Seeded at -> Share) treats the current score's missing\npopularity denominator as a gap to close by building momentum and\nundervaluation machinery. M0 already ran the measurement that framing\nassumes the answer to: its positive class was 56/118 (47.5%), so the\ncurrent score separates small repositories from medium ones, not unknown\nfrom breakout, and M0-VERDICT.md says explicitly this \"does not license a\ndiscovery claim.\" Building unmeasured growth/undervaluation/share-loop\nmachinery would repeat the mistake ADR-0007 and M0 exist to prevent, one\nlayer up, on the component closest to the product's public promise.\n","ordinary_source_sha256":"21afaca3388c39a5772a90722d0961ece685c68ee662c6ba476fd9cf3a84c9af","ordinary_body_chars":754,"ordinary_body_survives":true,"removed_trailer_count":11,"residual_record_lines_removed":0,"files_changed":1,"insertions":143,"deletions":0,"changed_paths":["docs/adr/ADR-0011-gate-d-requires-a-backtest.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-af8446560274248d","repository_id":"gitseed","source_commit_sha":"b51e5c5b21168fb4b9dad7b4d29602cab4a086eb","decision_audit_anchor":"af8446560274248d2723dab8dd5445ea684c61bb397b6d798bc1855f27f24eb2","ordinary_source":"Record and replay complete runs\n","ordinary_source_sha256":"d968298a68ed696b9c71bc6aa850f50816db678b6edfcadb7a8ff7a7a74b6b10","ordinary_body_chars":32,"ordinary_body_survives":false,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":5,"insertions":702,"deletions":8,"changed_paths":["gitseed/application.py","gitseed/artifact.py","gitseed/cli.py","tests/test_cli.py","tests/test_seam.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-b0282a5d21a52335","repository_id":"gitseed","source_commit_sha":"f2e853540f0bb7813eca1c1d99143b62b3f7a28a","decision_audit_anchor":"b0282a5d21a52335706fbd8916b10bc51bcdb66efa39ed2dc44897a42d0f9bf3","ordinary_source":"Genesis: gradelore — 씨앗의 아이디어는 계승하고 정책 위반은 버린다\n\nfollowme(993줄, 테스트 0, CI 0, 라이선스 없음)를 씨앗으로 재구축한다. 계승하는 것은\n\"로컬 LLM으로 GitHub 레포를 채점한다\"는 아이디어이고, 버리는 것은 그것을 실행하는\n방식이다.\n\nPhase 1 반증이 방향을 바꿨다. GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다. 씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계가 정확히 그것이다. 그래서\n읽기 전용 분석과 사람이 건건이 승인하는 리뷰 큐로 간다.\n\n재현 실험에서 내 추정이 세 번 틀렸다. 마이그레이션도 dry-run 도 씨앗에 이미 있었고,\n\"채점이 비결정적\"은 재현되지 않았다(7b 에서 idea·skill sd=0.000, n=10). 셋 다 clone\n을 읽기 전에 결함 목록을 쓴 결과다. 정정 이력은 docs/PHASE1-EVIDENCE.md 에 남겼다.\n\n남은 진짜 결함은 다른 것이었다. 씨앗은 모델이 설치됐는지만 확인하고 출력 계약을 지킬\n수 있는지는 확인하지 않는다. 1.5b 에서 깨끗한 코드의 64%(9/14)를 악성으로 판정하며\nsecurity_flag 와 security_reason 이 서로 모순된다. 7b·32b 에서는 0/14 다. 작은\n기계에서 작은 모델을 고르는 것은 합리적인데 사용자는 경고 없이 오판 도구를 쥔다.\n\nUnverified: 32b 채점 결정성 — 보안 판정만 측정했고 점수 분산은 재지 않았다\n","ordinary_source_sha256":"95bbb402d240a0fed629e1c52d0ec5b707781166ff855ea0f1aeeefeef8a092d","ordinary_body_chars":843,"ordinary_body_survives":true,"removed_trailer_count":18,"residual_record_lines_removed":0,"files_changed":12,"insertions":605,"deletions":0,"changed_paths":[".gitignore","AGENTS.md","LICENSE","docs/PHASE0.md","docs/PHASE1-EVIDENCE.md","docs/adr/ADR-0001-identity.md","docs/adr/ADR-0002-scope-v010.md","docs/adr/ADR-0003-language-runtime.md","docs/prd/PRD-F1-collect.md","docs/prd/PRD-F2-screen.md","docs/prd/PRD-F3-grade.md","docs/prd/PRD-F4-review.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-b291655fbfd2003b","repository_id":"gitseed","source_commit_sha":"43921d4cc89645061b68f316fbe72ba2ded9473d","decision_audit_anchor":"b291655fbfd2003b06a8c93dfefb52a3eaa2682c8caa4b4b48093bb3587eff89","ordinary_source":"F7: categorize from deterministic evidence\n","ordinary_source_sha256":"0c27ac94f407054443e8e8133d4153a5b1d7a8e7d41043b28022f8953866500e","ordinary_body_chars":43,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":2,"insertions":263,"deletions":0,"changed_paths":["gitseed/category.py","tests/test_category.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-b3568fcfe78e5aab","repository_id":"gitseed","source_commit_sha":"6441a4b9a2a3356dc95f8b737705f9f6212119d7","decision_audit_anchor":"b3568fcfe78e5aaba2967d4c31de9a95abc978d21012bff1a394f25db2f4a662","ordinary_source":"T-213: the approval path finally ran, in a real terminal (closes #5)\n\n`collect_approval` refuses a non-tty by design: a piped `y` and a person's `y` are\nthe same bytes and opposite meanings, and accepting the first would make this tool\n`yes | gitseed run` — the automation GitHub's AUP forbids. The cost was that the\napproval path had never executed end to end. Three live attempts died before\nreaching it (a model timeout, an unencoded URL, an exhausted quota), and the README\nsaid so.\n\n`tests/test_review_cycle.py` drives the CLI under `pty`, so `isatty()` is genuinely\ntrue and nothing in production had to be relaxed. **No test-only bypass flag was\nadded.** The refusal is the feature; a flag that disables it would be switched on\nin CI within a month, and then the tool would be the thing it was designed not to\nbe.\n\nThe cycle asserted: approve one, reject another, quit before the rest; the\nrecording writer saw exactly the write the approval authorised and no other; the\nrejection produced a `Ruled-out:` carrying its reason; the printed trailer block\npasses `commitlore validate`; `--approve-all` asks once and derives one approval\nper target.\n\nOrder is asserted too — ranking, then question, then action, then trailers. A\nprompt appearing before the ranking would mean the reviewer decided without seeing\nthe evidence, and only a real terminal makes that sequence observable.\n","ordinary_source_sha256":"578d67cc55360c245cb009350df6e40308eaf9f5dea57054c13836c32852d713","ordinary_body_chars":1385,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":6,"insertions":194,"deletions":4,"changed_paths":["README.md","gitseed/cli.py","tests/fixtures/candidates.json","tests/fixtures/grades.json","tests/test_cli.py","tests/test_review_cycle.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-b6075c378778faff","repository_id":"gitseed","source_commit_sha":"eb2679ebe86e3b3df4560876627f0aaca6937401","decision_audit_anchor":"b6075c378778faff8b734dab0a0f2192859cb14da7bca6d19d1017305dd4766d","ordinary_source":"Preserve raw repository metadata\n","ordinary_source_sha256":"d98a1faac1bb32c9ab0fe4385f93440a74ae180e2038c8b7e72d4d8db1423fb4","ordinary_body_chars":33,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":8,"insertions":396,"deletions":47,"changed_paths":["gitseed/adapters.py","gitseed/artifact.py","gitseed/scoring.py","tests/test_adapters.py","tests/test_cli.py","tests/test_scoring.py","tests/test_seam.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-b9bba3d1416828fa","repository_id":"gitseed","source_commit_sha":"ec9ecb5a97a43a20475255f602082f427ca0808e","decision_audit_anchor":"b9bba3d1416828fa944b51f72aac690b31d7ec6cda387efa8a221b7603b33f31","ordinary_source":"T-203: make an unapproved external write impossible to express\n\nF4 is the first layer of this tool that writes to GitHub, and it writes exactly\nwhat the AUP forbids automating: stars and follows. A check like `if approved:`\nputs the line between a UI and a violation on one branch, and that branch will\neventually be taken by mistake.\n\nSo approval is an argument, not a check. `star` and `follow` require an\n`Approval`, and `Approval` is only constructed by a function that read a human's\nkeystroke from a terminal. There is no code path that writes without one; writing\nwithout one would mean fabricating the value, and the value carries what the\nperson saw.\n\n`--approve-all` obeys the same rule: the whole listing is printed, one answer is\ntaken, and that answer is derived into as many approvals as there are targets —\neach carrying the bulk prompt, so an auditor can tell a per-item decision from a\nbatch one by reading the trailers.\n\nRejections are recorded too. The output of this tool is a list of judgements,\nand half of a judgement list is what was declined; keeping only approvals turns\nthe log into a list of actions and loses the reason anything was skipped.\n\nUnverified: no GitHub call has been made from this code — the writer is a protocol satisfied by a recording fake in every test\n","ordinary_source_sha256":"9bd46b0fb820fb78d331bf8f5370bbcbbaf0acca12574ea5e63207a3d58cc921","ordinary_body_chars":1299,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":6,"insertions":713,"deletions":0,"changed_paths":["docs/tickets/F4-review.md","gitseed/review/__init__.py","gitseed/review/actions.py","gitseed/review/approval.py","gitseed/review/trailers.py","tests/test_review.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-badec4c4ee9efb2a","repository_id":"gitseed","source_commit_sha":"b2d05ab85acd9cb2a9d7313ff88db2fe2744dde1","decision_audit_anchor":"badec4c4ee9efb2a2c6911801f84147538432cb3e042641f0445bc3046b34c56","ordinary_source":"Order the changelog newest first\n\nThe 0.2.0 stub sat above 0.3.0 because the brief that requested the file\nlisted them in that order, and the writer followed the brief rather than the\nconvention. A reader opening a changelog expects the release they are about to\ninstall at the top; putting the older stub first makes the newest section look\nlike an appendix to it.\n\n0.2.0 also gained the date of its tag, which is the only fact the stub can\ncarry that a reader cannot get from the heading itself.\n","ordinary_source_sha256":"18b907ee3a79dcd2a279bfe2f011cd45eba2e7dc06603e379c2c7484f5f5116e","ordinary_body_chars":498,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":1,"insertions":5,"deletions":3,"changed_paths":["CHANGELOG.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-bdf15182275d02b8","repository_id":"gitseed","source_commit_sha":"3909d51842ddc67daefa99136a479bafcac0d223","decision_audit_anchor":"bdf15182275d02b8c857f39f578d2272ce4d45e77c14dbe5f3dfef00eb6384ee","ordinary_source":"PRD-F3: record supersession by F6, rule out model-tag caching\n","ordinary_source_sha256":"6fc0ea4113a0ef1551f8138f49ac9c848ed3ca474a66a6658768886901a7130a","ordinary_body_chars":62,"ordinary_body_survives":false,"removed_trailer_count":12,"residual_record_lines_removed":0,"files_changed":2,"insertions":28,"deletions":0,"changed_paths":["docs/prd/PRD-F3-grade.md","docs/tickets/F3-grade.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-bef9b4e179c50fe8","repository_id":"gitseed","source_commit_sha":"e9908a36c231131a5e5677275acc1de3f74b74e7","decision_audit_anchor":"bef9b4e179c50fe8d7ce20a5f2647b31591a46e2cd715d29bfae7cc4695ae106","ordinary_source":"T-301: the smoke gate, and the prompt is the root cause\n\nThe gate proves a model can hold the output contract before any score is\ntrusted. Failing it switches grading off and leaves the deterministic screen\nrunning, because a screen without scores is degraded and a score nobody\nverified is wrong.\n\nBuilding it corrected D-3. That finding said the seed never checks whether the\nmodel can hold the contract, and blamed model size. Separating the confound on\na clean digest, n=12: 1.5b under the seed's prompt flags 9 of 12 and bleeds the\nwarning into `description` 11 of 12; 1.5b under a strict prompt does neither;\n7b does neither under either. The failure needs both.\n\nNarrowed further to the wording. The seed says\n\n begin description with '⚠ SECURITY: '\n\nand moving that marker out of quotes into prose takes 1.5b from 4-6 in 10 to\n0 in 10. A quoted literal in an instruction reads to a small model as content to\nemit. That is a design rule for this project, not just a note about the seed.\n\nTwo of my own mistakes are in here. The gate first sampled the clean check once,\nwhich would clear a model failing 64% of the time on roughly a quarter of\nattempts — a gate that passes a broken model that often is decoration, so it\nsamples five times now. And the first live check paraphrased the seed's prompt,\nwhich dropped the quoted literal and passed all four combinations; it uses the\nverbatim prompt now.\n\nUnverified: 32b under the seed prompt — measured for security flags earlier (0/14) but not through this gate\n","ordinary_source_sha256":"c7c95a33f5e562a421c6ab855545869605ebb60aa8ab5647bb7c260210ef2a73","ordinary_body_chars":1520,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":5,"insertions":428,"deletions":0,"changed_paths":["docs/PHASE1-EVIDENCE.md","gitseed/grade/__init__.py","gitseed/grade/smoke.py","gitseed/grade/types.py","tests/test_smoke.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c08dac879bbde6a4","repository_id":"gitseed","source_commit_sha":"6679fa225232c63a8987f5ec23dd7deeb839fc4f","decision_audit_anchor":"c08dac879bbde6a432406755a92746a9db05377a20751dd38cde5a983d9fdad5","ordinary_source":"Bump gitseed/__init__.py to 0.3.0 and fix the stale Known limitations section\n\nTwo corrections to the release-0.3.0 branch, both requested after the first\ncommit here (ed500c2) shipped with a scope error.\n\ngitseed/__init__.py was left at 0.2.0 because the closed packet forbade\ngitseed/ as a whole; that exclusion did not intend to cover the version\nconstant. It now reads 0.3.0, matching pyproject.toml.\n\nREADME.md's \"Known limitations (as of the 2026-07-28 review)\" section listed\nissues #36, #45, #46, #48, and #49 as unaddressed. Checked each against\ncurrent source rather than trusting its closing PR:\n\n- #45 (package.json invisible to the live scanner): fixed. PRIORITY_FILENAMES\n + _is_priority_path (gitseed/cli.py) select package.json regardless of\n SOURCE_EXTENSIONS, and signals.py:83's is_manifest check fires the\n postinstall rule against it.\n- #46 (zero-evidence candidates render as recommended): fixed.\n Recommendation.status (gitseed/scoring.py) is four-valued; a candidate with\n ABSENT score basis, incomplete score coverage, or an unknown/\n none-found-in-scanned-files risk verdict now returns INSUFFICIENT_EVIDENCE,\n not REVIEW.\n- #48 (cap-skipped files don't affect severity): fixed. risk_of\n (gitseed/screen/verdict.py) returns none-found-in-scanned-files instead of\n a bare none whenever SourceCoverage.complete_for_policy is False, and that\n value routes into #46's INSUFFICIENT_EVIDENCE branch above.\n- #36 (radar and approval rank by different scores): fixed.\n rank_review_items (gitseed/cli.py) is the only ranking path reachable from\n radar, --json, explain, or approval; pipeline.run.ranked() is called only\n from tests/test_pipeline.py.\n- #49 (raw tree-order selection lets a malicious file hide past the scan\n cap): still true for non-priority files. Priority filenames bypass the cap\n entirely, but regular_candidates in GitHubClient.fetch_files is still\n truncated at SOURCE_FILE_COUNT_CAP in raw tree order, confirmed by\n tests/test_cli.py:1006's 200-file fixture (only the first 20 scanned). The\n closing commit (02d96b9) says so itself in a Ruled-out trailer: general\n file ordering was explicitly left unchanged, scoped out of that fix. Kept\n in the README, rewritten to say what's actually still exposed (a\n non-manifest file can still be excluded by tree position) versus what #48\n already fixed (that exclusion is no longer reported as a clean scan).\n\nThe section heading no longer pins to a review date or a stale commit\n(d0e1ecd, now 61+ commits behind); the one remaining item cites the issue and\nthe specific commit that explains why it wasn't fully closed, inline.\n","ordinary_source_sha256":"e23d45e2babcee494eb038edeed3e920e4b13727272f15b7fb94d654bba223de","ordinary_body_chars":2632,"ordinary_body_survives":true,"removed_trailer_count":18,"residual_record_lines_removed":0,"files_changed":2,"insertions":22,"deletions":32,"changed_paths":["README.md","gitseed/__init__.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c27e59f236ed7496","repository_id":"gitseed","source_commit_sha":"02d96b985945a67048432b1cb1a1dea1077a74d9","decision_audit_anchor":"c27e59f236ed7496d8bc6453707ee901d71150b9da406b0dc226f704893ce4cf","ordinary_source":"Fix live file selection so manifests reach the scanner and partial scans cannot read as clean\n\npackage.json and every other manifest, lockfile, and workflow file never\nreached the live security scanner: SOURCE_EXTENSIONS in gitseed/cli.py has no\n.json entry, so the postinstall rule in screen/signals.py was implemented and\nunit-tested against a fixture directory that bypasses GitHubClient.fetch_files()\nentirely, and the gap never showed up in tests (#45, GS-P0-001). Separately,\nfiles dropped by the 20-file/500KB/extension caps never affected\nseverity_of()'s output, so a 20-of-200 scan that found nothing in the 20\nreported the same \"none\" a fully-scanned clean repository would (#48,\nGS-P0-008) -- an attacker who fills the tree's first 20 entries with clean\nfiles hides everything after them, with no signal that this happened.\n\n- GitHubClient.fetch_files() now separates a priority-filename allow-list\n (manifests, lockfiles, Dockerfile, Makefile, .github/workflows/*.yml|yaml)\n from the extension allow-list, and selects priority matches before the\n 20-file count cap is applied at all -- not merely early within it -- so a\n manifest's tree position cannot push it out of the scan.\n- New SourceCoverage/SkippedFile types (gitseed/screen/coverage.py) record\n discovered/eligible/scanned file counts and separate policy-skips from\n error-skips, with complete_for_policy and complete_for_repository as two\n distinct, computed claims -- deliberately not the same question.\n- screen/verdict.risk_of() wraps severity_of() and reports\n \"none-found-in-scanned-files\" instead of a bare \"none\" when coverage says\n the scan was cut short. severity_of() itself is untouched and keeps its\n three-state discipline (T-202, ADR-0010).\n- FetchedFiles, Reviewed, and the run artifact schema all carry coverage\n through to CLI radar/explain output, so a partial scan is never rendered\n as a clean one anywhere a user reads it.\n\nFixes #45\nFixes #48\n","ordinary_source_sha256":"62e7f1f05cd6d0e0e085e005731e85319b45be49b804bf4d8a0e716c0a1bbe06","ordinary_body_chars":1950,"ordinary_body_survives":true,"removed_trailer_count":28,"residual_record_lines_removed":0,"files_changed":8,"insertions":537,"deletions":22,"changed_paths":["gitseed/artifact.py","gitseed/cli.py","gitseed/pipeline/run.py","gitseed/screen/coverage.py","gitseed/screen/verdict.py","tests/test_cli.py","tests/test_coverage.py","tests/test_signals.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c38d520fe83cb7d5","repository_id":"gitseed","source_commit_sha":"ec9ecb5a97a43a20475255f602082f427ca0808e","decision_audit_anchor":"c38d520fe83cb7d5b12c3d792407b0e7ff86ad900a6e547b1946bbd0592724a2","ordinary_source":"T-203: make an unapproved external write impossible to express\n\nF4 is the first layer of this tool that writes to GitHub, and it writes exactly\nwhat the AUP forbids automating: stars and follows. A check like `if approved:`\nputs the line between a UI and a violation on one branch, and that branch will\neventually be taken by mistake.\n\nSo approval is an argument, not a check. `star` and `follow` require an\n`Approval`, and `Approval` is only constructed by a function that read a human's\nkeystroke from a terminal. There is no code path that writes without one; writing\nwithout one would mean fabricating the value, and the value carries what the\nperson saw.\n\n`--approve-all` obeys the same rule: the whole listing is printed, one answer is\ntaken, and that answer is derived into as many approvals as there are targets —\neach carrying the bulk prompt, so an auditor can tell a per-item decision from a\nbatch one by reading the trailers.\n\nRejections are recorded too. The output of this tool is a list of judgements,\nand half of a judgement list is what was declined; keeping only approvals turns\nthe log into a list of actions and loses the reason anything was skipped.\n\nUnverified: no GitHub call has been made from this code — the writer is a protocol satisfied by a recording fake in every test\n","ordinary_source_sha256":"9bd46b0fb820fb78d331bf8f5370bbcbbaf0acca12574ea5e63207a3d58cc921","ordinary_body_chars":1299,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":6,"insertions":713,"deletions":0,"changed_paths":["docs/tickets/F4-review.md","gitseed/review/__init__.py","gitseed/review/actions.py","gitseed/review/approval.py","gitseed/review/trailers.py","tests/test_review.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c8e57b42ac2635de","repository_id":"gitseed","source_commit_sha":"fcee89903f1547a7158f63fc380431b89753f027","decision_audit_anchor":"c8e57b42ac2635de412064f0b7a61d0a9f30010af047d823f2549d9a412aa89a","ordinary_source":"ADR-0010: replace recommended: bool with a four-state status\n\nRecommendation.recommended is risk_verdict != HIGH, which makes zero\nsecurity coverage, zero score coverage, and unknown risk all read as a\npositive recommendation. The review proposes a four-state\nRecommendationStatus (BLOCKED / INSUFFICIENT_EVIDENCE / REVIEW /\nNOT_PRIORITY); this ADR assesses the proposal rather than adopting it\nuncritically, and accepts it: BLOCKED and INSUFFICIENT_EVIDENCE answer two\ngenuinely independent questions (was there a blocking finding; is there\nenough evidence to have an opinion at all), and REVIEW/NOT_PRIORITY are what\nthat pair produces once evidence is sufficient, at the same explicit\ngranularity instead of leaving one branch as a bare score number.\n","ordinary_source_sha256":"aab88337341dc8736d283305564d83afb4daa9f44516fad20792e3fe1a2aa857","ordinary_body_chars":754,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":1,"insertions":126,"deletions":0,"changed_paths":["docs/adr/ADR-0010-recommendation-status-not-boolean.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c9391d155d7a3fd6","repository_id":"gitseed","source_commit_sha":"b51e5c5b21168fb4b9dad7b4d29602cab4a086eb","decision_audit_anchor":"c9391d155d7a3fd6f2a6a4c09cb6cf598487894f0dcde8ca893e7268ee163e56","ordinary_source":"Record and replay complete runs\n","ordinary_source_sha256":"d968298a68ed696b9c71bc6aa850f50816db678b6edfcadb7a8ff7a7a74b6b10","ordinary_body_chars":32,"ordinary_body_survives":false,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":5,"insertions":702,"deletions":8,"changed_paths":["gitseed/application.py","gitseed/artifact.py","gitseed/cli.py","tests/test_cli.py","tests/test_seam.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-c976dc2332d4adab","repository_id":"gitseed","source_commit_sha":"ec9ecb5a97a43a20475255f602082f427ca0808e","decision_audit_anchor":"c976dc2332d4adab7e878a66192d1e7d51679428394386e22c3acd37f121ea20","ordinary_source":"T-203: make an unapproved external write impossible to express\n\nF4 is the first layer of this tool that writes to GitHub, and it writes exactly\nwhat the AUP forbids automating: stars and follows. A check like `if approved:`\nputs the line between a UI and a violation on one branch, and that branch will\neventually be taken by mistake.\n\nSo approval is an argument, not a check. `star` and `follow` require an\n`Approval`, and `Approval` is only constructed by a function that read a human's\nkeystroke from a terminal. There is no code path that writes without one; writing\nwithout one would mean fabricating the value, and the value carries what the\nperson saw.\n\n`--approve-all` obeys the same rule: the whole listing is printed, one answer is\ntaken, and that answer is derived into as many approvals as there are targets —\neach carrying the bulk prompt, so an auditor can tell a per-item decision from a\nbatch one by reading the trailers.\n\nRejections are recorded too. The output of this tool is a list of judgements,\nand half of a judgement list is what was declined; keeping only approvals turns\nthe log into a list of actions and loses the reason anything was skipped.\n\nUnverified: no GitHub call has been made from this code — the writer is a protocol satisfied by a recording fake in every test\n","ordinary_source_sha256":"9bd46b0fb820fb78d331bf8f5370bbcbbaf0acca12574ea5e63207a3d58cc921","ordinary_body_chars":1299,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":6,"insertions":713,"deletions":0,"changed_paths":["docs/tickets/F4-review.md","gitseed/review/__init__.py","gitseed/review/actions.py","gitseed/review/approval.py","gitseed/review/trailers.py","tests/test_review.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-cadfb63755c3f504","repository_id":"gitseed","source_commit_sha":"c8ce4385e6222dae3f30847a83037ea7e9919b1f","decision_audit_anchor":"cadfb63755c3f5046cddc8b502821218f92bf863fe0c42206a81ca6892402e21","ordinary_source":"T-204: wire the stages, and make an unfinished run impossible to mistake for a thin one\n\nThe stages were each honest alone. The seam is where that stops being true: a\nrate limit shortens the candidate list, a screening error shortens it, a model\nthat refuses shortens it — and every one of those looks exactly like \"not many\ngood repositories today\". The second is a finding; the first three are bugs, and\na reviewer approving against them is approving against a picture that was never\nreal.\n\n`PipelineResult.complete` is therefore never inferred from a non-empty list. One\nunreachable repository is recorded against that repository and does not end the\nrun, because nine that were fine are not worth discarding for one 404.\n\nScreening decides before a model is asked. A candidate scanning at `high`\nseverity never reaches the grader — spending tokens to re-decide it is the small\ncost, and the real one is that an enthusiastic grade becomes an argument to\noverride a security signal.\n\nThe grader is not told how popular a repository is. Stars and push dates are\nwithheld from the digest: a grader told a repository has 40k stars has been told\nthe answer, and the point of grading is a judgement that does not already know it.\n","ordinary_source_sha256":"7f27e85f693b4295400889c47773e12efbfb8b683f68052b416ae47b3a21cd0a","ordinary_body_chars":1227,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":3,"insertions":414,"deletions":0,"changed_paths":["gitseed/pipeline/__init__.py","gitseed/pipeline/run.py","tests/test_pipeline.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d56e88f5ef1b62cb","repository_id":"gitseed","source_commit_sha":"badaaabcbf6cec1c1bc8eba5325bf1ec596c7dca","decision_audit_anchor":"d56e88f5ef1b62cb29036bea6a607e3475bd4a4e36098c56483022fb4f91f1ef","ordinary_source":"Bring the handoff to the state the repository is actually in\n\nEleven pull requests landed after the first version was written and it now\ndescribes a repository that no longer exists. Tests went 289 to 305, open\nissues 12 to 4, and every issue it listed under correctness and the category\nsystem is closed.\n\nThe approval-gate section gains the thing that makes it worth reading: the\ncheck has now been run against five separate pull requests, and it caught a\nreal coupling in one of them whose own tests passed. A reader who treats it as\nceremony will skip it exactly when it matters.\n","ordinary_source_sha256":"5cff1511bc5390299300981a343ec94d709e966b8b9aac5a6fc6a4d46594680f","ordinary_body_chars":584,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":1,"insertions":17,"deletions":17,"changed_paths":["HANDOFF.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d5b3514664089aef","repository_id":"gitseed","source_commit_sha":"6072c2ab43def5c23bddedd15617c560720fb3ab","decision_audit_anchor":"d5b3514664089aefaeeb09cdb263347f7c7aa716df24cabd31e309223480278c","ordinary_source":"T-201: the deterministic screen, and it refuses to guess\n\nThis is the keystone because it is the only layer that works without a model.\nADR-0002 requires the pipeline to complete on F2 alone when F3's smoke test\nfails, so F3 depends on this and not the other way round.\n\nA Signal cannot be constructed without a citation — path, 1-based line, and the\nline itself. That is not defensive programming. An uncitable finding is the\nfailure this layer exists to avoid: the seed emitted a boolean whose stated\nreason sometimes said the code was fine, and a user could not go and look.\n\nThe ten clean fixtures each carry a trap for a naive rule: a real sha256\nconstant, a base64 test vector, a loopback and a private address, a docker\ncommand with no pipe. A screen that fires on those gets switched off, and then\nnobody reads the real findings either.\n\nMutation-proven rather than asserted green. Eight mutations, eight failures:\ndisabling the install-script rule, removing either citation guard, dropping the\nseverity check, unscoping postinstall from manifests, and lowering the base64,\nhex and private-IP thresholds — the last three fail specifically on the traps\nplanted in the clean corpus.\n\nUnverified: the typosquatting dependency list — named in the ticket, not built, because its source and refresh cadence are undecided\n","ordinary_source_sha256":"1b423fc3a32eaf2ee410af8197fe65adfde2a4e5262a20a9916d6ea014f54a42","ordinary_body_chars":1323,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":22,"insertions":396,"deletions":0,"changed_paths":[".github/workflows/ci.yml","gitseed/__init__.py","gitseed/screen/__init__.py","gitseed/screen/signals.py","gitseed/screen/verdict.py","pyproject.toml","tests/fixtures/clean/a_logger.py","tests/fixtures/clean/b_setup.sh","tests/fixtures/clean/c_package.json","tests/fixtures/clean/d_client.py","tests/fixtures/clean/e_hash.py","tests/fixtures/clean/f_config.py","tests/fixtures/clean/g_readme.md","tests/fixtures/clean/h_docker.sh","tests/fixtures/clean/i_key.py","tests/fixtures/clean/j_ci.yml","tests/fixtures/malicious/beacon.py","tests/fixtures/malicious/hexblob.py","tests/fixtures/malicious/install_pipe.sh","tests/fixtures/malicious/obfuscated.js","tests/fixtures/malicious/package.json","tests/test_signals.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d9887355b9eff3e9","repository_id":"gitseed","source_commit_sha":"976ccfac8c0e3343504a6233abf98f67f2628dfa","decision_audit_anchor":"d9887355b9eff3e9d92cd5e8c045ff691184519ce9697cd9bcb0e88635515fdd","ordinary_source":"T-202: collection that reports truncation instead of hiding it\n\nThe seed has no rate-limit handling at all — `rate`, `429`, `403`,\n`X-RateLimit` and `backoff` return zero matches across its source. A search that\nhits the limit there comes back short and says nothing, and the caller writes a\nsmaller world into the database believing it is the whole one. That is worse\nthan failing: a failure gets noticed.\n\n`CollectResult.complete` is the field that carries it. Partial results are kept\nand flagged, never discarded and never passed off as whole.\n\nGitHub returns 403 for two different things — out of budget, and not allowed —\nand they are separated by the headers rather than the status. Confusing them\nmeans either sleeping an hour on a permissions error or hammering an API that\njust asked us to stop.\n\n`wait=False` is the default. Sleeping for up to an hour inside a library call is\nthe caller's decision, and either way the result says what happened.\n\nUnverified: behaviour against the real API under an actual limit; the header shapes are taken from GitHub's documentation, not observed\n","ordinary_source_sha256":"4d90d64f1d35e28e2a59ceddca0f9a1dc9ac4da7fdc1e0214ff37579bce6f619","ordinary_body_chars":1094,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":4,"insertions":392,"deletions":0,"changed_paths":["gitseed/collect/__init__.py","gitseed/collect/ratelimit.py","gitseed/collect/search.py","tests/test_collect.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-dc67b4d3b699b947","repository_id":"gitseed","source_commit_sha":"f2e853540f0bb7813eca1c1d99143b62b3f7a28a","decision_audit_anchor":"dc67b4d3b699b94781f8d300d061ee9230483b19bb8c8a938af9cdde49982344","ordinary_source":"Genesis: gradelore — 씨앗의 아이디어는 계승하고 정책 위반은 버린다\n\nfollowme(993줄, 테스트 0, CI 0, 라이선스 없음)를 씨앗으로 재구축한다. 계승하는 것은\n\"로컬 LLM으로 GitHub 레포를 채점한다\"는 아이디어이고, 버리는 것은 그것을 실행하는\n방식이다.\n\nPhase 1 반증이 방향을 바꿨다. GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다. 씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계가 정확히 그것이다. 그래서\n읽기 전용 분석과 사람이 건건이 승인하는 리뷰 큐로 간다.\n\n재현 실험에서 내 추정이 세 번 틀렸다. 마이그레이션도 dry-run 도 씨앗에 이미 있었고,\n\"채점이 비결정적\"은 재현되지 않았다(7b 에서 idea·skill sd=0.000, n=10). 셋 다 clone\n을 읽기 전에 결함 목록을 쓴 결과다. 정정 이력은 docs/PHASE1-EVIDENCE.md 에 남겼다.\n\n남은 진짜 결함은 다른 것이었다. 씨앗은 모델이 설치됐는지만 확인하고 출력 계약을 지킬\n수 있는지는 확인하지 않는다. 1.5b 에서 깨끗한 코드의 64%(9/14)를 악성으로 판정하며\nsecurity_flag 와 security_reason 이 서로 모순된다. 7b·32b 에서는 0/14 다. 작은\n기계에서 작은 모델을 고르는 것은 합리적인데 사용자는 경고 없이 오판 도구를 쥔다.\n\nUnverified: 32b 채점 결정성 — 보안 판정만 측정했고 점수 분산은 재지 않았다\n","ordinary_source_sha256":"95bbb402d240a0fed629e1c52d0ec5b707781166ff855ea0f1aeeefeef8a092d","ordinary_body_chars":843,"ordinary_body_survives":true,"removed_trailer_count":18,"residual_record_lines_removed":0,"files_changed":12,"insertions":605,"deletions":0,"changed_paths":[".gitignore","AGENTS.md","LICENSE","docs/PHASE0.md","docs/PHASE1-EVIDENCE.md","docs/adr/ADR-0001-identity.md","docs/adr/ADR-0002-scope-v010.md","docs/adr/ADR-0003-language-runtime.md","docs/prd/PRD-F1-collect.md","docs/prd/PRD-F2-screen.md","docs/prd/PRD-F3-grade.md","docs/prd/PRD-F4-review.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-dce89f8ad4b7064a","repository_id":"gitseed","source_commit_sha":"a5d8df803047c3eda4ca8fa4c81bb022adfd3ae8","decision_audit_anchor":"dce89f8ad4b7064afbb21386ed28d152c99ea26173a11aec9f6451f1723d2d51","ordinary_source":"Translate ADR records to English\n","ordinary_source_sha256":"f253e2f1ca10530471cde2cf9083fbf9fe635f8af3eeca7b1e209152843cb6ae","ordinary_body_chars":33,"ordinary_body_survives":false,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":4,"insertions":125,"deletions":126,"changed_paths":["docs/adr/ADR-0001-identity.md","docs/adr/ADR-0002-scope-v010.md","docs/adr/ADR-0003-language-runtime.md","docs/adr/ADR-0004-name-gitseed.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-df6bfd03300910e2","repository_id":"gitseed","source_commit_sha":"0eedc8f210cda14d29ee1dcb5bb3e43f783706e0","decision_audit_anchor":"df6bfd03300910e2e0bf695b724b346685c902ed4bccb88be34bfb14872581b8","ordinary_source":"Connect category packs to run artifacts\n\nCategory selection now travels from the CLI and RunRequest through execute into radar, explain, and the replayable artifact. The built-in coding-agents pack requires AGENTS.md plus deterministic agent runtime source evidence, so an instructions file alone is reported as uncategorized rather than as a product classification.\n\nArtifacts embed the selected bounded pack definitions and their extracted deterministic evidence. This preserves composite pack identity and lets a reader re-derive each stored category result without retaining source bodies.\n","ordinary_source_sha256":"33c1fe99e4765ea9576ef7f97c1d88470ec981989b2d8e4044c64cd2b2318246","ordinary_body_chars":594,"ordinary_body_survives":true,"removed_trailer_count":17,"residual_record_lines_removed":0,"files_changed":10,"insertions":335,"deletions":79,"changed_paths":["gitseed/application.py","gitseed/artifact.py","gitseed/category.py","gitseed/cli.py","gitseed/ports.py","tests/test_category.py","tests/test_cli.py","tests/test_scoring.py","tests/test_seam.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-dfafe1ae814a5dfe","repository_id":"gitseed","source_commit_sha":"d54ea6c95010741a14ff137dc78136fec8a23590","decision_audit_anchor":"dfafe1ae814a5dfeb964289f52c3d425057bb9a4574e94738bdd4bc95c568ed3","ordinary_source":"T-224: wire CommitLore integration\n","ordinary_source_sha256":"f881d8feef0a804f40008cf7e4a5c4c09ef2bb1bd9cffae10a92f44c98873fc5","ordinary_body_chars":35,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":3,"insertions":37,"deletions":0,"changed_paths":[".github/workflows/ci.yml",".gitignore","CONTRIBUTING.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-e05f3639fb4909ba","repository_id":"gitseed","source_commit_sha":"db0795c86d3a62a7c270b172c1ea692fde877b74","decision_audit_anchor":"e05f3639fb4909ba7458ad926f59a334c6c0b71f0e1f0d1bcf5846033df494e7","ordinary_source":"PRD-F1: close out the persistence and RateLimitExhausted gap\n","ordinary_source_sha256":"5ec8046994808b1cc8f491783b4d1f485add9425778c8e732a11ff5fe8e23c4e","ordinary_body_chars":61,"ordinary_body_survives":false,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":1,"insertions":16,"deletions":0,"changed_paths":["docs/prd/PRD-F1-collect.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-e25462e19110c9eb","repository_id":"gitseed","source_commit_sha":"424128841c307cfde29914d07f08947ffe5e8f32","decision_audit_anchor":"e25462e19110c9ebca40a4c375930e4c0ad9b7de9867138236608732fd24696f","ordinary_source":"Classify metadata rate limits\n\nMetadata endpoint failures now use the existing response classifier, so quota-exhausted responses are reported as rate limited while authorization failures remain forbidden. The metadata path now marks PipelineResult.rate_limited, preserving the operator remedy through the CLI.\n","ordinary_source_sha256":"f046c9595d7b7defb442532a92d6f48c68261bf042a6aab7ee55e4f45c15d65b","ordinary_body_chars":310,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":4,"insertions":141,"deletions":9,"changed_paths":["gitseed/adapters.py","gitseed/pipeline/run.py","tests/test_adapters.py","tests/test_cli.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-e5a87ee0d8e99a1e","repository_id":"gitseed","source_commit_sha":"69e08ef33ecfcddce1cd5bf8df7613170909b2e7","decision_audit_anchor":"e5a87ee0d8e99a1ee1e9f01d07595f084ea40bcaeb7921935a0e74c35c63c0d1","ordinary_source":"T-212: a README built from what this repository can prove\n\nThe old README was a feature list. This one leads with the only genuinely unusual\nthing here — that approval is a required argument rather than a check:\n\n def star(client: GitHubWriter, repo: str, approval: Approval) -> Performed:\n\n`if approved:` can be deleted by a careless refactor; a required parameter cannot,\nand `Approval` is only constructed by a function that read a keystroke from a\nterminal. GitHub's AUP forbids automating stars and follows, so the line between a\nUI and a violation belongs in the type system, not in a branch.\n\nEvery claim is traceable to a command. Python versions from `ci.yml`, the pipeline\norder from the ticket index, model resolution read out of `cli.py`, the two\nunfinished items from the Backlog issues themselves. The badges are CI, license and\nPython versions — three things whose value can be checked right now.\n\nTwo sentences exist because leaving them out would have been the easy lie. \"No\nlive star or follow has been performed by this code.\" And a section naming what\ndoes not work yet: the review queue has never completed a live cycle because\napproval needs a TTY (#5), and the forbidden-resource 403 branch has only ever\nseen injected responses (#6).\n","ordinary_source_sha256":"99921471988726a7d23c948cdf68ab4de45547e845c0b5b20dfaae5241bf75c2","ordinary_body_chars":1261,"ordinary_body_survives":true,"removed_trailer_count":12,"residual_record_lines_removed":0,"files_changed":2,"insertions":84,"deletions":26,"changed_paths":["README.md","assets/readme/hero.svg"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-e60230e53cceff5a","repository_id":"gitseed","source_commit_sha":"c0fb66f49fe66e76c0949015616d071869b889de","decision_audit_anchor":"e60230e53cceff5ac616228a46fc5f7bbfa441a17d4d5536bb9584ab43c1903b","ordinary_source":"F4: commit review decisions instead of only printing the trailer block\n","ordinary_source_sha256":"e095fb968ad0b2e89290f0b68694ebb79538d47307018c9b13afcfc06113d61c","ordinary_body_chars":71,"ordinary_body_survives":false,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":5,"insertions":485,"deletions":20,"changed_paths":["gitseed/cli.py","gitseed/review/commit.py","gitseed/review/trailers.py","tests/test_review_commit.py","tests/test_review_cycle.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-e82c306ec9e425b2","repository_id":"gitseed","source_commit_sha":"c7e608c77ed14e85eb2045566111f9f7c9aee84d","decision_audit_anchor":"e82c306ec9e425b2c3d526053138bc08f129e5eda2af8c2d3e10f7cc60b578d3","ordinary_source":"Rename to gitseed, and record why the first name was wrong\n\nADR-0001 chose `gradelore` on three grounds and two of them do not hold.\n\n\"It matches CommitLore's pattern, so they form a family\" is a branding\nconvenience, not a claim about this product. In CommitLore the `lore` has a\nreferent — the accumulated decision knowledge attached to commits, which is the\nproduct. In `gradelore` the `lore` would be the scores, and 8/10 is a number,\nnot something handed down. The shape was borrowed without the meaning.\n\n\"It says what it does\" is half right after the pivot. ADR-0001 itself dropped\nthe automated social actions, so the pipeline is collect, deterministic security\nscreen, contract-verified model grading, human review queue. Grading is one step\nin the middle and the one we trust least — it sits behind a startup smoke test.\nNaming the product after it points at the wrong centre of gravity.\n\nThe owner chose `gitseed`. Availability was measured rather than assumed, which\nis what CommitLore's ADR-0009 procedure exists for: PyPI is free, which is the\nregistry this would publish to. GitHub org `gitseed` is taken by a Rust CI\nsystem at one star, and npm `gitseed` is a v0.0.0 stub abandoned in 2022 —\nneither is the case that killed `gitlore` for CommitLore, which was an active\nsame-domain package on the target registry.\n\nUnverified: whether the `seed` reading actually confuses anyone — that is a README problem and nobody has read the README yet\n","ordinary_source_sha256":"14e1a86d32ec987e18e319a4651fac5c403f6e2193bc8b63f9be05507ae2f16c","ordinary_body_chars":1457,"ordinary_body_survives":true,"removed_trailer_count":16,"residual_record_lines_removed":0,"files_changed":1,"insertions":64,"deletions":0,"changed_paths":["docs/adr/ADR-0004-name-gitseed.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-ea459217291aa8a3","repository_id":"gitseed","source_commit_sha":"02d96b985945a67048432b1cb1a1dea1077a74d9","decision_audit_anchor":"ea459217291aa8a3e5ac0d5856138457bbc97fc3758c3a4c4bd97d0ac7e4ad06","ordinary_source":"Fix live file selection so manifests reach the scanner and partial scans cannot read as clean\n\npackage.json and every other manifest, lockfile, and workflow file never\nreached the live security scanner: SOURCE_EXTENSIONS in gitseed/cli.py has no\n.json entry, so the postinstall rule in screen/signals.py was implemented and\nunit-tested against a fixture directory that bypasses GitHubClient.fetch_files()\nentirely, and the gap never showed up in tests (#45, GS-P0-001). Separately,\nfiles dropped by the 20-file/500KB/extension caps never affected\nseverity_of()'s output, so a 20-of-200 scan that found nothing in the 20\nreported the same \"none\" a fully-scanned clean repository would (#48,\nGS-P0-008) -- an attacker who fills the tree's first 20 entries with clean\nfiles hides everything after them, with no signal that this happened.\n\n- GitHubClient.fetch_files() now separates a priority-filename allow-list\n (manifests, lockfiles, Dockerfile, Makefile, .github/workflows/*.yml|yaml)\n from the extension allow-list, and selects priority matches before the\n 20-file count cap is applied at all -- not merely early within it -- so a\n manifest's tree position cannot push it out of the scan.\n- New SourceCoverage/SkippedFile types (gitseed/screen/coverage.py) record\n discovered/eligible/scanned file counts and separate policy-skips from\n error-skips, with complete_for_policy and complete_for_repository as two\n distinct, computed claims -- deliberately not the same question.\n- screen/verdict.risk_of() wraps severity_of() and reports\n \"none-found-in-scanned-files\" instead of a bare \"none\" when coverage says\n the scan was cut short. severity_of() itself is untouched and keeps its\n three-state discipline (T-202, ADR-0010).\n- FetchedFiles, Reviewed, and the run artifact schema all carry coverage\n through to CLI radar/explain output, so a partial scan is never rendered\n as a clean one anywhere a user reads it.\n\nFixes #45\nFixes #48\n","ordinary_source_sha256":"62e7f1f05cd6d0e0e085e005731e85319b45be49b804bf4d8a0e716c0a1bbe06","ordinary_body_chars":1950,"ordinary_body_survives":true,"removed_trailer_count":28,"residual_record_lines_removed":0,"files_changed":8,"insertions":537,"deletions":22,"changed_paths":["gitseed/artifact.py","gitseed/cli.py","gitseed/pipeline/run.py","gitseed/screen/coverage.py","gitseed/screen/verdict.py","tests/test_cli.py","tests/test_coverage.py","tests/test_signals.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-ed4039b8a411ee62","repository_id":"gitseed","source_commit_sha":"5ae484abc3e54d3fff689c98986666c320d98e12","decision_audit_anchor":"ed4039b8a411ee62395d10d778a3b62b4f8510a0edb64a5e765100ef5430cb81","ordinary_source":"Reproduce the M0 backtest with fixtures\n","ordinary_source_sha256":"fe3f06a1dca176c21c072f642148f7c110023bc81fd27dbf57304a3eb0ccf978","ordinary_body_chars":40,"ordinary_body_survives":false,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":8,"insertions":31581,"deletions":0,"changed_paths":["docs/M0-VERDICT.md","gitseed/m0.py","scripts/m0_analyze.py","scripts/m0_collect.py","tests/fixtures/m0/analysis.json","tests/fixtures/m0/samples.json","tests/fixtures/m0/search-responses.json","tests/test_m0.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-ed878960135ff45a","repository_id":"gitseed","source_commit_sha":"3c7f566053805c56aa946e1035de217b4b64d71b","decision_audit_anchor":"ed878960135ff45a538992a4f04bd2afecd8d77c6a9aa20e8817511c9406a7bc","ordinary_source":"T-11: replay stored artifacts offline\n","ordinary_source_sha256":"56f49ff530a70fefe0abb23cf6f72a0fd10ecad469dba98c3eec13be32f434b0","ordinary_body_chars":38,"ordinary_body_survives":false,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":36,"deletions":2,"changed_paths":["gitseed/storage.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-f3c960a48273132c","repository_id":"gitseed","source_commit_sha":"fe69ce9d153a1f198252e945b6656679b8930f05","decision_audit_anchor":"f3c960a48273132ce1ebd32695e43e87ffbc856109223ff1805d147134be60da","ordinary_source":"Name the core run ports\n","ordinary_source_sha256":"efc4d53f33b00881bc07bd6372e046346ff05a1ada0564f8b3116e9369a62b64","ordinary_body_chars":24,"ordinary_body_survives":false,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":1,"insertions":48,"deletions":0,"changed_paths":["gitseed/ports.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-f4404e6e27e534e5","repository_id":"gitseed","source_commit_sha":"c8ce4385e6222dae3f30847a83037ea7e9919b1f","decision_audit_anchor":"f4404e6e27e534e5605fd301635d0fdea69e2cded91b6d4ed04cbe643da0fd0b","ordinary_source":"T-204: wire the stages, and make an unfinished run impossible to mistake for a thin one\n\nThe stages were each honest alone. The seam is where that stops being true: a\nrate limit shortens the candidate list, a screening error shortens it, a model\nthat refuses shortens it — and every one of those looks exactly like \"not many\ngood repositories today\". The second is a finding; the first three are bugs, and\na reviewer approving against them is approving against a picture that was never\nreal.\n\n`PipelineResult.complete` is therefore never inferred from a non-empty list. One\nunreachable repository is recorded against that repository and does not end the\nrun, because nine that were fine are not worth discarding for one 404.\n\nScreening decides before a model is asked. A candidate scanning at `high`\nseverity never reaches the grader — spending tokens to re-decide it is the small\ncost, and the real one is that an enthusiastic grade becomes an argument to\noverride a security signal.\n\nThe grader is not told how popular a repository is. Stars and push dates are\nwithheld from the digest: a grader told a repository has 40k stars has been told\nthe answer, and the point of grading is a judgement that does not already know it.\n","ordinary_source_sha256":"7f27e85f693b4295400889c47773e12efbfb8b683f68052b416ae47b3a21cd0a","ordinary_body_chars":1227,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":3,"insertions":414,"deletions":0,"changed_paths":["gitseed/pipeline/__init__.py","gitseed/pipeline/run.py","tests/test_pipeline.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-f65ddc0c062c4a33","repository_id":"gitseed","source_commit_sha":"a858674ffa10a91b9ef9f4cc5542fafd6370a4c4","decision_audit_anchor":"f65ddc0c062c4a33999417036a94961d119515787808dae2cd87404d199f7698","ordinary_source":"Record repository star observations (#65)\n","ordinary_source_sha256":"73f22ac50234c065dc2cd2f7d520f058235c32039e52b7639a21cb770197605c","ordinary_body_chars":42,"ordinary_body_survives":false,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":6,"insertions":232,"deletions":14,"changed_paths":["gitseed/cli.py","gitseed/storage.py","gitseed/storage_schema.py","tests/test_cli.py","tests/test_review_cycle.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-f75d4b634c14b66c","repository_id":"gitseed","source_commit_sha":"c8ce4385e6222dae3f30847a83037ea7e9919b1f","decision_audit_anchor":"f75d4b634c14b66c31941dca910dd49db71829d285d08261945e29823364352c","ordinary_source":"T-204: wire the stages, and make an unfinished run impossible to mistake for a thin one\n\nThe stages were each honest alone. The seam is where that stops being true: a\nrate limit shortens the candidate list, a screening error shortens it, a model\nthat refuses shortens it — and every one of those looks exactly like \"not many\ngood repositories today\". The second is a finding; the first three are bugs, and\na reviewer approving against them is approving against a picture that was never\nreal.\n\n`PipelineResult.complete` is therefore never inferred from a non-empty list. One\nunreachable repository is recorded against that repository and does not end the\nrun, because nine that were fine are not worth discarding for one 404.\n\nScreening decides before a model is asked. A candidate scanning at `high`\nseverity never reaches the grader — spending tokens to re-decide it is the small\ncost, and the real one is that an enthusiastic grade becomes an argument to\noverride a security signal.\n\nThe grader is not told how popular a repository is. Stars and push dates are\nwithheld from the digest: a grader told a repository has 40k stars has been told\nthe answer, and the point of grading is a judgement that does not already know it.\n","ordinary_source_sha256":"7f27e85f693b4295400889c47773e12efbfb8b683f68052b416ae47b3a21cd0a","ordinary_body_chars":1227,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":3,"insertions":414,"deletions":0,"changed_paths":["gitseed/pipeline/__init__.py","gitseed/pipeline/run.py","tests/test_pipeline.py"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-f901052615fa3aee","repository_id":"gitseed","source_commit_sha":"d2a3431840b234959bddf008ad8bbfdc2fb0da95","decision_audit_anchor":"f901052615fa3aeebaf8e88125df7752265befe73484d76d00d633ae5073946c","ordinary_source":"T-11: persist immutable SQLite run artifacts\n","ordinary_source_sha256":"00efc969af9ac0ff30cbc93d48c87d946d790b372ce13bd486e06dd26654972b","ordinary_body_chars":45,"ordinary_body_survives":false,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":140,"deletions":0,"changed_paths":["gitseed/storage.py","tests/test_storage.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-002ffd1e428c572a","repository_id":"agent-operator-score","source_commit_sha":"27a027adf42115f097ae82fd18901e25a62df539","decision_audit_anchor":"002ffd1e428c572aa96f1ecc2616c00fb7e90580c334db9e064dd0b824c95607","ordinary_source":"feat: define adapter capability schema and complete event matrix\n\nEncodes the SSOT adapter event matrix as frozen data in specs/adapter-capabilities.v0.json\nand adds packages/schema/src/capability.ts, which derives every classification from the\nmatrix's own frozen prose rather than reading a declared column.\n\nFourteen event groups across two runtimes, twenty-eight cells, exhaustive in both\ndirections: a missing cell, an extra cell, a missing row, or a source-less capture fails\nclosed rather than defaulting. Statuses, requirement scope, condition metrics, missing\neffects, affected metrics, per-cell status and runtime constraint, and each runtime's\nsupported and known-missing event groups are all recomputed and compared. Every frozen\ntext column is pinned verbatim, so a document cannot make a derivation agree by rewriting\nthe prose that derivation reads.\n\nThe conditional row is the one that matters most. The SSOT marks human active time\nREQUIRED only for M18 and M20, and it is refused entry to the unconditional required set\nby three independent routes. The derived unconditional set is exactly the seven groups\nthe issuance contract already gates on.\n\nThe census assertion returns to matching the shape rather than the literal path list.\nRestoring the literal list in the previous ticket was my error: I accepted a review\nfinding that the relaxed form \"lost detection\" without checking that a stronger guard\nalready covered it. Deleting both of a ticket's owned files is caught by the focused-lane\ncount guard, verified here by deleting them and observing \"focused lane metric-registry\nran 2 tests and not at least 13\". Pinning the path list only reintroduced a per-ticket\nedit that every remaining product ticket would have to make.\n\nX-Ticket: E0B-001\n","ordinary_source_sha256":"9d4d3a6175ac74cf044fff7b58764f438b71e845c6f1b1a524c494f7c59c62b9","ordinary_body_chars":1767,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":6,"insertions":2133,"deletions":3,"changed_paths":["docs/tickets/E0-B/E0B-001-define-adapter-capability-schema-and-complete-event-matrix.md","packages/schema/src/capability.ts","packages/schema/test/capability.test.ts","specs/adapter-capabilities.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-00b9b5b83c4ddf87","repository_id":"agent-operator-score","source_commit_sha":"0477234662c2aa396c2b638b969c6e656d0202eb","decision_audit_anchor":"00b9b5b83c4ddf87a447269754915b4c73091185e15a5c0dcd4a4cd0dd00dc18","ordinary_source":"fix: read a RED file declaration that ends in a period\n\nThe pattern that extracts a ticket's RED file stopped at the closing\nbacktick and allowed only whitespace after it. Six of the sixty-eight\ntickets end that line with a period, as ordinary prose does, so their RED\nfile was never counted as ticket-owned and the validator would refuse it as\nunallowlisted the moment it was staged.\n\nD0-011 hit this first. The alternative was to strike the period from six\ntickets, which trades a pattern too strict for its own corpus for six edits\nthat invite the same defect the next time someone writes a sentence.\n\nAll sixty-eight declarations now extract. The owned census is unchanged,\nbecause those six RED files do not exist yet.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"637d6baa13d241a5864175daab9825af53af14dad30152bd3be075d2c7744a9a","ordinary_body_chars":742,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":1,"insertions":3,"deletions":1,"changed_paths":["scripts/validate-planning.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-04c1de5e41d66868","repository_id":"agent-operator-score","source_commit_sha":"c1d8b6630e66a9dc6033567d7f7d3704e5c7ca22","decision_audit_anchor":"04c1de5e41d66868e888fdae1d908dbf919f82ef6e1a91380c46c082d33ff4c2","ordinary_source":"feat: specify capability doctor output and verdict fixtures\n\nDerives the doctor verdict, exit code, ordered reasons and every projection line from\nthe capability matrix rather than reading them off the report under test. The declared\nverdict is never trusted, and the matrix the verdict is derived from is itself\nrevalidated on every call, so the pin is not fed by a free input.\n\nThe blocking rule is derived, not membership of a list: an UNAVAILABLE group blocks the\nscore exactly when its absence effects lack NOT_OBSERVED. The blocked fixture proves the\ndistinction by blocking on a group that is not one of the seven required ones.\n\nFixtures live where the ticket says they live. Putting them in the frozen document would\nhave matched all three siblings and passed every gate, but the ticket grants\nfixtures/doctor/*.json and a ticket outranks a convention. The split turned out better\nthan compliance: the document fell from 2159 to 240 lines and now carries rules and a\nthree-field manifest, while each fixture is exactly what the command prints. Nothing is\nduplicated, so nothing can drift silently -- a declared report with no file, a file no\nreport declares, a rename, content drift, and a manifest row naming the wrong matrix\nvariant each fail a named case.\n\nAdmission of fixture directories is now derived from the tickets instead of hardcoded.\nfixtures/operational-state was the only admitted directory and a second one would have\nmeant a second branch; a ticket that declares a fixture glob now admits it, and one that\nstops declaring it stops admitting it. Both directions are asserted.\n\nX-Ticket: E0B-003\n","ordinary_source_sha256":"39975b1bd887d212f0c5ece5a625163ac64ff973e444c500a6a6ebdc191b83fb","ordinary_body_chars":1620,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":11,"insertions":4520,"deletions":8,"changed_paths":["fixtures/doctor/blocked-and-imported.json","fixtures/doctor/blocked.json","fixtures/doctor/complete.json","fixtures/doctor/degraded.json","fixtures/doctor/imported-and-degraded.json","fixtures/doctor/imported-only.json","packages/schema/src/doctor-contract.ts","packages/schema/test/doctor-contract.test.ts","specs/doctor-output.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-09c4183e165a4da4","repository_id":"agent-operator-score","source_commit_sha":"40ed33efa0b693a9fbc683837b653fc26c5157bd","decision_audit_anchor":"09c4183e165a4da4f9eaf6d50dcd079824ce5d46e85d2541ee64c474d9272b6f","ordinary_source":"fix: freeze every cell's source class and restore the literal census\n\nAn adversarial review returned DO-NOT-SHIP. Two findings were real defects and both are\nfixed here; two more are real limits and are recorded rather than papered over.\n\nThe census must be pinned literally. I had reverted it to a wildcard after verifying that\ndeleting a ticket's owned files is caught by the focused-lane count guard. That test only\ncovered deletion. The review covered growth: a rogue product file plus a one-line\nownership edit passed the whole suite under the wildcard, where the literal census fails\nfour tests. Reproduced both directions before and after. This is the second time I moved\nthis line and the first time either direction was actually measured; the per-ticket edit\nis the honest price of catching unreviewed product code.\n\nThe focused-lane counts were a floor with two cases of slack, which was enough to delete\ntwo whole test cases and then neuter all five dead-field allowlists with the suite still\ngreen. They are now exact.\n\nEvery cell's source class is frozen. Only the DERIVED to RUNNER_DERIVED biconditional is\nderivable from the contract column, so PRIMARY versus SECONDARY was left free for 24 of\n28 cells, and runtime_constraint is computed from that free value. A cell reading the\nCodex app-server surface could relabel itself SECONDARY and silently drop\nprotocol_or_schema_version from its invalidation set, so an app-server schema bump would\nno longer invalidate the capability. The pin was worthless while its only input was not.\n\nX-Ticket: E0B-001\n","ordinary_source_sha256":"af8279199c65b129787e8fab66ed6dac29c0f4a9fd919017ef35b3a30eb59e4b","ordinary_body_chars":1566,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":4,"insertions":74,"deletions":6,"changed_paths":["packages/schema/src/capability.ts","packages/schema/test/capability.test.ts","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-0bc581744204a282","repository_id":"agent-operator-score","source_commit_sha":"3a3d47e632dbe45272adab9b2c0eb00b03d32de2","decision_audit_anchor":"0bc581744204a2824cab75a9b5955919310399ef0f89e3eebb20384a91433fbb","ordinary_source":"feat: define controlled and imported session classification\n\nClassifies a session as controlled-verified or imported-diagnostic from its trace\ncontent, deriving every verdict field rather than reading a declared one. A record\ncannot declare its own classification, eligibility or label; all three are recomputed\nand a declared counterpart is refused.\n\nThe event contract is the SSOT 9.5 common field set, all thirteen fields, mandatory on\nevery event. The bracket must span a positive duration, the capability snapshot must\nstrictly precede every non-bracket event, the identity triple must be complete and its\nderived key injective, and every unconditionally REQUIRED event group from the sibling\ncapability matrix must be observed. Array order is irrelevant.\n\nThis is a claim schema, not a proof of observation, and the module says so where a\nreader cannot miss it. Nothing inside a trace distinguishes an event the wrapper emitted\nfrom an event a script wrote afterwards and labelled that way, so a party able to author\na trace can author a record this contract calls CONTROLLED_VERIFIED. That is a\ndemonstrated fact, carried as a named passing test that performs the promotion and\nasserts it succeeds, not a hypothesis left for someone else to find.\n\nAn earlier attempt closed that gap with an Ed25519 attestation and was reverted. The\nSSOT has no signature, attestation or key-management clause anywhere, so it was invented\narchitecture in a contract-freezing ticket; worse, the canonical sessions were signed\nover their full content by a key whose private half was not kept, which would have made\nthem unamendable by any future ticket. A trust root with no owner and no rotation reads\nas proof while resting on a keypair nobody holds. The real design is escalated for an\nADR instead.\n\nX-Ticket: E0B-002\n","ordinary_source_sha256":"15d9bf61a7cf1a38850a82530a1954fa1751713943d3cd0de088b6d4f54d27b5","ordinary_body_chars":1809,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":6,"insertions":5424,"deletions":4,"changed_paths":["docs/tickets/E0-B/E0B-002-define-controlled-and-imported-session-classification.md","packages/schema/src/session-class.ts","packages/schema/test/session-class.test.ts","specs/session-class.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-0f8cd38c8ba43cfe","repository_id":"agent-operator-score","source_commit_sha":"ce973e655c862503966f69e4acafa6e377e3a544","decision_audit_anchor":"0f8cd38c8ba43cfe926aa508f1e099400f5b28a4e730900de0feaeb8dcf4c026","ordinary_source":"fix: give the fact collection a budget that survives backlog growth\n\nThe completion-effect check added one commit fetch per completion receipt and one\nrecursive tree listing, and a full collection then measured 89.5s against a 90s ceiling.\nThe resolver failed closed with EXTERNAL_STATE_UNAVAILABLE, which was the correct\nbehaviour and also made it unusable: readySet=none on a repository whose state was fine.\n\nThe ceiling was not really breached by the new calls. Collection cost scales with the\nnumber of merged Ticket-linked pull requests -- one authoritative fetch per search hit\n-- so ordinary backlog growth was going to reach 90s regardless; the new calls only\narrived first. The budget is now 300s, which covers roughly double the current receipt\ncount, and the reasoning is recorded beside the constant rather than left as a bare\nnumber.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"7682a6816bd1aaeebcbf2e7b4873fbd73a10d5e4337adf2eb69b7f28033d8067","ordinary_body_chars":866,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":1,"insertions":8,"deletions":1,"changed_paths":["scripts/resolve-execution-state.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-12b0486cd77dd3a9","repository_id":"agent-operator-score","source_commit_sha":"1fdd0c88b37ec3adaafa6c28251092b782c3d589","decision_audit_anchor":"12b0486cd77dd3a90143f1514a2aab77e7f5bf5b3e28f7a81cc4887f51480dcf","ordinary_source":"fix: derive every issuance verdict instead of trusting the document\n\nEncodes all ten SSOT 6.1 issuance gates as frozen data in specs/issuance.v0.json and adds\npackages/schema/src/issuance-contract.ts, which derives each candidate's verdict from its\nown observations instead of believing the verdict the document declares.\n\nCoverage alone never issues a score. Fourteen eligible metrics and 70% evidence coverage\nare necessary but not sufficient: a document claiming a coverage-only candidate is\nissuable is rejected and names the exact gate it lied about.\n\nNOT_OBSERVED is never a zero. It leaves the eligibility denominator rather than entering\nit as a failure, so missing adapter data is reported as missing evidence and never as\noperator failure. INVALID is excluded the same way but stays distinguishable from it.\n\nAn adversarial review returned DO-NOT-SHIP on the first attempt and every serious finding\nwas real. The declared-verdict comparison was bypassable: padding expected.failed_gates\nwith one unknown or duplicated entry disabled the only check comparing declared against\nderived issuability, so a document could declare a NOT_OBSERVED candidate issuable, which\nis precisely what this ticket exists to prevent. A negative coverage denominator passed\nthe 70% gate because cross-multiplication was never sign-normalised. metric_id was\nunconstrained, so the fourteen-metric minimum could be forged with invented metrics. Two\ngates read caller-declared fields instead of the evidence: factor opportunities came from\na declared list, and the safety opportunity from a declared boolean. The four prose fields\nwere presence-checked only, so the frozen document was non-binding.\n\nAll of those are now derived or pinned, and twenty-four mutations of the validator each\nfail at least one test. An S2 or S3 safety verdict now withholds issuance, which SSOT 6.3\nrequires and the first attempt did not implement.\n\nX-Ticket: E0A-002\n","ordinary_source_sha256":"03366980a1e288cda301fbc478acb6066f4c3f5ffb150d248a01ba3cf04544bd","ordinary_body_chars":1932,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":6,"insertions":505,"deletions":277,"changed_paths":["docs/tickets/E0-A/E0A-002-freeze-eligibility-and-score-issuance-predicate.md","packages/schema/src/issuance-contract.ts","packages/schema/test/issuance-contract.test.ts","specs/issuance.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-14a911a7f4c96afb","repository_id":"agent-operator-score","source_commit_sha":"6dcf1f0639ba113c23140e86e07e6b3b36ce18a0","decision_audit_anchor":"14a911a7f4c96afb1c2acee01b976e5f87644c3fe96670be670dc2578f765774","ordinary_source":"fix: close six mutation survivors an independent sweep found\n\nThe lane reported 603 mutants with one survivor. An independent sweep run by a different\nmodel found 542 mutants and six survivors, all real coverage gaps, with its four controls\nbehaving correctly. That is the third self-reported sweep in this repository to be wrong,\nso the figures below are the independent measurement, not the lane's.\n\nTwo of the six were the serious ones: deleting either return guard in the canonical\nfixture loop turned a fail-closed path into an uncaught TypeError. A bounded audit of 780\nmalformed inputs now confirms every call returns a result and none throws.\n\nThe source-class inventory guard did not work. It asserted only that the frozen sibling\nmatrix currently contains all three classes; it never called the inventory with a subset,\nso both filter mutations still returned all three and survived. It is replaced, not\nsupplemented, by a case that exercises a PRIMARY-only inventory directly. I had accepted\nthe original guard as adequate on its description rather than testing it.\n\nAlso closed: empty-string preservation under the nullish coalescing on derivation_proof,\nwhich a sibling contract was masking, and the early exit on an invalid assessment mode.\n\nIndependent re-measurement after the fixes: 542 mutants, 542 killed, 0 survived, 0 invalid,\n0 aborted; both must-die controls died and both must-survive controls survived.\n\nX-Ticket: E0B-003\n","ordinary_source_sha256":"1899085526f34e9949a42de705c7ef1f52bc7d68db508ec7becd18258467d973","ordinary_body_chars":1447,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":2,"insertions":107,"deletions":41,"changed_paths":["packages/schema/test/doctor-contract.test.ts","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-163c7d58d0692423","repository_id":"agent-operator-score","source_commit_sha":"064f7ab26e4596f2ffbed398a2b45962dab8bcbf","decision_audit_anchor":"163c7d58d06924234dd49cb3de5f0245a52896d54619f758a9bde95838f2cbfc","ordinary_source":"feat: implement the deterministic pack budget and eligibility simulator\n\nImplement the two symbols E0C-002 owns. auditOpportunities walks the\npreregistered scenarios, refuses a repeated opportunity id as DOUBLE_COUNT,\nrefuses a secondary observation with no primary as SECONDARY_UNOBSERVED, and\nreturns the sorted set of metrics that actually carry a primary observation.\nsimulatePackBudget consumes that audit and answers timing and eligibility in\none verdict, so a pack cannot pass on time while failing to observe what the\nissuance contract requires.\n\nTiming is seeded. A mulberry32 stream driven by the assumptions' own integer\nseed draws one triangular sample per family per trial over 1000 trials, and\nthe raw rows are returned rather than summarised away. p90 is the empirical\n90th percentile of those rows, because the sum of triangulars has no closed\nform there.\n\nThe median is taken analytically, as the sum of the per-family medians, and\nthe two are deliberately not the same route. Every preregistered family is a\nsymmetric triangular, its mode is exactly the midpoint of its support, and a\nsum of independent symmetric variables is symmetric about the sum of its\ncentres; a continuous distribution symmetric about a point has its median at\nthat point. The analytic value is therefore exact at 40 minutes and carries no\nMonte Carlo error. The seeded p50 of the same rows lands at 40.0346, which is\n0.87 standard errors of a 1000-sample median above the true value and would\nread the 40-minute ceiling as breached on sampling noise alone. The exactness\nholds only while every family distribution stays symmetric, and that condition\nis stated at the derivation rather than left implicit.\n\ntransition_overhead is declared in specs/pack-simulation.v0.json and is\ndeliberately not added to the timing. The preregistered assumptions carry no\noverhead term and the family distributions are the only declared source of\nminutes; inventing one would be fabricated timing, which the ticket forbids.\n\nThe eligibility gates mirror specs/issuance.v0.json rather than reinventing\nit. FACTOR_COVERAGE binds F1-F4 at one scored metric each and\nFACTOR_OPPORTUNITY binds F1-F5 at two distinct opportunity ids each; the\nasymmetry is the contract's. REQUIRED_OUTCOME and REQUIRED_RECOVERY_VALUE make\nM15-M18 and M20 the scored core, while REQUIRED_SAFETY holds M19 as a separate\nterm, so the prescription path fails when the safety opportunity is absent\neven though the core is intact. The metric-to-factor table is mirrored in the\nsource because the simulator is handed the pack-simulation spec only, and\nreading a second spec from disk would make the function non-hermetic; any\ndrift from issuance.v0 is a defect in this file.\n\nThe verdict is reproducible from the input alone: the manifest digest is\nsha256 over a canonical, key-sorted encoding of the seed, both inputs, the\nderived statistics, the reason codes, and every raw row, and a second call on\nthe same input returns the same digest, median, p90 and rows.\n\nCensus pins move 37 to 40 for the two owned source files and the owned RED\nfile. Nothing the README claims present or pinned-absent moves: the pinned\nstatus line, the planned-CLI line, the ticket census, and the pinned absence\nof packages/cli and apps/cli are all unchanged, and no test pins the absence\nof packages/scorer/src/simulation.\n\nX-Ticket: E0C-002\n","ordinary_source_sha256":"0bf2f06ad99a047039d4de88b7c26d5e27d4373635a0c637a854196ab67fd973","ordinary_body_chars":3368,"ordinary_body_survives":true,"removed_trailer_count":4,"residual_record_lines_removed":0,"files_changed":1,"insertions":2,"deletions":2,"changed_paths":["tests/planning-contract.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-1a5dea10137de7da","repository_id":"agent-operator-score","source_commit_sha":"6a56f76ea36e32d99f24e84295517dfdd3ecfb23","decision_audit_anchor":"1a5dea10137de7dabf178f67996eaea489ecfe4297e8eb5c675b298085bcf444","ordinary_source":"fix: drop Node 20, which silently skipped every TypeScript test\n\nCI on the previous head was partly vacuous. Node 20 reported 199 passing tests where\nNode 24 reported 212: its test runner does not discover a .ts test file at all, so the\nthirteen metric-registry cases never ran there and their absence looked like success.\nThe focused-lane guard added in the previous commit is what surfaced this, on its first\nrun against real CI.\n\nUnflagged TypeScript type stripping starts at Node 22.18.0, so that is the floor\nADR-0003's strict TypeScript mandate actually requires. The CI matrix drops to 22 and\n24, and engine-matrix now also asserts that 20 is absent rather than only matching the\nnew list.\n\nThe selectivity proof moved into a temporary copy of the repository. Writing its\nintruder file into the live tree raced with the fixture tests that copy this repository\nwhile it was present, failing three unrelated cases. The copy also skips the transient\nfixtures sibling tests write into the root for the same reason.\n\nX-Ticket: E0A-001\n","ordinary_source_sha256":"71dc57304730d046b85c721224bd0ef869ee68a85914e66d5029696bcfea6991","ordinary_body_chars":1037,"ordinary_body_survives":true,"removed_trailer_count":12,"residual_record_lines_removed":0,"files_changed":4,"insertions":41,"deletions":19,"changed_paths":[".github/workflows/ci.yml","docs/tickets/E0-A/E0A-001-freeze-m01-m20-metric-registry.md","package.json","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-1bc2a34840360fd0","repository_id":"agent-operator-score","source_commit_sha":"814c6e7cd19035cd1a70997c2a5ff74b39d5ef8d","decision_audit_anchor":"1bc2a34840360fd0cb9277ae74af622b7f07206fd55afcbb70f465627b03b0ca","ordinary_source":"feat: freeze eligibility and score-issuance predicate\n\nEncodes all ten SSOT 6.1 issuance gates as frozen data in specs/issuance.v0.json and\nadds packages/schema/src/issuance-contract.ts, which derives each candidate's verdict\nfrom its evidence instead of believing the verdict the document declares.\n\nCoverage alone never issues a score. Fourteen eligible metrics and 70% evidence\ncoverage are necessary but not sufficient: a document claiming a coverage-only\ncandidate is issuable is rejected and names the exact gate it lied about.\n\nNOT_OBSERVED is never a zero. It leaves the eligibility denominator rather than\nentering it as a failure, so missing adapter data is reported as missing evidence and\nnever as operator failure.\n\nThe census gate added by E0A-001 admitted both new product files with no census edit\nat all, which is what it was built for. Its output is no longer pinned literally,\nbecause the ticket-owned list grows with every product ticket; the list is instead\nbound to an independent re-derivation in the skeleton test, which fails if the two\nparses ever diverge.\n\nX-Ticket: E0A-002\n","ordinary_source_sha256":"5b99a47459d68b89f6a6977be15b47b99faab8e293c35f0c223de325fcaa65e2","ordinary_body_chars":1102,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":5,"insertions":854,"deletions":3,"changed_paths":["packages/schema/src/issuance-contract.ts","packages/schema/test/issuance-contract.test.ts","specs/issuance.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-23ba99c6da04e46f","repository_id":"agent-operator-score","source_commit_sha":"3a3d47e632dbe45272adab9b2c0eb00b03d32de2","decision_audit_anchor":"23ba99c6da04e46fbfb1ab40efa42c64744e62867b601b71b523adeb8f541471","ordinary_source":"feat: define controlled and imported session classification\n\nClassifies a session as controlled-verified or imported-diagnostic from its trace\ncontent, deriving every verdict field rather than reading a declared one. A record\ncannot declare its own classification, eligibility or label; all three are recomputed\nand a declared counterpart is refused.\n\nThe event contract is the SSOT 9.5 common field set, all thirteen fields, mandatory on\nevery event. The bracket must span a positive duration, the capability snapshot must\nstrictly precede every non-bracket event, the identity triple must be complete and its\nderived key injective, and every unconditionally REQUIRED event group from the sibling\ncapability matrix must be observed. Array order is irrelevant.\n\nThis is a claim schema, not a proof of observation, and the module says so where a\nreader cannot miss it. Nothing inside a trace distinguishes an event the wrapper emitted\nfrom an event a script wrote afterwards and labelled that way, so a party able to author\na trace can author a record this contract calls CONTROLLED_VERIFIED. That is a\ndemonstrated fact, carried as a named passing test that performs the promotion and\nasserts it succeeds, not a hypothesis left for someone else to find.\n\nAn earlier attempt closed that gap with an Ed25519 attestation and was reverted. The\nSSOT has no signature, attestation or key-management clause anywhere, so it was invented\narchitecture in a contract-freezing ticket; worse, the canonical sessions were signed\nover their full content by a key whose private half was not kept, which would have made\nthem unamendable by any future ticket. A trust root with no owner and no rotation reads\nas proof while resting on a keypair nobody holds. The real design is escalated for an\nADR instead.\n\nX-Ticket: E0B-002\n","ordinary_source_sha256":"15d9bf61a7cf1a38850a82530a1954fa1751713943d3cd0de088b6d4f54d27b5","ordinary_body_chars":1809,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":6,"insertions":5424,"deletions":4,"changed_paths":["docs/tickets/E0-B/E0B-002-define-controlled-and-imported-session-classification.md","packages/schema/src/session-class.ts","packages/schema/test/session-class.test.ts","specs/session-class.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-261cdc76929d85cc","repository_id":"agent-operator-score","source_commit_sha":"1fdd0c88b37ec3adaafa6c28251092b782c3d589","decision_audit_anchor":"261cdc76929d85cc03e3ef1cf8e9f731e10cea7fef0f5e706cd77a3fccccd003","ordinary_source":"fix: derive every issuance verdict instead of trusting the document\n\nEncodes all ten SSOT 6.1 issuance gates as frozen data in specs/issuance.v0.json and adds\npackages/schema/src/issuance-contract.ts, which derives each candidate's verdict from its\nown observations instead of believing the verdict the document declares.\n\nCoverage alone never issues a score. Fourteen eligible metrics and 70% evidence coverage\nare necessary but not sufficient: a document claiming a coverage-only candidate is\nissuable is rejected and names the exact gate it lied about.\n\nNOT_OBSERVED is never a zero. It leaves the eligibility denominator rather than entering\nit as a failure, so missing adapter data is reported as missing evidence and never as\noperator failure. INVALID is excluded the same way but stays distinguishable from it.\n\nAn adversarial review returned DO-NOT-SHIP on the first attempt and every serious finding\nwas real. The declared-verdict comparison was bypassable: padding expected.failed_gates\nwith one unknown or duplicated entry disabled the only check comparing declared against\nderived issuability, so a document could declare a NOT_OBSERVED candidate issuable, which\nis precisely what this ticket exists to prevent. A negative coverage denominator passed\nthe 70% gate because cross-multiplication was never sign-normalised. metric_id was\nunconstrained, so the fourteen-metric minimum could be forged with invented metrics. Two\ngates read caller-declared fields instead of the evidence: factor opportunities came from\na declared list, and the safety opportunity from a declared boolean. The four prose fields\nwere presence-checked only, so the frozen document was non-binding.\n\nAll of those are now derived or pinned, and twenty-four mutations of the validator each\nfail at least one test. An S2 or S3 safety verdict now withholds issuance, which SSOT 6.3\nrequires and the first attempt did not implement.\n\nX-Ticket: E0A-002\n","ordinary_source_sha256":"03366980a1e288cda301fbc478acb6066f4c3f5ffb150d248a01ba3cf04544bd","ordinary_body_chars":1932,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":6,"insertions":505,"deletions":277,"changed_paths":["docs/tickets/E0-A/E0A-002-freeze-eligibility-and-score-issuance-predicate.md","packages/schema/src/issuance-contract.ts","packages/schema/test/issuance-contract.test.ts","specs/issuance.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-2cadeedf7d7f2251","repository_id":"agent-operator-score","source_commit_sha":"27a027adf42115f097ae82fd18901e25a62df539","decision_audit_anchor":"2cadeedf7d7f22512439ba585a3ea75ae4698fd9db0c46474703c3e9224f5193","ordinary_source":"feat: define adapter capability schema and complete event matrix\n\nEncodes the SSOT adapter event matrix as frozen data in specs/adapter-capabilities.v0.json\nand adds packages/schema/src/capability.ts, which derives every classification from the\nmatrix's own frozen prose rather than reading a declared column.\n\nFourteen event groups across two runtimes, twenty-eight cells, exhaustive in both\ndirections: a missing cell, an extra cell, a missing row, or a source-less capture fails\nclosed rather than defaulting. Statuses, requirement scope, condition metrics, missing\neffects, affected metrics, per-cell status and runtime constraint, and each runtime's\nsupported and known-missing event groups are all recomputed and compared. Every frozen\ntext column is pinned verbatim, so a document cannot make a derivation agree by rewriting\nthe prose that derivation reads.\n\nThe conditional row is the one that matters most. The SSOT marks human active time\nREQUIRED only for M18 and M20, and it is refused entry to the unconditional required set\nby three independent routes. The derived unconditional set is exactly the seven groups\nthe issuance contract already gates on.\n\nThe census assertion returns to matching the shape rather than the literal path list.\nRestoring the literal list in the previous ticket was my error: I accepted a review\nfinding that the relaxed form \"lost detection\" without checking that a stronger guard\nalready covered it. Deleting both of a ticket's owned files is caught by the focused-lane\ncount guard, verified here by deleting them and observing \"focused lane metric-registry\nran 2 tests and not at least 13\". Pinning the path list only reintroduced a per-ticket\nedit that every remaining product ticket would have to make.\n\nX-Ticket: E0B-001\n","ordinary_source_sha256":"9d4d3a6175ac74cf044fff7b58764f438b71e845c6f1b1a524c494f7c59c62b9","ordinary_body_chars":1767,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":6,"insertions":2133,"deletions":3,"changed_paths":["docs/tickets/E0-B/E0B-001-define-adapter-capability-schema-and-complete-event-matrix.md","packages/schema/src/capability.ts","packages/schema/test/capability.test.ts","specs/adapter-capabilities.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-32281c33a0cd1d51","repository_id":"agent-operator-score","source_commit_sha":"3a3d47e632dbe45272adab9b2c0eb00b03d32de2","decision_audit_anchor":"32281c33a0cd1d516bbe368d6cd65d0a5dc826b8281369021d73d3460af26f64","ordinary_source":"feat: define controlled and imported session classification\n\nClassifies a session as controlled-verified or imported-diagnostic from its trace\ncontent, deriving every verdict field rather than reading a declared one. A record\ncannot declare its own classification, eligibility or label; all three are recomputed\nand a declared counterpart is refused.\n\nThe event contract is the SSOT 9.5 common field set, all thirteen fields, mandatory on\nevery event. The bracket must span a positive duration, the capability snapshot must\nstrictly precede every non-bracket event, the identity triple must be complete and its\nderived key injective, and every unconditionally REQUIRED event group from the sibling\ncapability matrix must be observed. Array order is irrelevant.\n\nThis is a claim schema, not a proof of observation, and the module says so where a\nreader cannot miss it. Nothing inside a trace distinguishes an event the wrapper emitted\nfrom an event a script wrote afterwards and labelled that way, so a party able to author\na trace can author a record this contract calls CONTROLLED_VERIFIED. That is a\ndemonstrated fact, carried as a named passing test that performs the promotion and\nasserts it succeeds, not a hypothesis left for someone else to find.\n\nAn earlier attempt closed that gap with an Ed25519 attestation and was reverted. The\nSSOT has no signature, attestation or key-management clause anywhere, so it was invented\narchitecture in a contract-freezing ticket; worse, the canonical sessions were signed\nover their full content by a key whose private half was not kept, which would have made\nthem unamendable by any future ticket. A trust root with no owner and no rotation reads\nas proof while resting on a keypair nobody holds. The real design is escalated for an\nADR instead.\n\nX-Ticket: E0B-002\n","ordinary_source_sha256":"15d9bf61a7cf1a38850a82530a1954fa1751713943d3cd0de088b6d4f54d27b5","ordinary_body_chars":1809,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":6,"insertions":5424,"deletions":4,"changed_paths":["docs/tickets/E0-B/E0B-002-define-controlled-and-imported-session-classification.md","packages/schema/src/session-class.ts","packages/schema/test/session-class.test.ts","specs/session-class.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-34aef026d81c2f6b","repository_id":"agent-operator-score","source_commit_sha":"f9a62917a0964ba95e23e8a89b868caae28db356","decision_audit_anchor":"34aef026d81c2f6bec36561f17c344f419dda3fdeb697dd7a1ea247c90fd1d71","ordinary_source":"feat: render execution views and add the operational-state workflow\n\nD0-004C. Projections become rendered outputs and stop being possible inputs.\n\nscripts/render-execution-views.mjs renders the Board and a JSON view from the\ncanonical static catalog only. resolveViewInputs omits the roadmap, the Board\nand the historical ledger by construction rather than filtering them later, so\na stale or hand-edited document cannot become authority over live repository\nstate. Rendering is deterministic: no timestamp, no current SHA, no unordered\niteration, so drift between a projection and the resolver is a defect rather\nthan noise.\n\n.github/workflows/operational-state.yml runs offline strict on pull requests\nand online strict on dev pushes. Resolution jobs hold exactly contents,\nactions, checks, pull-requests and issues read. The dispatch lane replaces\nchecks:read with checks:write and nothing else, runs only from refs/heads/dev,\nand verifies the trusted workflow blob OID, a maintain-or-admin dispatch actor,\nand the candidate SHA before emitting a named check. Every job carries a\nbounded timeout. No job performs a write-token action.\n\nFourteen named RED cases were captured failing first, each for its own reason:\nthe four the ticket fixes at line 149, plus ten covering the workflow surface.\n\nCoordinated amendment inside D0-004A-owned files, bounded to the census only:\ntwo allowlist entries in scripts/validate-planning.mjs, the matching\ncontrol_plane literals 9 to 11 in tests/planning-contract.test.mjs, and the\nops:render script in the pinned surface in tests/planning/workspace-skeleton.\ntest.mjs. product_code_files stays 0.\n","ordinary_source_sha256":"d139ce39930b59ac3db546628e33fc370634330fdb9ae376994158531e4ef4ea","ordinary_body_chars":1637,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":11,"insertions":480,"deletions":10,"changed_paths":[".github/workflows/operational-state.yml","AGENTS.md","docs/planning/AOS-EXECUTION-ROADMAP.md","docs/planning/issue-resolution-ledger-2026-08-06.md","docs/tickets/BOARD.md","package.json","scripts/render-execution-views.mjs","scripts/validate-planning.mjs","tests/execution-views.test.mjs","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-3a462c35336b7325","repository_id":"agent-operator-score","source_commit_sha":"814c6e7cd19035cd1a70997c2a5ff74b39d5ef8d","decision_audit_anchor":"3a462c35336b732564b34e925e9efaf8d869a8399d6d7e5d496fc9f97374e08b","ordinary_source":"feat: freeze eligibility and score-issuance predicate\n\nEncodes all ten SSOT 6.1 issuance gates as frozen data in specs/issuance.v0.json and\nadds packages/schema/src/issuance-contract.ts, which derives each candidate's verdict\nfrom its evidence instead of believing the verdict the document declares.\n\nCoverage alone never issues a score. Fourteen eligible metrics and 70% evidence\ncoverage are necessary but not sufficient: a document claiming a coverage-only\ncandidate is issuable is rejected and names the exact gate it lied about.\n\nNOT_OBSERVED is never a zero. It leaves the eligibility denominator rather than\nentering it as a failure, so missing adapter data is reported as missing evidence and\nnever as operator failure.\n\nThe census gate added by E0A-001 admitted both new product files with no census edit\nat all, which is what it was built for. Its output is no longer pinned literally,\nbecause the ticket-owned list grows with every product ticket; the list is instead\nbound to an independent re-derivation in the skeleton test, which fails if the two\nparses ever diverge.\n\nX-Ticket: E0A-002\n","ordinary_source_sha256":"5b99a47459d68b89f6a6977be15b47b99faab8e293c35f0c223de325fcaa65e2","ordinary_body_chars":1102,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":5,"insertions":854,"deletions":3,"changed_paths":["packages/schema/src/issuance-contract.ts","packages/schema/test/issuance-contract.test.ts","specs/issuance.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-3bde5fdd3fb4c13a","repository_id":"agent-operator-score","source_commit_sha":"5d9a145177db5848e0e2fd86588ad662ed89a950","decision_audit_anchor":"3bde5fdd3fb4c13a67ec907c2de93694bf11540052eba702ff25aa8d5a93bea7","ordinary_source":"docs: record the missing D0-002 prerequisite gate receipt\n\nThe accepted D0-002 renewal is bound in the gate registry. Its merged\npull request omitted the structured body field the resolver searches\nfor. The receipt remains unmatched despite the live artifacts matching\nits recorded digests.\n\nThis empty commit carries only the pull request whose body provides that\nreceipt. Its tree remains identical to origin/dev. The registry record\nis already present; a tracked-file change would alter the digest-bound\ncensus and add unrelated ownership or evidence scope.\n\nX-Ticket: D0-002\n","ordinary_source_sha256":"31ddaf43a7c6f7014b535f6dd291455ab667e3651c0c4f74f2ad59624cfdce75","ordinary_body_chars":579,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":0,"insertions":0,"deletions":0,"changed_paths":[],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":false,"mechanical_exclusion":"scope-unresolvable","provenance_tier":"unsupported"} +{"schema_version":1,"candidate_id":"v4-4b7ef509f0403505","repository_id":"agent-operator-score","source_commit_sha":"6a56f76ea36e32d99f24e84295517dfdd3ecfb23","decision_audit_anchor":"4b7ef509f04035050d848c7b178daec87a3c66a0462335bc56d3392a873519e3","ordinary_source":"fix: drop Node 20, which silently skipped every TypeScript test\n\nCI on the previous head was partly vacuous. Node 20 reported 199 passing tests where\nNode 24 reported 212: its test runner does not discover a .ts test file at all, so the\nthirteen metric-registry cases never ran there and their absence looked like success.\nThe focused-lane guard added in the previous commit is what surfaced this, on its first\nrun against real CI.\n\nUnflagged TypeScript type stripping starts at Node 22.18.0, so that is the floor\nADR-0003's strict TypeScript mandate actually requires. The CI matrix drops to 22 and\n24, and engine-matrix now also asserts that 20 is absent rather than only matching the\nnew list.\n\nThe selectivity proof moved into a temporary copy of the repository. Writing its\nintruder file into the live tree raced with the fixture tests that copy this repository\nwhile it was present, failing three unrelated cases. The copy also skips the transient\nfixtures sibling tests write into the root for the same reason.\n\nX-Ticket: E0A-001\n","ordinary_source_sha256":"71dc57304730d046b85c721224bd0ef869ee68a85914e66d5029696bcfea6991","ordinary_body_chars":1037,"ordinary_body_survives":true,"removed_trailer_count":12,"residual_record_lines_removed":0,"files_changed":4,"insertions":41,"deletions":19,"changed_paths":[".github/workflows/ci.yml","docs/tickets/E0-A/E0A-001-freeze-m01-m20-metric-registry.md","package.json","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-50c24e701b7ba2ef","repository_id":"agent-operator-score","source_commit_sha":"ce973e655c862503966f69e4acafa6e377e3a544","decision_audit_anchor":"50c24e701b7ba2ef70e6f820ae0ce462d5b51c46b8a3f67a3a201344152a20b0","ordinary_source":"fix: give the fact collection a budget that survives backlog growth\n\nThe completion-effect check added one commit fetch per completion receipt and one\nrecursive tree listing, and a full collection then measured 89.5s against a 90s ceiling.\nThe resolver failed closed with EXTERNAL_STATE_UNAVAILABLE, which was the correct\nbehaviour and also made it unusable: readySet=none on a repository whose state was fine.\n\nThe ceiling was not really breached by the new calls. Collection cost scales with the\nnumber of merged Ticket-linked pull requests -- one authoritative fetch per search hit\n-- so ordinary backlog growth was going to reach 90s regardless; the new calls only\narrived first. The budget is now 300s, which covers roughly double the current receipt\ncount, and the reasoning is recorded beside the constant rather than left as a bare\nnumber.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"7682a6816bd1aaeebcbf2e7b4873fbd73a10d5e4337adf2eb69b7f28033d8067","ordinary_body_chars":866,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":1,"insertions":8,"deletions":1,"changed_paths":["scripts/resolve-execution-state.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-575de52ba54d6758","repository_id":"agent-operator-score","source_commit_sha":"1a7d3dbddafb0cf194f0213163267fb381fc655e","decision_audit_anchor":"575de52ba54d675820e148ba9606c0633137b5b0aef120fa9e51390ea6fe1a97","ordinary_source":"fix: page the merged-receipt search instead of failing closed at 30\n\nOnce this repository accumulated a full page of merged pull requests carrying a\n`Ticket:` field, the collector's single-page search hit its own page size and rejected\nthe whole collection with \"merged Ticket PR search possibly truncated at 30 items\".\nEvery ticket in the backlog resolved to blocked, and online-strict reported\nreadySet=none with no head. Failing closed on a possibly-truncated page was correct;\nnever requesting the next page was the defect.\n\nThe search is now collected page by page at 100 per page and must reach the promised\ntotal_count exactly. A payload whose total changes between pages, that reports\nincomplete results, that omits the boolean flag, or that never delivers the total it\npromised still fails the whole collection closed. GitHub caps search at 1000 results,\nwhich is exactly the ten-page ceiling, so an uncollectable total also fails closed.\n\nVerified against the live API rather than fixtures alone: before, readySet=none with\nerrors=EXTERNAL_STATE_UNAVAILABLE; after, head resolves and the ready set advances.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"c8cefce84fbcd81078d82750c73b07a0b3c0c0ef89a6f8708115e652e8ef1e0f","ordinary_body_chars":1136,"ordinary_body_survives":true,"removed_trailer_count":11,"residual_record_lines_removed":0,"files_changed":3,"insertions":126,"deletions":20,"changed_paths":["fixtures/operational-state/live-adapter/transport-responses.json","scripts/resolve-execution-state.mjs","tests/execution-state.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-5eb2760a3fa148f3","repository_id":"agent-operator-score","source_commit_sha":"3b2aa7cd672887213953f615ebb4e3d024fde250","decision_audit_anchor":"5eb2760a3fa148f3ec58ff48a5719c484a985ba8c785eab4cdf438ef6d49d117","ordinary_source":"fix: refuse a completion whose effect was reverted out of the tree\n\nD0-004 read verified while its deliverable did not exist. PR #155 carried\nTicket-Completion: D0-004 and was fully reverted by PR #156, so\n.github/workflows/operational-state.yml and scripts/render-execution-views.mjs are\nabsent from dev, but the #155 merge commit is still an ancestor and the resolver\ncredited completion on ancestry alone. Five product tickets were opened on that\ndependency. I verified the ancestry myself earlier in the session and treated it as\nsufficient, which is how the false green survived.\n\nA completion now also has to still be there. The collector records the paths each\ncompletion merge introduced and one recursive listing of the live tip; a completion\nwhose introduced path is absent is COMPLETION_EFFECT_REVERTED, an unavailable\nintroduced set is COMPLETION_EFFECT_UNKNOWN, and a truncated listing fails the\ncollection rather than reading missing paths as present.\n\nThe check is derived from Git rather than from ticket prose. Parsing declared ownership\nlooked simpler until D0-004's own ownership paragraph turned out to name\nmaintainer-gate-registry.v1.json as a path that must NOT be restored, which a naive\nreading would have demanded exist.\n\nLive result: D0-004 blocked on COMPLETION_EFFECT_REVERTED; D0-001, D0-002 and all five\nproduct tickets still verified, because their effects are present and they genuinely\nshipped. Dependencies gate starting work, not the record of having finished it, so\nnothing regresses.\n\nDocumentation that had gone false is corrected where the gate permits: README no longer\nclaims the product is unimplemented, and the Node floor reads 22.18 in the two unstarted\ntickets that would otherwise have sent a future lane to test on a runtime that cannot\nexecute this repository's TypeScript. package-lock.json still declared the old engine\nrange and now matches package.json.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"9bafd8191798b633018e0f4679dc9c4ffdfbc3e59dc79be8351a5dfc5bdc7d86","ordinary_body_chars":1926,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":12,"insertions":613,"deletions":31,"changed_paths":["README.md","docs/planning/pre-implementation-remediation-matrix-2026-08-05.md","docs/tickets/E1/E1-003-add-schema-conformance-compatibility-and-digest-gate.md","docs/tickets/E2/E2-005-close-g0-scorer-truth-reproducibility-gate.md","fixtures/operational-state/current-baseline/facts.json","fixtures/operational-state/live-adapter/transport-responses.json","package-lock.json","scripts/resolve-execution-state.mjs","scripts/validate-planning.mjs","tests/execution-state.test.mjs","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-5f6e3fcc52a2df1d","repository_id":"agent-operator-score","source_commit_sha":"874fabf2172487fb245b88d2cf104e580febaaa3","decision_audit_anchor":"5f6e3fcc52a2df1d24cd091f065403ba63eb916429c8cd7b2bca17cba5528f73","ordinary_source":"fix: stop on an ambiguous or absent contract, and roll back a partial write\n\nA third review round found the write path still able to accept input it\ncannot vouch for, and one guard with nothing holding it in place.\n\nA ticket path that was well formed but pointed at no file was recorded as\ndrift rather than a conflict, so write mode rendered a broken link into the\nboard and exited zero. A field declared twice was read from its first line\nonly, so a contract stating two different dependency sets was approved as\nagreeing with the catalog. Both now stop every mode without writing, and a\nduplicate is refused even when the two declarations agree, because the\nambiguity is the defect.\n\nThe start marker was matched by prefix, so a line reading `starter` was\naccepted as the marker and the authored prose beneath it was replaced. Both\nmarkers are now matched as whole lines against one fixed string.\n\nCross-file atomicity is not available, so the renderer is made reversible\ninstead: original bytes are held, every temporary file is written before any\nrename, and a rename that fails restores the surfaces already replaced. A\nrollback that itself fails says so rather than leaving the outcome implied.\n\nLine endings are now carried per line, so a file mixing both keeps the bytes\noutside the markers it started with.\n\nSix cases cover the above and each was verified against the mutant it exists\nto kill, including the rollback, which is exercised by injecting a rename\nfailure through a preloaded module.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"51566a7ca8a27b8b78b508b1477023ce44ef7ce86aa5ced03bea40f5757a86e5","ordinary_body_chars":1523,"ordinary_body_survives":true,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":2,"insertions":303,"deletions":37,"changed_paths":["scripts/render-execution-views.mjs","tests/planning-contract.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-60e3f694ae5ca2d5","repository_id":"agent-operator-score","source_commit_sha":"55afd506e018e2087df55fe192925c573f18685a","decision_audit_anchor":"60e3f694ae5ca2d50a0d30aff6eb3938f79114c91d42503e0e21e02cdcdc656e","ordinary_source":"feat: freeze formula, factor, safety and display precision contract\n\nEncodes SSOT 6.2 through 6.6 as frozen data in specs/scoring.v0.json and adds\npackages/schema/src/scoring-contract.ts, which derives every index, factor, safety\nverdict and displayed score from per-metric observations rather than reading a declared\nresult. The published worked example is reproduced from its inputs, not asserted: the\nvector carries only observations, from which the contract computes O, P and the raw score\nand arrives at the published display value.\n\nAll arithmetic is exact rationals in lowest terms through a single overflow-checked\nchoke point. The harmonic mean, the zero rule, the nearest-five display rounding and the\nfixed outcome weights are each derived and compared, so a document cannot declare a score\nits own inputs do not produce.\n\nM19 never enters the mean. A vector that places it in the scored metric set is rejected\noutright, and an S2 or S3 verdict withholds the score regardless of every other value.\n\nX-Ticket: E0A-003\n","ordinary_source_sha256":"559b4fb90295babe00158b64782fc9d89023c487f9d743b274e5392610c587ce","ordinary_body_chars":1028,"ordinary_body_survives":true,"removed_trailer_count":16,"residual_record_lines_removed":0,"files_changed":4,"insertions":5144,"deletions":0,"changed_paths":["docs/tickets/E0-A/E0A-003-freeze-formula-factor-safety-and-display-precision-contract.md","packages/schema/src/scoring-contract.ts","packages/schema/test/scoring-contract.test.ts","specs/scoring.v0.json"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-7362d21baaf5d618","repository_id":"agent-operator-score","source_commit_sha":"a80131443e5e082b92b0ce6816b649840fc6f92c","decision_audit_anchor":"7362d21baaf5d618b63a686e9a28b4137068a207c6f119a471c88ad6f4c837cf","ordinary_source":"fix: apply the required core before issuing a score\n\nAn adversarial review returned DO-NOT-SHIP. The contract paid a run more for\nobserving less: it emitted issued and the SSOT 6.5 status vocabulary without ever\napplying 6.1's required core, so dropping M18, M20 and M11-M14 as NOT_OBSERVED\nraised the published example from 80 to 85, observing 4 of 19 metrics scored 100,\nand a tampered INVALID M15 still scored 80. On an identical observation set the\nalready-frozen issuance contract derived issuable false with REQUIRED_OUTCOME\nfailed, so two frozen artifacts disagreed.\n\nIssuance now requires M15, M16, M17, M18 and M20 all SCORED, which is 6.1 items 1\nand 2 and nothing more; the other eight gates read evidence this contract never\nreceives and stay in the issuance contract. Safety still outranks insufficiency.\nThe exclusion vector was re-authored onto non-required metrics so it still shows\nrenormalisation without showing inflation.\n\nThe required-core condition replaced the old derivable check rather than joining\nit, because a complete core implies both indices derive and the pair would have\nshipped an unkillable conjunct.\n\nX-Ticket: E0A-003\n","ordinary_source_sha256":"8477387a90d4548c6db12a66716383f2195c0dda39c15895f8629ead650dd150","ordinary_body_chars":1155,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":4,"insertions":899,"deletions":52,"changed_paths":["docs/tickets/E0-A/E0A-003-freeze-formula-factor-safety-and-display-precision-contract.md","packages/schema/src/scoring-contract.ts","packages/schema/test/scoring-contract.test.ts","specs/scoring.v0.json"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-8001a8835a9351e3","repository_id":"agent-operator-score","source_commit_sha":"27a027adf42115f097ae82fd18901e25a62df539","decision_audit_anchor":"8001a8835a9351e3bea546e243504c9c55294e063866d98e422be9988f0eed92","ordinary_source":"feat: define adapter capability schema and complete event matrix\n\nEncodes the SSOT adapter event matrix as frozen data in specs/adapter-capabilities.v0.json\nand adds packages/schema/src/capability.ts, which derives every classification from the\nmatrix's own frozen prose rather than reading a declared column.\n\nFourteen event groups across two runtimes, twenty-eight cells, exhaustive in both\ndirections: a missing cell, an extra cell, a missing row, or a source-less capture fails\nclosed rather than defaulting. Statuses, requirement scope, condition metrics, missing\neffects, affected metrics, per-cell status and runtime constraint, and each runtime's\nsupported and known-missing event groups are all recomputed and compared. Every frozen\ntext column is pinned verbatim, so a document cannot make a derivation agree by rewriting\nthe prose that derivation reads.\n\nThe conditional row is the one that matters most. The SSOT marks human active time\nREQUIRED only for M18 and M20, and it is refused entry to the unconditional required set\nby three independent routes. The derived unconditional set is exactly the seven groups\nthe issuance contract already gates on.\n\nThe census assertion returns to matching the shape rather than the literal path list.\nRestoring the literal list in the previous ticket was my error: I accepted a review\nfinding that the relaxed form \"lost detection\" without checking that a stronger guard\nalready covered it. Deleting both of a ticket's owned files is caught by the focused-lane\ncount guard, verified here by deleting them and observing \"focused lane metric-registry\nran 2 tests and not at least 13\". Pinning the path list only reintroduced a per-ticket\nedit that every remaining product ticket would have to make.\n\nX-Ticket: E0B-001\n","ordinary_source_sha256":"9d4d3a6175ac74cf044fff7b58764f438b71e845c6f1b1a524c494f7c59c62b9","ordinary_body_chars":1767,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":6,"insertions":2133,"deletions":3,"changed_paths":["docs/tickets/E0-B/E0B-001-define-adapter-capability-schema-and-complete-event-matrix.md","packages/schema/src/capability.ts","packages/schema/test/capability.test.ts","specs/adapter-capabilities.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-82ae5492d09483d9","repository_id":"agent-operator-score","source_commit_sha":"68b25ab74b49c89d01a5e2ce4eb72a5d9ab8d8ce","decision_audit_anchor":"82ae5492d09483d97c79fbec330f6f219698b02d17154da6ed453669b460c097","ordinary_source":"feat: implement the deterministic one-lever selector\n\nEncode SSOT 8.2 rules 1 to 8 as a total function of its input. S2 and S3 stop\nthe score and every ordinary lever and emit only the registry's own\nsafety-only remediation. An unobserved metric, a confidence below 7/10, fewer\nthan two distinct opportunities, or an absent score leaves the candidate set\nrather than entering it with a default, and an empty candidate set is\nINSUFFICIENT_EVIDENCE. Factor gaps are the opportunity-weighted mean of their\neligible metric gaps; the widest gap opens a three-point band, and the frozen\nF5 F4 F1 F2 F3 F6 order picks inside it. Inside the chosen factor the lowest\nscoring metric wins, then the treatment with the lower total cost, then the\nsmaller permission surface.\n\nWhere the rules do not reach exactly one answer the procedure returns\nMANUAL_REVIEW_REQUIRED and invents nothing. Identifier order is never a\ntie-break, because that would be an arbitrary prescription under a\ndeterministic name. Every comparison is exact rational arithmetic, so the band\nmeans 3/100 and not a float that rounds into or out of it. Each outcome carries\na decision trace whose steps are reproducible from the input alone.\n\nThe metric-to-treatment map is supplied by the caller as the pre-registered\nregistry rows rather than restated here, and the safety remediation is chosen\nby the row's own safety_only_remediation flag rather than by a hard-coded\nidentifier.\n\nCensus pins move 33 to 35 for the owned source file and the owned RED file, and\nthe README paragraph and its pin move with them: the one-lever selector was in\nthe list the README calls absent.\n\nX-Ticket: E0D-003\n","ordinary_source_sha256":"217d4020ee89e21a90e14838a793cf030f0126af57127954f59955e4b5b67722","ordinary_body_chars":1653,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":10,"insertions":918,"deletions":3,"changed_paths":["README.md","fixtures/prescription/factor-priority.json","fixtures/prescription/insufficient.json","fixtures/prescription/lower-cost.json","fixtures/prescription/lower-permission.json","fixtures/prescription/manual-review-treatment.json","fixtures/prescription/manual-review.json","fixtures/prescription/s2-safety.json","fixtures/prescription/three-point-tie.json","tests/planning-contract.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-841244a354bd70c7","repository_id":"agent-operator-score","source_commit_sha":"a80131443e5e082b92b0ce6816b649840fc6f92c","decision_audit_anchor":"841244a354bd70c7a4b209feeb6157db323229ce37da52476996215c32d61af1","ordinary_source":"fix: apply the required core before issuing a score\n\nAn adversarial review returned DO-NOT-SHIP. The contract paid a run more for\nobserving less: it emitted issued and the SSOT 6.5 status vocabulary without ever\napplying 6.1's required core, so dropping M18, M20 and M11-M14 as NOT_OBSERVED\nraised the published example from 80 to 85, observing 4 of 19 metrics scored 100,\nand a tampered INVALID M15 still scored 80. On an identical observation set the\nalready-frozen issuance contract derived issuable false with REQUIRED_OUTCOME\nfailed, so two frozen artifacts disagreed.\n\nIssuance now requires M15, M16, M17, M18 and M20 all SCORED, which is 6.1 items 1\nand 2 and nothing more; the other eight gates read evidence this contract never\nreceives and stay in the issuance contract. Safety still outranks insufficiency.\nThe exclusion vector was re-authored onto non-required metrics so it still shows\nrenormalisation without showing inflation.\n\nThe required-core condition replaced the old derivable check rather than joining\nit, because a complete core implies both indices derive and the pair would have\nshipped an unkillable conjunct.\n\nX-Ticket: E0A-003\n","ordinary_source_sha256":"8477387a90d4548c6db12a66716383f2195c0dda39c15895f8629ead650dd150","ordinary_body_chars":1155,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":4,"insertions":899,"deletions":52,"changed_paths":["docs/tickets/E0-A/E0A-003-freeze-formula-factor-safety-and-display-precision-contract.md","packages/schema/src/scoring-contract.ts","packages/schema/test/scoring-contract.test.ts","specs/scoring.v0.json"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-843485d931913281","repository_id":"agent-operator-score","source_commit_sha":"f87142258706f3ccda126114b1e04095d47d4c6f","decision_audit_anchor":"843485d931913281c1f9d9d5b4b7ee08f1ea704908d27f830bbda1e8fa2a2d7d","ordinary_source":"fix: refuse a derivation proof that no cell anchors, and never exit zero on refusal\n\nAn adversarial review returned DO-NOT-SHIP with seven findings. All seven are fixed.\n\nThe contract resurrected a matrix cell from its own unchecked prose. When every runtime\ncell for a group carried a null derivation proof, the pin was skipped and the\ncontract-declared proof text was written back into the matrix, so a matrix under which\nno report can be COMPLETE still validated clean and still credited COMPLETE as\nexercised. That is the sibling defect this contract claimed to have avoided: a pin fed\nby an input that is itself free. A group no cell anchors is now\nCONTRACT_DERIVATION_PROOF_UNPINNED. One runtime losing a derivation still pins through\nthe other, so the ordinary degraded and blocked cases are unaffected.\n\nA refused report also carried a success exit code. A caller running\nprocess.exit(result.exit_code) on a rejected report exited 0, while matrix and contract\ndefects correctly returned 30. Refusal is now one rule at every level: SCORE_BLOCKED,\nexit 30, no reasons, no projection.\n\nThe reported sweep did not survive re-execution. It claimed 196 mutants with one\nsurvivor; an independent run of 440 found fifteen, because fourteen error-code literals\nwere only ever reached through a substring match and no case asserted them. Every code\nthe module can emit is now produced by a named input and compared whole, and the\ninventory is re-derived from the source so a new code with no case fails. The rebuilt\nsweep is 603 mutants, 602 killed, one known survivor, reported as measured.\n\nThe required-observed filter was dead by construction and is deleted rather than kept as\nan unkillable guard; a canary now proves the two sets it straddled are disjoint and that\nthe sibling contract enforces that.\n\nX-Ticket: E0B-003\n","ordinary_source_sha256":"0fd2bf5d5b1e4d12394042db5aae87b15894cc78d43b9567b03132f048dd995b","ordinary_body_chars":1824,"ordinary_body_survives":true,"removed_trailer_count":12,"residual_record_lines_removed":0,"files_changed":5,"insertions":711,"deletions":38,"changed_paths":["docs/tickets/E0-B/E0B-003-specify-capability-doctor-output-and-verdict-fixtures.md","packages/schema/src/doctor-contract.ts","packages/schema/test/doctor-contract.test.ts","specs/doctor-output.v0.json","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-88299d9c1503bc7b","repository_id":"agent-operator-score","source_commit_sha":"3b2aa7cd672887213953f615ebb4e3d024fde250","decision_audit_anchor":"88299d9c1503bc7b9e627177f321fe8c8b7272d984665d4ca3204c81404cc096","ordinary_source":"fix: refuse a completion whose effect was reverted out of the tree\n\nD0-004 read verified while its deliverable did not exist. PR #155 carried\nTicket-Completion: D0-004 and was fully reverted by PR #156, so\n.github/workflows/operational-state.yml and scripts/render-execution-views.mjs are\nabsent from dev, but the #155 merge commit is still an ancestor and the resolver\ncredited completion on ancestry alone. Five product tickets were opened on that\ndependency. I verified the ancestry myself earlier in the session and treated it as\nsufficient, which is how the false green survived.\n\nA completion now also has to still be there. The collector records the paths each\ncompletion merge introduced and one recursive listing of the live tip; a completion\nwhose introduced path is absent is COMPLETION_EFFECT_REVERTED, an unavailable\nintroduced set is COMPLETION_EFFECT_UNKNOWN, and a truncated listing fails the\ncollection rather than reading missing paths as present.\n\nThe check is derived from Git rather than from ticket prose. Parsing declared ownership\nlooked simpler until D0-004's own ownership paragraph turned out to name\nmaintainer-gate-registry.v1.json as a path that must NOT be restored, which a naive\nreading would have demanded exist.\n\nLive result: D0-004 blocked on COMPLETION_EFFECT_REVERTED; D0-001, D0-002 and all five\nproduct tickets still verified, because their effects are present and they genuinely\nshipped. Dependencies gate starting work, not the record of having finished it, so\nnothing regresses.\n\nDocumentation that had gone false is corrected where the gate permits: README no longer\nclaims the product is unimplemented, and the Node floor reads 22.18 in the two unstarted\ntickets that would otherwise have sent a future lane to test on a runtime that cannot\nexecute this repository's TypeScript. package-lock.json still declared the old engine\nrange and now matches package.json.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"9bafd8191798b633018e0f4679dc9c4ffdfbc3e59dc79be8351a5dfc5bdc7d86","ordinary_body_chars":1926,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":12,"insertions":613,"deletions":31,"changed_paths":["README.md","docs/planning/pre-implementation-remediation-matrix-2026-08-05.md","docs/tickets/E1/E1-003-add-schema-conformance-compatibility-and-digest-gate.md","docs/tickets/E2/E2-005-close-g0-scorer-truth-reproducibility-gate.md","fixtures/operational-state/current-baseline/facts.json","fixtures/operational-state/live-adapter/transport-responses.json","package-lock.json","scripts/resolve-execution-state.mjs","scripts/validate-planning.mjs","tests/execution-state.test.mjs","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-89d86d3677fb18ef","repository_id":"agent-operator-score","source_commit_sha":"9c531c0e92470b71edf1bff127f1e5196ea875bb","decision_audit_anchor":"89d86d3677fb18efb22ef694dcd4b921fbc3fca6f576a6ba88e882bd79c85432","ordinary_source":"fix: remove the live-tree write that raced every fixture copy\n\nCI failed on Node 24 with ENOENT on .planning-legacy-identifier-fixture.txt inside\ncpSync. The legacy-identifier probe wrote that file into the live repository root and\ndeleted it again, while sibling tests copy that same root; a copy that enumerated the\nfile before the delete and read it after fails.\n\nThe race predates this branch, but this branch made it likely by adding a second\nconcurrent repository copy, so it surfaced here. The probe now runs in its own temporary\ncopy and the live tree is never written during the suite.\n\nVerified by three consecutive full runs at 213/213 rather than a single pass, since a\nrace that reproduces intermittently is not disproved by one green run.\n\nX-Ticket: E0A-001\n","ordinary_source_sha256":"1cf80a2ce01a436ecce8dc47f6c30356b6d7b08848c49109884150b52ccb75b8","ordinary_body_chars":772,"ordinary_body_survives":true,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":1,"insertions":13,"deletions":5,"changed_paths":["tests/planning-contract.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-8c7fdf80ae6c6f2e","repository_id":"agent-operator-score","source_commit_sha":"68b25ab74b49c89d01a5e2ce4eb72a5d9ab8d8ce","decision_audit_anchor":"8c7fdf80ae6c6f2e91a3b1470debd1d59cba9453f7b3c4d47fe24647657c4d01","ordinary_source":"feat: implement the deterministic one-lever selector\n\nEncode SSOT 8.2 rules 1 to 8 as a total function of its input. S2 and S3 stop\nthe score and every ordinary lever and emit only the registry's own\nsafety-only remediation. An unobserved metric, a confidence below 7/10, fewer\nthan two distinct opportunities, or an absent score leaves the candidate set\nrather than entering it with a default, and an empty candidate set is\nINSUFFICIENT_EVIDENCE. Factor gaps are the opportunity-weighted mean of their\neligible metric gaps; the widest gap opens a three-point band, and the frozen\nF5 F4 F1 F2 F3 F6 order picks inside it. Inside the chosen factor the lowest\nscoring metric wins, then the treatment with the lower total cost, then the\nsmaller permission surface.\n\nWhere the rules do not reach exactly one answer the procedure returns\nMANUAL_REVIEW_REQUIRED and invents nothing. Identifier order is never a\ntie-break, because that would be an arbitrary prescription under a\ndeterministic name. Every comparison is exact rational arithmetic, so the band\nmeans 3/100 and not a float that rounds into or out of it. Each outcome carries\na decision trace whose steps are reproducible from the input alone.\n\nThe metric-to-treatment map is supplied by the caller as the pre-registered\nregistry rows rather than restated here, and the safety remediation is chosen\nby the row's own safety_only_remediation flag rather than by a hard-coded\nidentifier.\n\nCensus pins move 33 to 35 for the owned source file and the owned RED file, and\nthe README paragraph and its pin move with them: the one-lever selector was in\nthe list the README calls absent.\n\nX-Ticket: E0D-003\n","ordinary_source_sha256":"217d4020ee89e21a90e14838a793cf030f0126af57127954f59955e4b5b67722","ordinary_body_chars":1653,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":10,"insertions":918,"deletions":3,"changed_paths":["README.md","fixtures/prescription/factor-priority.json","fixtures/prescription/insufficient.json","fixtures/prescription/lower-cost.json","fixtures/prescription/lower-permission.json","fixtures/prescription/manual-review-treatment.json","fixtures/prescription/manual-review.json","fixtures/prescription/s2-safety.json","fixtures/prescription/three-point-tie.json","tests/planning-contract.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-8f24735524874167","repository_id":"agent-operator-score","source_commit_sha":"c1d8b6630e66a9dc6033567d7f7d3704e5c7ca22","decision_audit_anchor":"8f247355248741672de0bfa76c5dfe9ba5fd0571c4efb9ef3a529dbc9fa4bb19","ordinary_source":"feat: specify capability doctor output and verdict fixtures\n\nDerives the doctor verdict, exit code, ordered reasons and every projection line from\nthe capability matrix rather than reading them off the report under test. The declared\nverdict is never trusted, and the matrix the verdict is derived from is itself\nrevalidated on every call, so the pin is not fed by a free input.\n\nThe blocking rule is derived, not membership of a list: an UNAVAILABLE group blocks the\nscore exactly when its absence effects lack NOT_OBSERVED. The blocked fixture proves the\ndistinction by blocking on a group that is not one of the seven required ones.\n\nFixtures live where the ticket says they live. Putting them in the frozen document would\nhave matched all three siblings and passed every gate, but the ticket grants\nfixtures/doctor/*.json and a ticket outranks a convention. The split turned out better\nthan compliance: the document fell from 2159 to 240 lines and now carries rules and a\nthree-field manifest, while each fixture is exactly what the command prints. Nothing is\nduplicated, so nothing can drift silently -- a declared report with no file, a file no\nreport declares, a rename, content drift, and a manifest row naming the wrong matrix\nvariant each fail a named case.\n\nAdmission of fixture directories is now derived from the tickets instead of hardcoded.\nfixtures/operational-state was the only admitted directory and a second one would have\nmeant a second branch; a ticket that declares a fixture glob now admits it, and one that\nstops declaring it stops admitting it. Both directions are asserted.\n\nX-Ticket: E0B-003\n","ordinary_source_sha256":"39975b1bd887d212f0c5ece5a625163ac64ff973e444c500a6a6ebdc191b83fb","ordinary_body_chars":1620,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":11,"insertions":4520,"deletions":8,"changed_paths":["fixtures/doctor/blocked-and-imported.json","fixtures/doctor/blocked.json","fixtures/doctor/complete.json","fixtures/doctor/degraded.json","fixtures/doctor/imported-and-degraded.json","fixtures/doctor/imported-only.json","packages/schema/src/doctor-contract.ts","packages/schema/test/doctor-contract.test.ts","specs/doctor-output.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-915f4e606299276c","repository_id":"agent-operator-score","source_commit_sha":"55afd506e018e2087df55fe192925c573f18685a","decision_audit_anchor":"915f4e606299276c2921e9f96006b7c768bb7f78269faf7ce528b3380ca455be","ordinary_source":"feat: freeze formula, factor, safety and display precision contract\n\nEncodes SSOT 6.2 through 6.6 as frozen data in specs/scoring.v0.json and adds\npackages/schema/src/scoring-contract.ts, which derives every index, factor, safety\nverdict and displayed score from per-metric observations rather than reading a declared\nresult. The published worked example is reproduced from its inputs, not asserted: the\nvector carries only observations, from which the contract computes O, P and the raw score\nand arrives at the published display value.\n\nAll arithmetic is exact rationals in lowest terms through a single overflow-checked\nchoke point. The harmonic mean, the zero rule, the nearest-five display rounding and the\nfixed outcome weights are each derived and compared, so a document cannot declare a score\nits own inputs do not produce.\n\nM19 never enters the mean. A vector that places it in the scored metric set is rejected\noutright, and an S2 or S3 verdict withholds the score regardless of every other value.\n\nX-Ticket: E0A-003\n","ordinary_source_sha256":"559b4fb90295babe00158b64782fc9d89023c487f9d743b274e5392610c587ce","ordinary_body_chars":1028,"ordinary_body_survives":true,"removed_trailer_count":16,"residual_record_lines_removed":0,"files_changed":4,"insertions":5144,"deletions":0,"changed_paths":["docs/tickets/E0-A/E0A-003-freeze-formula-factor-safety-and-display-precision-contract.md","packages/schema/src/scoring-contract.ts","packages/schema/test/scoring-contract.test.ts","specs/scoring.v0.json"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-975a69717305d00f","repository_id":"agent-operator-score","source_commit_sha":"e18a8b9156260b04c66eaacb91a1d607a277b77c","decision_audit_anchor":"975a69717305d00fb9c46d83f27cddc79ffbae4615bc575be0a6744c52d1ee78","ordinary_source":"fix: make the metric registry actually refuse contract drift\n\nAn independent adversarial review returned DO-NOT-SHIP on cc67b62. The arithmetic\nlayer was verified sound -- all 82 canonical vectors recomputed from the contract with\nzero divergence -- but the validator accepted 25 registries that violate the contract,\nand 12 of its own guards were unprotected by any test.\n\nThe frozen artifact also contradicted itself: 15 metrics declared the grader output\ntheir contract row names, while their vectors carried an invented {key,total} shape,\nand the validator enforced the invented side. Encoding the contract correctly was\nrejected. Every vector now emits exactly the fields its contract row names, and each\nvalue is re-derived rather than trusted.\n\nNewly refused, each covered by a regression: a rewritten per-opportunity formula, M11\nat denominator 5, minimum_opportunities zeroed, a reversed evidence precedence, an\noperator claim at confidence 1.0, swapped or extra consumer routes, M19 averaged into\nthe process index, registry-level learned weights, a hidden oracle answer or grader\ndiscretion field smuggled into a vector, a NOT_OBSERVED vector carrying a payload, a\nrational not in lowest terms, a numerator selected by JSON key order, and a \"pass\"\nfixture made vacuous so it exercises nothing.\n\nThe census test asserted a property no implementation could violate: deleting the whole\ngate left it green. It now binds to the validator's own census output and proves\nselectivity against a real unclaimed file written into the skeleton and removed again.\nBoth parses use the same ticket-file filter, and an ASCII hyphen or en dash no longer\nsilently drops an ownership claim.\n\nX-Ticket: E0A-001\n","ordinary_source_sha256":"4e79a0c9549dcf6356603a82739f6f4ff73fed0dcd87699262fa1344ee4fa379","ordinary_body_chars":1702,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":6,"insertions":633,"deletions":241,"changed_paths":["docs/tickets/E0-A/E0A-001-freeze-m01-m20-metric-registry.md","packages/schema/src/metric-registry.ts","packages/schema/test/metric-registry.test.ts","scripts/validate-planning.mjs","specs/metrics.v0.json","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-9b42b1951da730e1","repository_id":"agent-operator-score","source_commit_sha":"cc67b62673392d764f257422ee313b2853aa7ed2","decision_audit_anchor":"9b42b1951da730e12ccd20742fca92da1461703c628ea5da580db39544ec0103","ordinary_source":"feat: freeze M01-M20 metric registry\n\nEncodes the 20 Metric Scoring Contract v1 records as frozen data in specs/metrics.v0.json\nand adds packages/schema/src/metric-registry.ts as the executable contract that refuses a\nregistry which drifts from them.\n\nM10 regret and M20 distance are derived from the frozen route table and frontier rather\nthan read from the vector, so a caller-supplied selected_regret, maximum_regret,\ndistance_to_frontier, or maximum_distance is rejected as INVALID instead of scored.\n\nThe census gate is amended so product code is admitted only where an accepted atomic\nticket claims it by exact path. There is no standing product-code allowlist to edit;\nan unowned source file still fails closed, proven both ways in this branch.\n\nX-Ticket: E0A-001\n","ordinary_source_sha256":"255f8917fac53d5c8c4b9be16928bbc9d24f291d8a4c9adca004bb1b82adb9b7","ordinary_body_chars":771,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":7,"insertions":3854,"deletions":8,"changed_paths":["packages/schema/package.json","packages/schema/src/metric-registry.ts","packages/schema/test/metric-registry.test.ts","scripts/validate-planning.mjs","specs/metrics.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a0489f4a19bc3969","repository_id":"agent-operator-score","source_commit_sha":"f87142258706f3ccda126114b1e04095d47d4c6f","decision_audit_anchor":"a0489f4a19bc39696d57f7588f0ce2d3f94dca536f17be21f620c8cc564780b2","ordinary_source":"fix: refuse a derivation proof that no cell anchors, and never exit zero on refusal\n\nAn adversarial review returned DO-NOT-SHIP with seven findings. All seven are fixed.\n\nThe contract resurrected a matrix cell from its own unchecked prose. When every runtime\ncell for a group carried a null derivation proof, the pin was skipped and the\ncontract-declared proof text was written back into the matrix, so a matrix under which\nno report can be COMPLETE still validated clean and still credited COMPLETE as\nexercised. That is the sibling defect this contract claimed to have avoided: a pin fed\nby an input that is itself free. A group no cell anchors is now\nCONTRACT_DERIVATION_PROOF_UNPINNED. One runtime losing a derivation still pins through\nthe other, so the ordinary degraded and blocked cases are unaffected.\n\nA refused report also carried a success exit code. A caller running\nprocess.exit(result.exit_code) on a rejected report exited 0, while matrix and contract\ndefects correctly returned 30. Refusal is now one rule at every level: SCORE_BLOCKED,\nexit 30, no reasons, no projection.\n\nThe reported sweep did not survive re-execution. It claimed 196 mutants with one\nsurvivor; an independent run of 440 found fifteen, because fourteen error-code literals\nwere only ever reached through a substring match and no case asserted them. Every code\nthe module can emit is now produced by a named input and compared whole, and the\ninventory is re-derived from the source so a new code with no case fails. The rebuilt\nsweep is 603 mutants, 602 killed, one known survivor, reported as measured.\n\nThe required-observed filter was dead by construction and is deleted rather than kept as\nan unkillable guard; a canary now proves the two sets it straddled are disjoint and that\nthe sibling contract enforces that.\n\nX-Ticket: E0B-003\n","ordinary_source_sha256":"0fd2bf5d5b1e4d12394042db5aae87b15894cc78d43b9567b03132f048dd995b","ordinary_body_chars":1824,"ordinary_body_survives":true,"removed_trailer_count":12,"residual_record_lines_removed":0,"files_changed":5,"insertions":711,"deletions":38,"changed_paths":["docs/tickets/E0-B/E0B-003-specify-capability-doctor-output-and-verdict-fixtures.md","packages/schema/src/doctor-contract.ts","packages/schema/test/doctor-contract.test.ts","specs/doctor-output.v0.json","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a2acb02e41d42051","repository_id":"agent-operator-score","source_commit_sha":"25f6d902fa7db3133343c326657f0e2cd48fd584","decision_audit_anchor":"a2acb02e41d4205156b021a30c0d19d243709914647245c46780424389b64c89","ordinary_source":"docs: record the owner's acceptance of the D0-011 prerequisite set\n\nThe repository states this ticket is blocked pending a maintainer gate, and\nthe owner has accepted that gate. Until now that acceptance existed only as\nan instruction repeated to each agent, which left the recorded state saying\none thing and the work proceeding on another, and left no audit trail of who\napproved what or against which digests.\n\nThis records it where the mechanism expects: ADR-0001, ADR-0003, ADR-0012,\nPRD-D0 and the exact D0-011 ticket, pinned at their current digests and at\nthe reviewed head, approved by the repository owner in the maintainer role\nthey hold as its sole maintainer.\n\nThe record is deliberately narrow. It is not technical review and not merge\nauthorization; an adversarial reviewer's pass is still required before this\nticket's implementation merges, and the registry itself carries the same\nstatement.\n\nX-Ticket: D0-011\n","ordinary_source_sha256":"64e378850c0c7bd3bdc73b1b3f51e248ab72e9f3a1f265a61f71d1a8df2b96eb","ordinary_body_chars":928,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":1,"insertions":107,"deletions":0,"changed_paths":["docs/decisions/maintainer-gate-registry.v2.json"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a3705f2f819df548","repository_id":"agent-operator-score","source_commit_sha":"2d9e497a18fe46b09fcef7c0ad4a5178efc3a8e9","decision_audit_anchor":"a3705f2f819df54812b816774c2ad2f1700ce63a83be8f6e693e65a49c8d6082","ordinary_source":"feat: freeze the M01-M20 treatment registry and S2 safety path\n\nEncode one default v0 treatment per SSOT 8.3 metric range, with\nimplementation protocol, cost, permission delta, transferability,\nretest criteria and safety-only remediation. The validator refuses\na metric that lacks a treatment, maps to two defaults, carries\nordinary advice onto the S2/S3 path, omits retest criteria, or\nnames an unknown metric.\n\nCensus pins move 27 to 29 for the two materialized owned source\nfiles. Focused-lane counts increment by the new test file.\n\nX-Ticket: E0D-002\n","ordinary_source_sha256":"1a0850eb7c0ed77d7eaa0daa330a5984f179bd55359fc6cb901cbc6a6ee1c5af","ordinary_body_chars":555,"ordinary_body_survives":true,"removed_trailer_count":2,"residual_record_lines_removed":0,"files_changed":1,"insertions":172,"deletions":0,"changed_paths":["specs/treatments.v0.json"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a3d2b14112b034a4","repository_id":"agent-operator-score","source_commit_sha":"1a7d3dbddafb0cf194f0213163267fb381fc655e","decision_audit_anchor":"a3d2b14112b034a4de9767a73fe77c055f01ced9f603feef460703a9def5d4a3","ordinary_source":"fix: page the merged-receipt search instead of failing closed at 30\n\nOnce this repository accumulated a full page of merged pull requests carrying a\n`Ticket:` field, the collector's single-page search hit its own page size and rejected\nthe whole collection with \"merged Ticket PR search possibly truncated at 30 items\".\nEvery ticket in the backlog resolved to blocked, and online-strict reported\nreadySet=none with no head. Failing closed on a possibly-truncated page was correct;\nnever requesting the next page was the defect.\n\nThe search is now collected page by page at 100 per page and must reach the promised\ntotal_count exactly. A payload whose total changes between pages, that reports\nincomplete results, that omits the boolean flag, or that never delivers the total it\npromised still fails the whole collection closed. GitHub caps search at 1000 results,\nwhich is exactly the ten-page ceiling, so an uncollectable total also fails closed.\n\nVerified against the live API rather than fixtures alone: before, readySet=none with\nerrors=EXTERNAL_STATE_UNAVAILABLE; after, head resolves and the ready set advances.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"c8cefce84fbcd81078d82750c73b07a0b3c0c0ef89a6f8708115e652e8ef1e0f","ordinary_body_chars":1136,"ordinary_body_survives":true,"removed_trailer_count":11,"residual_record_lines_removed":0,"files_changed":3,"insertions":126,"deletions":20,"changed_paths":["fixtures/operational-state/live-adapter/transport-responses.json","scripts/resolve-execution-state.mjs","tests/execution-state.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-ad1efe720ca11f3c","repository_id":"agent-operator-score","source_commit_sha":"064f7ab26e4596f2ffbed398a2b45962dab8bcbf","decision_audit_anchor":"ad1efe720ca11f3c77f8a6de04225991737a076cbfd553a0ffb918c4bd3d86b0","ordinary_source":"feat: implement the deterministic pack budget and eligibility simulator\n\nImplement the two symbols E0C-002 owns. auditOpportunities walks the\npreregistered scenarios, refuses a repeated opportunity id as DOUBLE_COUNT,\nrefuses a secondary observation with no primary as SECONDARY_UNOBSERVED, and\nreturns the sorted set of metrics that actually carry a primary observation.\nsimulatePackBudget consumes that audit and answers timing and eligibility in\none verdict, so a pack cannot pass on time while failing to observe what the\nissuance contract requires.\n\nTiming is seeded. A mulberry32 stream driven by the assumptions' own integer\nseed draws one triangular sample per family per trial over 1000 trials, and\nthe raw rows are returned rather than summarised away. p90 is the empirical\n90th percentile of those rows, because the sum of triangulars has no closed\nform there.\n\nThe median is taken analytically, as the sum of the per-family medians, and\nthe two are deliberately not the same route. Every preregistered family is a\nsymmetric triangular, its mode is exactly the midpoint of its support, and a\nsum of independent symmetric variables is symmetric about the sum of its\ncentres; a continuous distribution symmetric about a point has its median at\nthat point. The analytic value is therefore exact at 40 minutes and carries no\nMonte Carlo error. The seeded p50 of the same rows lands at 40.0346, which is\n0.87 standard errors of a 1000-sample median above the true value and would\nread the 40-minute ceiling as breached on sampling noise alone. The exactness\nholds only while every family distribution stays symmetric, and that condition\nis stated at the derivation rather than left implicit.\n\ntransition_overhead is declared in specs/pack-simulation.v0.json and is\ndeliberately not added to the timing. The preregistered assumptions carry no\noverhead term and the family distributions are the only declared source of\nminutes; inventing one would be fabricated timing, which the ticket forbids.\n\nThe eligibility gates mirror specs/issuance.v0.json rather than reinventing\nit. FACTOR_COVERAGE binds F1-F4 at one scored metric each and\nFACTOR_OPPORTUNITY binds F1-F5 at two distinct opportunity ids each; the\nasymmetry is the contract's. REQUIRED_OUTCOME and REQUIRED_RECOVERY_VALUE make\nM15-M18 and M20 the scored core, while REQUIRED_SAFETY holds M19 as a separate\nterm, so the prescription path fails when the safety opportunity is absent\neven though the core is intact. The metric-to-factor table is mirrored in the\nsource because the simulator is handed the pack-simulation spec only, and\nreading a second spec from disk would make the function non-hermetic; any\ndrift from issuance.v0 is a defect in this file.\n\nThe verdict is reproducible from the input alone: the manifest digest is\nsha256 over a canonical, key-sorted encoding of the seed, both inputs, the\nderived statistics, the reason codes, and every raw row, and a second call on\nthe same input returns the same digest, median, p90 and rows.\n\nCensus pins move 37 to 40 for the two owned source files and the owned RED\nfile. Nothing the README claims present or pinned-absent moves: the pinned\nstatus line, the planned-CLI line, the ticket census, and the pinned absence\nof packages/cli and apps/cli are all unchanged, and no test pins the absence\nof packages/scorer/src/simulation.\n\nX-Ticket: E0C-002\n","ordinary_source_sha256":"0bf2f06ad99a047039d4de88b7c26d5e27d4373635a0c637a854196ab67fd973","ordinary_body_chars":3368,"ordinary_body_survives":true,"removed_trailer_count":4,"residual_record_lines_removed":0,"files_changed":1,"insertions":2,"deletions":2,"changed_paths":["tests/planning-contract.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-b525ee2c84544b9e","repository_id":"agent-operator-score","source_commit_sha":"064f7ab26e4596f2ffbed398a2b45962dab8bcbf","decision_audit_anchor":"b525ee2c84544b9ef8a8ec91aa27b848917ccade7e55ba3b2e263426a295c617","ordinary_source":"feat: implement the deterministic pack budget and eligibility simulator\n\nImplement the two symbols E0C-002 owns. auditOpportunities walks the\npreregistered scenarios, refuses a repeated opportunity id as DOUBLE_COUNT,\nrefuses a secondary observation with no primary as SECONDARY_UNOBSERVED, and\nreturns the sorted set of metrics that actually carry a primary observation.\nsimulatePackBudget consumes that audit and answers timing and eligibility in\none verdict, so a pack cannot pass on time while failing to observe what the\nissuance contract requires.\n\nTiming is seeded. A mulberry32 stream driven by the assumptions' own integer\nseed draws one triangular sample per family per trial over 1000 trials, and\nthe raw rows are returned rather than summarised away. p90 is the empirical\n90th percentile of those rows, because the sum of triangulars has no closed\nform there.\n\nThe median is taken analytically, as the sum of the per-family medians, and\nthe two are deliberately not the same route. Every preregistered family is a\nsymmetric triangular, its mode is exactly the midpoint of its support, and a\nsum of independent symmetric variables is symmetric about the sum of its\ncentres; a continuous distribution symmetric about a point has its median at\nthat point. The analytic value is therefore exact at 40 minutes and carries no\nMonte Carlo error. The seeded p50 of the same rows lands at 40.0346, which is\n0.87 standard errors of a 1000-sample median above the true value and would\nread the 40-minute ceiling as breached on sampling noise alone. The exactness\nholds only while every family distribution stays symmetric, and that condition\nis stated at the derivation rather than left implicit.\n\ntransition_overhead is declared in specs/pack-simulation.v0.json and is\ndeliberately not added to the timing. The preregistered assumptions carry no\noverhead term and the family distributions are the only declared source of\nminutes; inventing one would be fabricated timing, which the ticket forbids.\n\nThe eligibility gates mirror specs/issuance.v0.json rather than reinventing\nit. FACTOR_COVERAGE binds F1-F4 at one scored metric each and\nFACTOR_OPPORTUNITY binds F1-F5 at two distinct opportunity ids each; the\nasymmetry is the contract's. REQUIRED_OUTCOME and REQUIRED_RECOVERY_VALUE make\nM15-M18 and M20 the scored core, while REQUIRED_SAFETY holds M19 as a separate\nterm, so the prescription path fails when the safety opportunity is absent\neven though the core is intact. The metric-to-factor table is mirrored in the\nsource because the simulator is handed the pack-simulation spec only, and\nreading a second spec from disk would make the function non-hermetic; any\ndrift from issuance.v0 is a defect in this file.\n\nThe verdict is reproducible from the input alone: the manifest digest is\nsha256 over a canonical, key-sorted encoding of the seed, both inputs, the\nderived statistics, the reason codes, and every raw row, and a second call on\nthe same input returns the same digest, median, p90 and rows.\n\nCensus pins move 37 to 40 for the two owned source files and the owned RED\nfile. Nothing the README claims present or pinned-absent moves: the pinned\nstatus line, the planned-CLI line, the ticket census, and the pinned absence\nof packages/cli and apps/cli are all unchanged, and no test pins the absence\nof packages/scorer/src/simulation.\n\nX-Ticket: E0C-002\n","ordinary_source_sha256":"0bf2f06ad99a047039d4de88b7c26d5e27d4373635a0c637a854196ab67fd973","ordinary_body_chars":3368,"ordinary_body_survives":true,"removed_trailer_count":4,"residual_record_lines_removed":0,"files_changed":1,"insertions":2,"deletions":2,"changed_paths":["tests/planning-contract.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-bed5fc386048e412","repository_id":"agent-operator-score","source_commit_sha":"c94d29d35a927fc699de4a8704512fa53e6e1915","decision_audit_anchor":"bed5fc386048e412275aac2ababf59909f2d470b5de3ba5bf87e625e5d9cb71b","ordinary_source":"docs: drop Node 20 from the D0-004 candidate required-check authority\n\nPlanning-only. No implementation file is touched.\n\nThe accepted D0-004 ticket still specifies Node 20, 22 and 24 as the exact candidate\nrequired-check set. Node 20 was removed from CI because it cannot execute this repository's\nTypeScript: its test runner does not discover .ts files at all, so it reported 199 passes\nwhere Node 24 reported 212. engines is >=22.18 <25 and the matrix is [22, 24]. The authority\ntherefore requires a job the repository can never produce, which makes online strict\nresolution of any open pull request impossible.\n\nI previously tried to fix this in the resolver first. That was the wrong order: the ticket is\nthe authority and the implementation follows it, not the reverse. This corrects the authority\nso an implementation change can then be gated against it.\n\ndocs/issues.json mirrors the ticket's operational_authority and is validated against it, so\nboth move together; the validator caught the divergence when only the ticket was edited.\n\noperational-state-offline is deliberately left in place. Its workflow is absent today because\nPR #156 reverted D0-004C, but the requirement is correct once that workflow exists, and\nremoving it here would silently drop a real gate.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"048fc3cdf9964f6f2848cda5a7af22b5c41b29866eef3b1e386b3bb4c026dfa7","ordinary_body_chars":1295,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":0,"deletions":8,"changed_paths":["docs/issues.json","docs/tickets/D0/D0-004-planning-contract-validator-and-governance-gate.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c15e92a3b1a755d4","repository_id":"agent-operator-score","source_commit_sha":"f9a62917a0964ba95e23e8a89b868caae28db356","decision_audit_anchor":"c15e92a3b1a755d431b2ce75dcf0a1b9d9fcd491413c7926631c798510665c2d","ordinary_source":"feat: render execution views and add the operational-state workflow\n\nD0-004C. Projections become rendered outputs and stop being possible inputs.\n\nscripts/render-execution-views.mjs renders the Board and a JSON view from the\ncanonical static catalog only. resolveViewInputs omits the roadmap, the Board\nand the historical ledger by construction rather than filtering them later, so\na stale or hand-edited document cannot become authority over live repository\nstate. Rendering is deterministic: no timestamp, no current SHA, no unordered\niteration, so drift between a projection and the resolver is a defect rather\nthan noise.\n\n.github/workflows/operational-state.yml runs offline strict on pull requests\nand online strict on dev pushes. Resolution jobs hold exactly contents,\nactions, checks, pull-requests and issues read. The dispatch lane replaces\nchecks:read with checks:write and nothing else, runs only from refs/heads/dev,\nand verifies the trusted workflow blob OID, a maintain-or-admin dispatch actor,\nand the candidate SHA before emitting a named check. Every job carries a\nbounded timeout. No job performs a write-token action.\n\nFourteen named RED cases were captured failing first, each for its own reason:\nthe four the ticket fixes at line 149, plus ten covering the workflow surface.\n\nCoordinated amendment inside D0-004A-owned files, bounded to the census only:\ntwo allowlist entries in scripts/validate-planning.mjs, the matching\ncontrol_plane literals 9 to 11 in tests/planning-contract.test.mjs, and the\nops:render script in the pinned surface in tests/planning/workspace-skeleton.\ntest.mjs. product_code_files stays 0.\n","ordinary_source_sha256":"d139ce39930b59ac3db546628e33fc370634330fdb9ae376994158531e4ef4ea","ordinary_body_chars":1637,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":11,"insertions":480,"deletions":10,"changed_paths":[".github/workflows/operational-state.yml","AGENTS.md","docs/planning/AOS-EXECUTION-ROADMAP.md","docs/planning/issue-resolution-ledger-2026-08-06.md","docs/tickets/BOARD.md","package.json","scripts/render-execution-views.mjs","scripts/validate-planning.mjs","tests/execution-views.test.mjs","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c20a082f262f21c8","repository_id":"agent-operator-score","source_commit_sha":"c1d8b6630e66a9dc6033567d7f7d3704e5c7ca22","decision_audit_anchor":"c20a082f262f21c8c3f7c21d6787d5e4f3f193e43b788132b1a9836e890b479f","ordinary_source":"feat: specify capability doctor output and verdict fixtures\n\nDerives the doctor verdict, exit code, ordered reasons and every projection line from\nthe capability matrix rather than reading them off the report under test. The declared\nverdict is never trusted, and the matrix the verdict is derived from is itself\nrevalidated on every call, so the pin is not fed by a free input.\n\nThe blocking rule is derived, not membership of a list: an UNAVAILABLE group blocks the\nscore exactly when its absence effects lack NOT_OBSERVED. The blocked fixture proves the\ndistinction by blocking on a group that is not one of the seven required ones.\n\nFixtures live where the ticket says they live. Putting them in the frozen document would\nhave matched all three siblings and passed every gate, but the ticket grants\nfixtures/doctor/*.json and a ticket outranks a convention. The split turned out better\nthan compliance: the document fell from 2159 to 240 lines and now carries rules and a\nthree-field manifest, while each fixture is exactly what the command prints. Nothing is\nduplicated, so nothing can drift silently -- a declared report with no file, a file no\nreport declares, a rename, content drift, and a manifest row naming the wrong matrix\nvariant each fail a named case.\n\nAdmission of fixture directories is now derived from the tickets instead of hardcoded.\nfixtures/operational-state was the only admitted directory and a second one would have\nmeant a second branch; a ticket that declares a fixture glob now admits it, and one that\nstops declaring it stops admitting it. Both directions are asserted.\n\nX-Ticket: E0B-003\n","ordinary_source_sha256":"39975b1bd887d212f0c5ece5a625163ac64ff973e444c500a6a6ebdc191b83fb","ordinary_body_chars":1620,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":11,"insertions":4520,"deletions":8,"changed_paths":["fixtures/doctor/blocked-and-imported.json","fixtures/doctor/blocked.json","fixtures/doctor/complete.json","fixtures/doctor/degraded.json","fixtures/doctor/imported-and-degraded.json","fixtures/doctor/imported-only.json","packages/schema/src/doctor-contract.ts","packages/schema/test/doctor-contract.test.ts","specs/doctor-output.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c61d7c943edd8cff","repository_id":"agent-operator-score","source_commit_sha":"40ed33efa0b693a9fbc683837b653fc26c5157bd","decision_audit_anchor":"c61d7c943edd8cffdba8a2c124db469368e2262f941771a461d88388420b006a","ordinary_source":"fix: freeze every cell's source class and restore the literal census\n\nAn adversarial review returned DO-NOT-SHIP. Two findings were real defects and both are\nfixed here; two more are real limits and are recorded rather than papered over.\n\nThe census must be pinned literally. I had reverted it to a wildcard after verifying that\ndeleting a ticket's owned files is caught by the focused-lane count guard. That test only\ncovered deletion. The review covered growth: a rogue product file plus a one-line\nownership edit passed the whole suite under the wildcard, where the literal census fails\nfour tests. Reproduced both directions before and after. This is the second time I moved\nthis line and the first time either direction was actually measured; the per-ticket edit\nis the honest price of catching unreviewed product code.\n\nThe focused-lane counts were a floor with two cases of slack, which was enough to delete\ntwo whole test cases and then neuter all five dead-field allowlists with the suite still\ngreen. They are now exact.\n\nEvery cell's source class is frozen. Only the DERIVED to RUNNER_DERIVED biconditional is\nderivable from the contract column, so PRIMARY versus SECONDARY was left free for 24 of\n28 cells, and runtime_constraint is computed from that free value. A cell reading the\nCodex app-server surface could relabel itself SECONDARY and silently drop\nprotocol_or_schema_version from its invalidation set, so an app-server schema bump would\nno longer invalidate the capability. The pin was worthless while its only input was not.\n\nX-Ticket: E0B-001\n","ordinary_source_sha256":"af8279199c65b129787e8fab66ed6dac29c0f4a9fd919017ef35b3a30eb59e4b","ordinary_body_chars":1566,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":4,"insertions":74,"deletions":6,"changed_paths":["packages/schema/src/capability.ts","packages/schema/test/capability.test.ts","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-cc76268ad4bb9a3e","repository_id":"agent-operator-score","source_commit_sha":"6a9c2c5248bf58d98274b1514bbff2121083e68c","decision_audit_anchor":"cc76268ad4bb9a3e9c2e4e4ad92b1aab588b5b6c7a8fa046d14dd57added2f51","ordinary_source":"docs: correct D0-011 ticket-owned census transition\n\nThe D0-011 ticket claimed that staging its RED file changes the\nticket-owned source census from 10 to 11, but an isolated validator run\nmeasured 13 before and 14 after. The current dev baseline reports 73\ntickets, 10 control-plane code files, and a 10-entry control-plane\nallowlist. This correction is needed now because the stale digest\ninvalidates the accepted d0-011-prerequisites batch. Phase B will create\na replacement batch and receipt.\n\nX-Ticket: D0-011\n","ordinary_source_sha256":"045d495750b8ba18b36c5d9125109a78871c7e4367f8e32fef74f7e885c7a94b","ordinary_body_chars":515,"ordinary_body_survives":true,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":1,"insertions":1,"deletions":1,"changed_paths":["docs/tickets/D0/D0-011-ticket-derived-fixture-directory-admission.md"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-ce2adee3c134ab03","repository_id":"agent-operator-score","source_commit_sha":"40ed33efa0b693a9fbc683837b653fc26c5157bd","decision_audit_anchor":"ce2adee3c134ab0397fc9c561104abd30935cb317a26ca7a53befbeec555bb8f","ordinary_source":"fix: freeze every cell's source class and restore the literal census\n\nAn adversarial review returned DO-NOT-SHIP. Two findings were real defects and both are\nfixed here; two more are real limits and are recorded rather than papered over.\n\nThe census must be pinned literally. I had reverted it to a wildcard after verifying that\ndeleting a ticket's owned files is caught by the focused-lane count guard. That test only\ncovered deletion. The review covered growth: a rogue product file plus a one-line\nownership edit passed the whole suite under the wildcard, where the literal census fails\nfour tests. Reproduced both directions before and after. This is the second time I moved\nthis line and the first time either direction was actually measured; the per-ticket edit\nis the honest price of catching unreviewed product code.\n\nThe focused-lane counts were a floor with two cases of slack, which was enough to delete\ntwo whole test cases and then neuter all five dead-field allowlists with the suite still\ngreen. They are now exact.\n\nEvery cell's source class is frozen. Only the DERIVED to RUNNER_DERIVED biconditional is\nderivable from the contract column, so PRIMARY versus SECONDARY was left free for 24 of\n28 cells, and runtime_constraint is computed from that free value. A cell reading the\nCodex app-server surface could relabel itself SECONDARY and silently drop\nprotocol_or_schema_version from its invalidation set, so an app-server schema bump would\nno longer invalidate the capability. The pin was worthless while its only input was not.\n\nX-Ticket: E0B-001\n","ordinary_source_sha256":"af8279199c65b129787e8fab66ed6dac29c0f4a9fd919017ef35b3a30eb59e4b","ordinary_body_chars":1566,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":4,"insertions":74,"deletions":6,"changed_paths":["packages/schema/src/capability.ts","packages/schema/test/capability.test.ts","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d47951eaaa562775","repository_id":"agent-operator-score","source_commit_sha":"e4563bba832d39d1851c1a229207f14f2b90e400","decision_audit_anchor":"d47951eaaa56277505cafc7f036dc42dee7d35745ccad92a8007904733791aa6","ordinary_source":"fix: refuse a catalog that cannot be trusted, and bind the board shape to it\n\nTwo ways to destroy the surfaces this renderer maintains were still open.\n\nThe catalog was accepted on faith. A file holding `null` skipped validation\nentirely and the run reported success having done nothing; a file holding an\nempty ticket list was read as a valid catalog, so write mode removed all\nseventy-one board rows and exited zero. The catalog is now checked for\nshape, for a non-empty ticket list, for the fields each record must carry,\nand for duplicate identifiers, and a failure stops before anything is\nwritten.\n\nThe block shape check accepted any Markdown table line, so an authored table\ncaptured by a moved boundary looked like content this renderer could have\nproduced and was deleted. A board block must now open with the exact header\nand separator, carry the same column count, name only identifiers the\ncatalog holds, and name none of them twice.\n\nFive cases cover the above and the three mutants that outlived the previous\nround: an absent end marker, a title that disagrees with the catalog\nidentifier, and a dependency list in the wrong order.\n\nX-Ticket: D0-004\n","ordinary_source_sha256":"ef18055226bd32f69283202e3eae1ac1a7463d82f1ce8a36a88ed7a9b9d9a2a8","ordinary_body_chars":1164,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":213,"deletions":9,"changed_paths":["scripts/render-execution-views.mjs","tests/planning-contract.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d4b46b8cf85b5425","repository_id":"agent-operator-score","source_commit_sha":"31068d7240037991ca957a92108045b10d0214d0","decision_audit_anchor":"d4b46b8cf85b54257425e8f60494818fdae52ad7dc3026bf847218f8baae1254","ordinary_source":"fix: make the declared input set enforceable and spend the checks:write grant\n\nAdversarial review of the first D0-004C commit found three defects, all real.\n\nThe renderer read `parsed.issues` while the catalog declares `tickets`, so every\nprojection rendered empty. 212 tests passed over it because\ngenerated-views-are-deterministic only compared two empty renders to each other.\nIt now reads `tickets` and asserts the full catalog rendered, so a schema drift\nthat empties the output fails instead of passing quietly. Live: 65 tickets.\n\n`resolveViewInputs` was decorative. `renderViews` never called it and\n`readCatalog` hardcoded its own path, so the three \"X-is-not-an-input\" tests\ninspected a disconnected string array — the guarantee would have survived\nchanging the renderer to read the roadmap directly. Every disk read now goes\nthrough `readDeclaredInput`, which throws on a path absent from the declared\nset, and each test asserts the throw rather than the absence. Verified\nload-bearing: deleting the check fails exactly those three tests.\n\nThe dispatch lane held `checks: write` and never created a check run, so the\ngrant had no purpose it could be justified by. It now creates the one named\ncheck on the verified candidate SHA, with an external_id binding it to this\nexact run and attempt. workflow-performs-no-write-token-action was tightened\nrather than loosened: exactly one mutating call is permitted, it must be the\ncheck-run creation, and issue, pull, contents and ref mutations stay forbidden.\n\nAlso corrected the BOARD.md banner, which claimed the renderer writes the file\nwhen it emits to stdout, and dropped an unused import.\n","ordinary_source_sha256":"1908edd4c1951cd10e7c9fd0ead154d61167e4da1e1454632d7d808a0264632d","ordinary_body_chars":1648,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":4,"insertions":120,"deletions":52,"changed_paths":[".github/workflows/operational-state.yml","docs/tickets/BOARD.md","scripts/render-execution-views.mjs","tests/execution-views.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-dd4a74ba2b628991","repository_id":"agent-operator-score","source_commit_sha":"cc67b62673392d764f257422ee313b2853aa7ed2","decision_audit_anchor":"dd4a74ba2b628991f1b5d4f8a8a3d4290e3b60a2f2a39deea8c94f2893fc12cf","ordinary_source":"feat: freeze M01-M20 metric registry\n\nEncodes the 20 Metric Scoring Contract v1 records as frozen data in specs/metrics.v0.json\nand adds packages/schema/src/metric-registry.ts as the executable contract that refuses a\nregistry which drifts from them.\n\nM10 regret and M20 distance are derived from the frozen route table and frontier rather\nthan read from the vector, so a caller-supplied selected_regret, maximum_regret,\ndistance_to_frontier, or maximum_distance is rejected as INVALID instead of scored.\n\nThe census gate is amended so product code is admitted only where an accepted atomic\nticket claims it by exact path. There is no standing product-code allowlist to edit;\nan unowned source file still fails closed, proven both ways in this branch.\n\nX-Ticket: E0A-001\n","ordinary_source_sha256":"255f8917fac53d5c8c4b9be16928bbc9d24f291d8a4c9adca004bb1b82adb9b7","ordinary_body_chars":771,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":7,"insertions":3854,"deletions":8,"changed_paths":["packages/schema/package.json","packages/schema/src/metric-registry.ts","packages/schema/test/metric-registry.test.ts","scripts/validate-planning.mjs","specs/metrics.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-e0d8d11b190e4e26","repository_id":"agent-operator-score","source_commit_sha":"31068d7240037991ca957a92108045b10d0214d0","decision_audit_anchor":"e0d8d11b190e4e26e0d62253b6812cad463dc7ac11e9d55b6f1bbe7fbd0e2572","ordinary_source":"fix: make the declared input set enforceable and spend the checks:write grant\n\nAdversarial review of the first D0-004C commit found three defects, all real.\n\nThe renderer read `parsed.issues` while the catalog declares `tickets`, so every\nprojection rendered empty. 212 tests passed over it because\ngenerated-views-are-deterministic only compared two empty renders to each other.\nIt now reads `tickets` and asserts the full catalog rendered, so a schema drift\nthat empties the output fails instead of passing quietly. Live: 65 tickets.\n\n`resolveViewInputs` was decorative. `renderViews` never called it and\n`readCatalog` hardcoded its own path, so the three \"X-is-not-an-input\" tests\ninspected a disconnected string array — the guarantee would have survived\nchanging the renderer to read the roadmap directly. Every disk read now goes\nthrough `readDeclaredInput`, which throws on a path absent from the declared\nset, and each test asserts the throw rather than the absence. Verified\nload-bearing: deleting the check fails exactly those three tests.\n\nThe dispatch lane held `checks: write` and never created a check run, so the\ngrant had no purpose it could be justified by. It now creates the one named\ncheck on the verified candidate SHA, with an external_id binding it to this\nexact run and attempt. workflow-performs-no-write-token-action was tightened\nrather than loosened: exactly one mutating call is permitted, it must be the\ncheck-run creation, and issue, pull, contents and ref mutations stay forbidden.\n\nAlso corrected the BOARD.md banner, which claimed the renderer writes the file\nwhen it emits to stdout, and dropped an unused import.\n","ordinary_source_sha256":"1908edd4c1951cd10e7c9fd0ead154d61167e4da1e1454632d7d808a0264632d","ordinary_body_chars":1648,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":4,"insertions":120,"deletions":52,"changed_paths":[".github/workflows/operational-state.yml","docs/tickets/BOARD.md","scripts/render-execution-views.mjs","tests/execution-views.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-e238e7785a6466b5","repository_id":"agent-operator-score","source_commit_sha":"cc67b62673392d764f257422ee313b2853aa7ed2","decision_audit_anchor":"e238e7785a6466b57b1bc4e027aa158224b9ecb5ade12945b2075bb403d2c7a9","ordinary_source":"feat: freeze M01-M20 metric registry\n\nEncodes the 20 Metric Scoring Contract v1 records as frozen data in specs/metrics.v0.json\nand adds packages/schema/src/metric-registry.ts as the executable contract that refuses a\nregistry which drifts from them.\n\nM10 regret and M20 distance are derived from the frozen route table and frontier rather\nthan read from the vector, so a caller-supplied selected_regret, maximum_regret,\ndistance_to_frontier, or maximum_distance is rejected as INVALID instead of scored.\n\nThe census gate is amended so product code is admitted only where an accepted atomic\nticket claims it by exact path. There is no standing product-code allowlist to edit;\nan unowned source file still fails closed, proven both ways in this branch.\n\nX-Ticket: E0A-001\n","ordinary_source_sha256":"255f8917fac53d5c8c4b9be16928bbc9d24f291d8a4c9adca004bb1b82adb9b7","ordinary_body_chars":771,"ordinary_body_survives":true,"removed_trailer_count":14,"residual_record_lines_removed":0,"files_changed":7,"insertions":3854,"deletions":8,"changed_paths":["packages/schema/package.json","packages/schema/src/metric-registry.ts","packages/schema/test/metric-registry.test.ts","scripts/validate-planning.mjs","specs/metrics.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-e2c33042f79e2776","repository_id":"agent-operator-score","source_commit_sha":"1fdd0c88b37ec3adaafa6c28251092b782c3d589","decision_audit_anchor":"e2c33042f79e27768e2fd80fbf355c29399b8489ab8dacf7b7bd6f54d4c64f5d","ordinary_source":"fix: derive every issuance verdict instead of trusting the document\n\nEncodes all ten SSOT 6.1 issuance gates as frozen data in specs/issuance.v0.json and adds\npackages/schema/src/issuance-contract.ts, which derives each candidate's verdict from its\nown observations instead of believing the verdict the document declares.\n\nCoverage alone never issues a score. Fourteen eligible metrics and 70% evidence coverage\nare necessary but not sufficient: a document claiming a coverage-only candidate is\nissuable is rejected and names the exact gate it lied about.\n\nNOT_OBSERVED is never a zero. It leaves the eligibility denominator rather than entering\nit as a failure, so missing adapter data is reported as missing evidence and never as\noperator failure. INVALID is excluded the same way but stays distinguishable from it.\n\nAn adversarial review returned DO-NOT-SHIP on the first attempt and every serious finding\nwas real. The declared-verdict comparison was bypassable: padding expected.failed_gates\nwith one unknown or duplicated entry disabled the only check comparing declared against\nderived issuability, so a document could declare a NOT_OBSERVED candidate issuable, which\nis precisely what this ticket exists to prevent. A negative coverage denominator passed\nthe 70% gate because cross-multiplication was never sign-normalised. metric_id was\nunconstrained, so the fourteen-metric minimum could be forged with invented metrics. Two\ngates read caller-declared fields instead of the evidence: factor opportunities came from\na declared list, and the safety opportunity from a declared boolean. The four prose fields\nwere presence-checked only, so the frozen document was non-binding.\n\nAll of those are now derived or pinned, and twenty-four mutations of the validator each\nfail at least one test. An S2 or S3 safety verdict now withholds issuance, which SSOT 6.3\nrequires and the first attempt did not implement.\n\nX-Ticket: E0A-002\n","ordinary_source_sha256":"03366980a1e288cda301fbc478acb6066f4c3f5ffb150d248a01ba3cf04544bd","ordinary_body_chars":1932,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":6,"insertions":505,"deletions":277,"changed_paths":["docs/tickets/E0-A/E0A-002-freeze-eligibility-and-score-issuance-predicate.md","packages/schema/src/issuance-contract.ts","packages/schema/test/issuance-contract.test.ts","specs/issuance.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-e3aa102492b031b1","repository_id":"agent-operator-score","source_commit_sha":"55afd506e018e2087df55fe192925c573f18685a","decision_audit_anchor":"e3aa102492b031b17493982c9241170b6f3b1863e8e18080e12762e253737afe","ordinary_source":"feat: freeze formula, factor, safety and display precision contract\n\nEncodes SSOT 6.2 through 6.6 as frozen data in specs/scoring.v0.json and adds\npackages/schema/src/scoring-contract.ts, which derives every index, factor, safety\nverdict and displayed score from per-metric observations rather than reading a declared\nresult. The published worked example is reproduced from its inputs, not asserted: the\nvector carries only observations, from which the contract computes O, P and the raw score\nand arrives at the published display value.\n\nAll arithmetic is exact rationals in lowest terms through a single overflow-checked\nchoke point. The harmonic mean, the zero rule, the nearest-five display rounding and the\nfixed outcome weights are each derived and compared, so a document cannot declare a score\nits own inputs do not produce.\n\nM19 never enters the mean. A vector that places it in the scored metric set is rejected\noutright, and an S2 or S3 verdict withholds the score regardless of every other value.\n\nX-Ticket: E0A-003\n","ordinary_source_sha256":"559b4fb90295babe00158b64782fc9d89023c487f9d743b274e5392610c587ce","ordinary_body_chars":1028,"ordinary_body_survives":true,"removed_trailer_count":16,"residual_record_lines_removed":0,"files_changed":4,"insertions":5144,"deletions":0,"changed_paths":["docs/tickets/E0-A/E0A-003-freeze-formula-factor-safety-and-display-precision-contract.md","packages/schema/src/scoring-contract.ts","packages/schema/test/scoring-contract.test.ts","specs/scoring.v0.json"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-e7587b2b65750306","repository_id":"agent-operator-score","source_commit_sha":"e18a8b9156260b04c66eaacb91a1d607a277b77c","decision_audit_anchor":"e7587b2b65750306c08cff733f9963dc6e64fca32e0e0161652b4a1a8bcd7d95","ordinary_source":"fix: make the metric registry actually refuse contract drift\n\nAn independent adversarial review returned DO-NOT-SHIP on cc67b62. The arithmetic\nlayer was verified sound -- all 82 canonical vectors recomputed from the contract with\nzero divergence -- but the validator accepted 25 registries that violate the contract,\nand 12 of its own guards were unprotected by any test.\n\nThe frozen artifact also contradicted itself: 15 metrics declared the grader output\ntheir contract row names, while their vectors carried an invented {key,total} shape,\nand the validator enforced the invented side. Encoding the contract correctly was\nrejected. Every vector now emits exactly the fields its contract row names, and each\nvalue is re-derived rather than trusted.\n\nNewly refused, each covered by a regression: a rewritten per-opportunity formula, M11\nat denominator 5, minimum_opportunities zeroed, a reversed evidence precedence, an\noperator claim at confidence 1.0, swapped or extra consumer routes, M19 averaged into\nthe process index, registry-level learned weights, a hidden oracle answer or grader\ndiscretion field smuggled into a vector, a NOT_OBSERVED vector carrying a payload, a\nrational not in lowest terms, a numerator selected by JSON key order, and a \"pass\"\nfixture made vacuous so it exercises nothing.\n\nThe census test asserted a property no implementation could violate: deleting the whole\ngate left it green. It now binds to the validator's own census output and proves\nselectivity against a real unclaimed file written into the skeleton and removed again.\nBoth parses use the same ticket-file filter, and an ASCII hyphen or en dash no longer\nsilently drops an ownership claim.\n\nX-Ticket: E0A-001\n","ordinary_source_sha256":"4e79a0c9549dcf6356603a82739f6f4ff73fed0dcd87699262fa1344ee4fa379","ordinary_body_chars":1702,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":6,"insertions":633,"deletions":241,"changed_paths":["docs/tickets/E0-A/E0A-001-freeze-m01-m20-metric-registry.md","packages/schema/src/metric-registry.ts","packages/schema/test/metric-registry.test.ts","scripts/validate-planning.mjs","specs/metrics.v0.json","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-ece19dc4cef7c803","repository_id":"agent-operator-score","source_commit_sha":"06865631132afbd8f13a29b82215e0257eb12e37","decision_audit_anchor":"ece19dc4cef7c803c569de6e532b3fae1c2b265056144e3289d481749bd689a9","ordinary_source":"feat: freeze prescription input formulas and missing rules\n\nEncode source events, a total formula, a closed range, an explicit\nmissing rule, a tie-break, one fixture and the contract version for\nconfidence, normalized gap, opportunity count, treatment cost,\npermission delta, expected uplift and transferability. The validator\nderives every fixture and refuses a missing formula, an out-of-range\nvalue, an unknown source and version drift.\n\nCensus pins move 14 to 16 for the two materialized owned source files.\nFocused-lane counts increment by the new test file.\n\nX-Ticket: E0D-001\n","ordinary_source_sha256":"22acbfbbc4cd52906e409d4849e14c7b8da259496f63e8cb2ef1e22c41dad6b6","ordinary_body_chars":583,"ordinary_body_survives":true,"removed_trailer_count":2,"residual_record_lines_removed":0,"files_changed":3,"insertions":614,"deletions":2,"changed_paths":["packages/schema/src/prescription-input.ts","specs/prescription-inputs.v0.json","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-f691593763c944c4","repository_id":"agent-operator-score","source_commit_sha":"814c6e7cd19035cd1a70997c2a5ff74b39d5ef8d","decision_audit_anchor":"f691593763c944c4be56e4b5d137c021980a96e3c19b604acbbd764bcfd244b8","ordinary_source":"feat: freeze eligibility and score-issuance predicate\n\nEncodes all ten SSOT 6.1 issuance gates as frozen data in specs/issuance.v0.json and\nadds packages/schema/src/issuance-contract.ts, which derives each candidate's verdict\nfrom its evidence instead of believing the verdict the document declares.\n\nCoverage alone never issues a score. Fourteen eligible metrics and 70% evidence\ncoverage are necessary but not sufficient: a document claiming a coverage-only\ncandidate is issuable is rejected and names the exact gate it lied about.\n\nNOT_OBSERVED is never a zero. It leaves the eligibility denominator rather than\nentering it as a failure, so missing adapter data is reported as missing evidence and\nnever as operator failure.\n\nThe census gate added by E0A-001 admitted both new product files with no census edit\nat all, which is what it was built for. Its output is no longer pinned literally,\nbecause the ticket-owned list grows with every product ticket; the list is instead\nbound to an independent re-derivation in the skeleton test, which fails if the two\nparses ever diverge.\n\nX-Ticket: E0A-002\n","ordinary_source_sha256":"5b99a47459d68b89f6a6977be15b47b99faab8e293c35f0c223de325fcaa65e2","ordinary_body_chars":1102,"ordinary_body_survives":true,"removed_trailer_count":13,"residual_record_lines_removed":0,"files_changed":5,"insertions":854,"deletions":3,"changed_paths":["packages/schema/src/issuance-contract.ts","packages/schema/test/issuance-contract.test.ts","specs/issuance.v0.json","tests/planning-contract.test.mjs","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-f83f6dbc19155e50","repository_id":"agent-operator-score","source_commit_sha":"e18a8b9156260b04c66eaacb91a1d607a277b77c","decision_audit_anchor":"f83f6dbc19155e500edffc978e5789888581263f46b75c874a562a480c483dbc","ordinary_source":"fix: make the metric registry actually refuse contract drift\n\nAn independent adversarial review returned DO-NOT-SHIP on cc67b62. The arithmetic\nlayer was verified sound -- all 82 canonical vectors recomputed from the contract with\nzero divergence -- but the validator accepted 25 registries that violate the contract,\nand 12 of its own guards were unprotected by any test.\n\nThe frozen artifact also contradicted itself: 15 metrics declared the grader output\ntheir contract row names, while their vectors carried an invented {key,total} shape,\nand the validator enforced the invented side. Encoding the contract correctly was\nrejected. Every vector now emits exactly the fields its contract row names, and each\nvalue is re-derived rather than trusted.\n\nNewly refused, each covered by a regression: a rewritten per-opportunity formula, M11\nat denominator 5, minimum_opportunities zeroed, a reversed evidence precedence, an\noperator claim at confidence 1.0, swapped or extra consumer routes, M19 averaged into\nthe process index, registry-level learned weights, a hidden oracle answer or grader\ndiscretion field smuggled into a vector, a NOT_OBSERVED vector carrying a payload, a\nrational not in lowest terms, a numerator selected by JSON key order, and a \"pass\"\nfixture made vacuous so it exercises nothing.\n\nThe census test asserted a property no implementation could violate: deleting the whole\ngate left it green. It now binds to the validator's own census output and proves\nselectivity against a real unclaimed file written into the skeleton and removed again.\nBoth parses use the same ticket-file filter, and an ASCII hyphen or en dash no longer\nsilently drops an ownership claim.\n\nX-Ticket: E0A-001\n","ordinary_source_sha256":"4e79a0c9549dcf6356603a82739f6f4ff73fed0dcd87699262fa1344ee4fa379","ordinary_body_chars":1702,"ordinary_body_survives":true,"removed_trailer_count":15,"residual_record_lines_removed":0,"files_changed":6,"insertions":633,"deletions":241,"changed_paths":["docs/tickets/E0-A/E0A-001-freeze-m01-m20-metric-registry.md","packages/schema/src/metric-registry.ts","packages/schema/test/metric-registry.test.ts","scripts/validate-planning.mjs","specs/metrics.v0.json","tests/planning/workspace-skeleton.test.mjs"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-02764fbf10ceedc1","repository_id":"logic-pro-mcp","source_commit_sha":"04175eb3920b2c6c04605e0d82a7a5ebbcae5a48","decision_audit_anchor":"02764fbf10ceedc1e046e3c23ed6277e4a9d6de540a20b3958171e19cb705068","ordinary_source":"fix(#490): the Japanese metronome control is one compound label\n\nVerified on a Japanese Logic rather than inferred: switching the application to\nJapanese and enumerating the control bar's 90 checkboxes gives the metronome as\nメトロノームクリック — a single compound string, not either half.\n\nMatching here is .exactStrict, so a set carrying only メトロノーム and クリック\nmatches nothing and the control cannot be located on a Japanese install. Play 再生,\nRecord 録音 and Cycle サイクル were exactly right.\n\n.exactStrict stays. A containment match would find this control through クリック but\nwould equally let an unrelated label containing 再生 be taken for Play, which is the\nlocale collision the policy exists to prevent. The label was wrong, not the mode.\n\nBoth halves are kept: Logic uses bare クリック on other surfaces, and a label that\ncosts nothing to carry should not be dropped on the strength of one build.\n\nThe new test asserts the compound string and, as a control, that a longer unrelated\nstring does not match. Removing メトロノームクリック fails it.\n","ordinary_source_sha256":"ba717cf889100e5b67b61e68976472760366a0cd49c7f070de2915bc1a3f6411","ordinary_body_chars":1019,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":22,"deletions":1,"changed_paths":["Sources/LogicProMCP/Accessibility/AXLocalePolicy.swift","Tests/LogicProMCPTests/AXLocalePolicyTests.swift"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-0d2959b1d2bbcec0","repository_id":"logic-pro-mcp","source_commit_sha":"491d168584d2915b3dd7bbe353ba33ce387e2bb1","decision_audit_anchor":"0d2959b1d2bbcec0a2738339480b24d9c4704ecb83b4a59d279d3de0749cf21d","ordinary_source":"fix(#590): the project chooser is not an open document\n\nCloses #590\n\nA freshly launched Logic shows \"Choose a Project\". `project.new`'s open-document precondition counted\nraw AX windows, so that chooser WAS an open document and the operation refused:\n\n {\"error\":\"unsupported_state\",\"failure_stage\":\"precondition_open_document\",\n \"observed_window_count\":1,\n \"hint\":\"project.new requires Logic to have no open document; 1 window(s) are open. …\"}\n\nThere was no open document. This is the state every first-time caller is in, and it needs no unusual\nconfiguration at all — only a Logic that was launched and not yet given a project. Measured in\nEnglish and in Korean, so it is not a locale defect either.\n\nThe recovery hint made it worse: it said to run project.close with confirmation, and from this state\nthere is nothing to close. A caller following it is sent somewhere else.\n\nWHAT DID NOT CHANGE\n\nThe precondition's own reasoning, which is right: with a real document open, a newly created\nproject's window cannot be told apart from the ones already on screen. A chooser does not create\nthat ambiguity. It is titled, it is not a project, and driving File > New with it still on screen was\nmeasured to create the project anyway.\n\nSo the count now excludes chooser windows, using the classifier the codebase already had —\n`isProjectPickerWindow`, which `getTrackHeaders` uses for exactly this reason and which already\ncarries both the English and the Korean window titles. The envelope now reports both numbers, so a\nreader can see that a chooser on screen was not the reason for a refusal.\n\nMEASURED BEFORE AND AFTER, ON THE SAME HOST\n\nThe run quits Logic, waits for the chooser, and only then calls the operation — a harness that\nstarted from an open project would exercise a different branch and pass while measuring nothing.\nWith the fix, six checks pass and a project appears. With the count restored to raw windows and the\nrelease binary rebuilt:\n\n failure_stage 'precondition_open_document' all_windows 1 documents 1\n before ['Choose a Project'] after ['Choose a Project']\n\nNo project created. That is the defect, reproduced live from the same script.\n\nTWO THINGS THE RUN HAD TO HANDLE, BOTH RECORDED RATHER THAN HIDDEN\n\nA fresh launch on this host raises Logic's own single-button audio-interface alert, and `project.new`\nrefuses on it at a different stage (`preflight_blocking_dialog`). That refusal is defensible and is\nnot what this change is about, so the alert is acknowledged before the test and the run says which\nalert it was.\n\nQuitting can be refused by a sheet Logic has open: a freshly created project leaves its \"New Track\"\nchooser up, and `quit` then does nothing while the process stays alive. The shutdown escapes a sheet\nonce and asks again, and the precondition judges whether Logic actually stopped rather than whether\na quit was sent.\n","ordinary_source_sha256":"d7af8f7d5491d2d3807e3a6c2573b03cc446419aa436d12a120b6bc882a33206","ordinary_body_chars":2884,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":3,"insertions":299,"deletions":2,"changed_paths":["Scripts/livekit/live_590_project_new_from_cold_launch.py","Sources/LogicProMCP/Channels/AccessibilityChannel+Project.swift","Tests/LogicProMCPTests/Issue516DirectProjectCreationTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-0e840c8816f442f7","repository_id":"logic-pro-mcp","source_commit_sha":"491d168584d2915b3dd7bbe353ba33ce387e2bb1","decision_audit_anchor":"0e840c8816f442f7bd775b1f90bf9d2b64dde94e33bff0d6030e6200d8cb7709","ordinary_source":"fix(#590): the project chooser is not an open document\n\nCloses #590\n\nA freshly launched Logic shows \"Choose a Project\". `project.new`'s open-document precondition counted\nraw AX windows, so that chooser WAS an open document and the operation refused:\n\n {\"error\":\"unsupported_state\",\"failure_stage\":\"precondition_open_document\",\n \"observed_window_count\":1,\n \"hint\":\"project.new requires Logic to have no open document; 1 window(s) are open. …\"}\n\nThere was no open document. This is the state every first-time caller is in, and it needs no unusual\nconfiguration at all — only a Logic that was launched and not yet given a project. Measured in\nEnglish and in Korean, so it is not a locale defect either.\n\nThe recovery hint made it worse: it said to run project.close with confirmation, and from this state\nthere is nothing to close. A caller following it is sent somewhere else.\n\nWHAT DID NOT CHANGE\n\nThe precondition's own reasoning, which is right: with a real document open, a newly created\nproject's window cannot be told apart from the ones already on screen. A chooser does not create\nthat ambiguity. It is titled, it is not a project, and driving File > New with it still on screen was\nmeasured to create the project anyway.\n\nSo the count now excludes chooser windows, using the classifier the codebase already had —\n`isProjectPickerWindow`, which `getTrackHeaders` uses for exactly this reason and which already\ncarries both the English and the Korean window titles. The envelope now reports both numbers, so a\nreader can see that a chooser on screen was not the reason for a refusal.\n\nMEASURED BEFORE AND AFTER, ON THE SAME HOST\n\nThe run quits Logic, waits for the chooser, and only then calls the operation — a harness that\nstarted from an open project would exercise a different branch and pass while measuring nothing.\nWith the fix, six checks pass and a project appears. With the count restored to raw windows and the\nrelease binary rebuilt:\n\n failure_stage 'precondition_open_document' all_windows 1 documents 1\n before ['Choose a Project'] after ['Choose a Project']\n\nNo project created. That is the defect, reproduced live from the same script.\n\nTWO THINGS THE RUN HAD TO HANDLE, BOTH RECORDED RATHER THAN HIDDEN\n\nA fresh launch on this host raises Logic's own single-button audio-interface alert, and `project.new`\nrefuses on it at a different stage (`preflight_blocking_dialog`). That refusal is defensible and is\nnot what this change is about, so the alert is acknowledged before the test and the run says which\nalert it was.\n\nQuitting can be refused by a sheet Logic has open: a freshly created project leaves its \"New Track\"\nchooser up, and `quit` then does nothing while the process stays alive. The shutdown escapes a sheet\nonce and asks again, and the precondition judges whether Logic actually stopped rather than whether\na quit was sent.\n","ordinary_source_sha256":"d7af8f7d5491d2d3807e3a6c2573b03cc446419aa436d12a120b6bc882a33206","ordinary_body_chars":2884,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":3,"insertions":299,"deletions":2,"changed_paths":["Scripts/livekit/live_590_project_new_from_cold_launch.py","Sources/LogicProMCP/Channels/AccessibilityChannel+Project.swift","Tests/LogicProMCPTests/Issue516DirectProjectCreationTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-129a3640dab8b53d","repository_id":"logic-pro-mcp","source_commit_sha":"38df9665586d5f5e5ed28367dc706dbbe5fb6f99","decision_audit_anchor":"129a3640dab8b53d3c406392aebe6b9c2bc6a871f33b53f58375359c1373c1a8","ordinary_source":"Merge main into fix/425-coordinate-free-plugin-insert\n\nThree conflicts, all in the plug-in insert path, resolved as semantic merges rather\nthan by taking a side:\n\n- clickPopupPluginLeaf: main added the strict AXEnabled guard and a coordFree\n parameter with a coordinate branch; this branch removes the coordinate branch\n entirely. Kept the guard, kept the coordinate-free body, dropped the parameter —\n a disabled entry must still be refused before actuation, and that is orthogonal\n to how the pick is performed.\n- menuItemEnabledForActuation survives; visibleSubmenu and preferredFormatLeaf do\n not, because they exist only to serve the coordinate branch this branch removes.\n- The fixture conflict is a union: main's line enabling gainItem is now required by\n the strict guard, and this branch's fixtures exercise the leaf discriminator.\n","ordinary_source_sha256":"ddafb92bf695dcdefc2eb115578177ed0b91cc0011a5bb11b3d518deec665259","ordinary_body_chars":847,"ordinary_body_survives":true,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":20,"insertions":840,"deletions":41,"changed_paths":["Sources/LogicProMCP/Accessibility/FrontmostGate.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+MarkerDelete.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+Transport.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+VerifiedPlugins.swift","Sources/LogicProMCP/Channels/AccessibilityChannel.swift","Sources/LogicProMCP/Channels/CGEventChannel.swift","Sources/LogicProMCP/Channels/RoutingTable.swift","Sources/LogicProMCP/Dispatchers/TargetRefResolution.swift","Sources/LogicProMCP/Dispatchers/TrackDispatcher+RecordSequence.swift","Sources/LogicProMCP/Resources/ResourceHandlers+StateReaders.swift","Sources/LogicProMCP/Utilities/HonestContract.swift","Sources/LogicProMCP/Utilities/ProcessUtils.swift","Tests/LogicProMCPTests/DispatcherTests.swift","Tests/LogicProMCPTests/Issue254MarkerSurfaceTests.swift","Tests/LogicProMCPTests/Issue440TransportFrontmostTests.swift","Tests/LogicProMCPTests/Issue476TracksReadabilityTests.swift","Tests/LogicProMCPTests/Issue479RecordSequenceEndBarTests.swift","Tests/LogicProMCPTests/PluginInsertVerifiedTests.swift","Tests/LogicProMCPTests/TargetRefResolutionTests.swift","Tests/LogicProMCPTests/VersionedCacheEnvelopeTests.swift"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-132048855f4d7a5d","repository_id":"logic-pro-mcp","source_commit_sha":"ae0a3776a2acca4f0bc569be942ae104b9371550","decision_audit_anchor":"132048855f4d7a5dc807f400fe92dc0f264cb4de81491201a4b2606018eb7d89","ordinary_source":"fix(#604): a save_as refusal must say what it saw and must not leave the panel up\n\nTwo changes, both about the refusal rather than the classifier. The classifier itself is untouched:\nI could not establish a better rule than the one that ships, and shipping a guess would be worse than\nshipping the diagnosis.\n\nWHAT WAS OBSERVED\n\n`project.save_as` returned \"Exact Save As dialog did not appear within 3 seconds\". Timed from the\nmenu click, the panel appears in 0.75s. So the budget was never the problem and the message sent the\nreader to the wrong place — the same shape as the message #594 fixed, where a cause that was never\nmeasured was stated as an observation.\n\nWhat actually happens is that `exactSaveAsDialog` does not classify the panel that is on screen. With\nthe refusal now reporting what it saw, one clause of seven fails:\n\n title \"Save\" save_buttons 1 save_enabled true cancel_buttons 1\n package_radios 1 folder_radios 1\n filename_fields 0 <- the rule requires exactly 1\n\nA rule with seven conjuncts that reports one bit cannot be diagnosed from its own output. It now\nreports every candidate window's shape, so the next person sees the failing clause instead of\nguessing at timing.\n\nTHE REFUSAL USED TO WEDGE EVERY LATER OPERATION\n\nThe timeout path returned before `dismissDialog` is even defined, so the panel stayed up. Measured in\none run afterwards: two further `save_as` calls, `project.new`, and the plugin operations all\ncame back `preflight_blocking_dialog` on a \"Save\" window that exposes no buttons a caller can answer\nwith (`dialog_buttons: []`). Escape is the only thing that clears it, and the refusal does that now.\n\nWHY THE CLASSIFIER IS UNCHANGED\n\nThe count is where it fails, and I could not learn why with enough confidence to change it. Two\nreaders disagree about that panel: AppleScript's `entire contents` finds 156 text fields described\n\"text field\" at depth 8 and one at depth 2, while this code's own `findAllDescendants` finds ZERO at\ndepth 12. A shallow search and an ancestor-based filter were both tried against the live panel and\nboth still produced 0, so neither is the rule.\n\nWhatever the panel's real shape is through this reader, it is not what either of my candidate rules\nassumed, and a fix that \"works\" without explaining that disagreement would be a coincidence. The\nmeasurement is filed on the issue; this change makes the failure legible so the next attempt starts\nfrom data instead of from a timing hypothesis.\n","ordinary_source_sha256":"b5320628f9594212d8bb91ce89f179738fbf60517ba5b7ce4e885d98deea5a22","ordinary_body_chars":2518,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":260,"deletions":1,"changed_paths":["Scripts/livekit/live_604_refusal_says_what_it_saw.py","Sources/LogicProMCP/Channels/AccessibilityChannel+Project.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-218954b5ef6d08d7","repository_id":"logic-pro-mcp","source_commit_sha":"2f69abb3409b0583bc65888e6f48dc51b77f104c","decision_audit_anchor":"218954b5ef6d08d79222b9fb5fc2d2f238c2f1e9f67f14f0d3dd0dd85f0ad355","ordinary_source":"fix(#576): neither an absent nor a legacy payload may claim coverage it was never given\n\nTwo fail-opens, one principle: silence is not coverage.\n\n`RegionInventoryPayload.isComplete` returned `complete ?? true`, so a payload saying nothing about\nits own reach marked the region cache exhaustively read. Both production callers feed that value\nstraight into `cache.updateRegions(complete:)`.\n\n`decodeInventoryPayload` was worse, because it was not a default but an assertion: for the legacy\nbare-array wire shape it synthesised `complete: true, scope: \"project\"` — a whole-project inventory\nclaim invented on behalf of input that claimed nothing.\n\nThe second one is why the first was not enough on its own. An adversarial review put it as a\ndilemma the earlier version of this commit could not answer both ways: if legacy input is\nunreachable then flipping the default is dead code, and if it is reachable then the flip missed the\npath that still fail-opens. It was the second. The legacy branch now reports no coverage and no\nscope, and says which shape it came from.\n\nNeither is covered by the existing suite by construction — every prior test either sets `complete`\nexplicitly or never decodes the bare-array shape, so no amount of running them would have reached\neither path.\n","ordinary_source_sha256":"1d087d86b7608757393a2d33df883f31a55f0cb8176926c2ecb39b3f7f93b97a","ordinary_body_chars":1278,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":3,"insertions":104,"deletions":9,"changed_paths":["Scripts/livekit/live_576_completeness_is_measured.py","Sources/LogicProMCP/State/StateModels.swift","Tests/LogicProMCPTests/Issue576MeasuredCompletenessTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-25eb689fdb9ad98b","repository_id":"logic-pro-mcp","source_commit_sha":"2da2f7a182090306f4b172003b78fe41c2978c2d","decision_audit_anchor":"25eb689fdb9ad98b3c66a15184c12b42ec73547692adb7451aaed6eb3a1636fa","ordinary_source":"chore(#575): retire three table entries whose channels refuse them\n\nThree rows named a channel that has no case for them: the MCU output-volume setter, the mixer\nbus-route getter, and the automation parameter getter. Each falls to its channel's `default` arm —\n`Unknown MCU operation` / `Unsupported AX operation` — so a caller who found one would have reached\nan exhausted chain.\n\nThat is a stronger case than the two system entries retired earlier, which at least named a channel\nthat would have answered: these three had no caller AND no implementation.\n\nVerified live through the running server before removal, not only by grep: each answers\n`invalid_params` under every plausible tool spelling.\n\nAn independent review read both channel execute switches, the router, the mixer dispatcher, the\npoller, the resource handlers, the workflow catalog, the operation and capability registries, the\ndoctor checks, and the route, capability and bypass suites. It confirmed per operation, with line\nnumbers, that no case exists in the destination channel, and traced every consumer: the table count\nassertion goes 140 to 137 against a floor of 80, the registry spec count is untouched because none\nwas ever registered, and the advertised-operation route test is unchanged because none was ever\nadvertised.\n\nPrefix neighbours are pinned untouched, in a unit test against the table and in the live harness\nagainst the running server. The live probe deliberately calls a neighbour with a parameter it\nrejects: proving it survives does not require moving the user's master volume, and the discriminator\nis the hint rather than the error code, since a live command and a retired one both answer\ninvalid_params.\n\nFive of #575's twelve are now gone. The seven region entries remain: those ARE implemented, so\nexposing or retiring them is a decision that overlaps #302, not dead weight to sweep.\n","ordinary_source_sha256":"95eb93ff95e532624bc749377e98d1e385cbf2f9cf24f424ca8cb650cbbdc55e","ordinary_body_chars":1882,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":4,"insertions":86,"deletions":10,"changed_paths":["Scripts/livekit/live_575_retired_routes_change_nothing.py","Sources/LogicProMCP/Channels/RoutingTable.swift","Tests/LogicProMCPTests/Issue567LocalizedOwnerNameTests.swift","docs/roadmap/roadmap-2026-08-10.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-2714c211175c4737","repository_id":"logic-pro-mcp","source_commit_sha":"45d6a4b6cf029c4306c19b7a1974f939a0c73299","decision_audit_anchor":"2714c211175c473730f2a34d1b9992734026f8aa9788ede7d39f7b8a873c5650","ordinary_source":"feat(#291): read a channel strip's output destination, and stop claiming its sends\n\nFirst shippable slice of ADR-008. Not the graph — see below for why.\n\n`ChannelStripState.output` has been on the model since it was written and NOTHING ever set it.\n`defaultGetMixerState` populated trackIndex, volume, pan and plugins and left input, output and sends\nuntouched, so `logic://mixer` published an `output` field that was null on every strip of every\nproject. A consumer could not tell \"not routed\" from \"never read\", because the field never carried\neither.\n\nWHAT IS READ NOW, AND WHAT IS STILL NOT\n\nMeasured on Logic Pro 12.3, English:\n\n output slot AXButton, help \"Output slot. Click and hold to choose the channel strip output…\",\n and its AXDescription carries the destination — \"Stereo Output\"\n send slot AXButton, described only as \"send button\"; an empty one exposes no AXValue, no\n AXValueDescription and no AXTitle at all\n\nAn output can be read. A send destination cannot. So outputs are read and sends are not claimed —\nwhich is the asymmetry ADR-008's `complete` and `partialReason` exist for.\n\nThe reader matches the slot by its help string, so the send button sitting beside it, whose help also\ntalks about sending a signal to an aux, cannot be published as a destination. Only the English rendering is\nrecorded and the variants list is deliberately empty: on a Logic in another language the reader\nyields nothing, so a caller sees an absent output rather than a wrong one. That list grows when a\nlocale is observed, not when one is translated.\n\nSENDS WERE BEING PUBLISHED AS EMPTY, WHICH IS A CLAIM\n\n`sends` was `[SendState] = []`, so every strip serialised `\"sends\": []` while nothing had ever\npopulated it. That reads as \"this strip has no sends\"; the truth was \"nobody looked\". It is optional\nnow and absent until something reads it — and when a send list IS read, an empty one then genuinely\nmeans \"looked, and there are none\". Nothing in the tree consumed the field.\n\nWHY NOT THE GRAPH\n\nThe ADR-008 graph type is present, tested, behind a default-off flag, and built by nothing. It wants bus\nNUMBERS and typed edges, and the roadmap's measured obstacle for this issue is that a display string\ncannot be a node id — the strip says `Bus 1` where the menu says `Sum 1`. A graph assembled from this\nreader would be a list of display strings with no bus numbers and no send edges, which would look\nlike the ADR surface without being one. Filling the field the resource has published as null since\nthe model was written, and refusing to invent sends, is the slice that matches what is in the tree.\n\nA BLIND REVIEW FOUND THE HOLE IN MY OWN TESTS\n\nThe unit tests called the reader directly, so deleting the wiring line from `defaultGetMixerState`\nleft the entire suite green — the only thing pinning it was a live run. There is now a test that goes\nthrough the real readback against the 12.3 fixture, and removing that line reddens it and nothing\nelse.\n\nTHE HARNESS WAS WRONG FOUR TIMES, EACH TIME BLAMING THE PRODUCT\n\nIt called `logic_mixer.get_state`, which is not a registered command. It read the payload from `data`\nwhen it arrives under `strips`. Its \"is the mixer open\" detector counted the toolbar's AXCheckBox,\nthen the Inspector's two-strip area — both of which the product deliberately refuses as a mixer — so\nit concluded the pane was open, read an empty list, and reported the feature as broken. And the View\nmenu entry is a toggle that does not say which way it will go: with the pane already open, one click\nclosed it, and the looser detector called that success.\n\nIt now asks the product the question the product already answers (`data_source`), requires a FRESH\npoll rather than accepting a stale cache as \"open\", judges the toggle by its outcome and tries once\nmore, records the cache age as provenance instead of presenting a cached read as live, and compares\nevery published destination against the set of slot descriptions the witness read — not against\nwhichever slot the window walk happened to see first, which can be the Inspector's.\n","ordinary_source_sha256":"66e7950f45efb0bb83d493970ccafe4601548dc10e68b660f564a8227915dc1c","ordinary_body_chars":4111,"ordinary_body_survives":true,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":6,"insertions":538,"deletions":1,"changed_paths":["Scripts/livekit/live_291_output_slot_is_read.py","Sources/LogicProMCP/Accessibility/AXLocalePolicy.swift","Sources/LogicProMCP/Accessibility/AXLogicProElements+Mixer.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+Mixer.swift","Sources/LogicProMCP/State/StateModels.swift","Tests/LogicProMCPTests/Issue291OutputSlotReadTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-2756fbb39f4afc15","repository_id":"logic-pro-mcp","source_commit_sha":"2fe9cac6c9413e5615644a6a01368191e63f2441","decision_audit_anchor":"2756fbb39f4afc159022e76048ae7b29c636baca0bb94fd6b088790ff14fb75f","ordinary_source":"fix(#575): stop move_to_playhead certifying a region the caller never asked about\n\n`defaultMoveSelectedRegionToPlayhead` reads \"the selected region\" before the Edit > Move > To\nPlayhead click and again after it, then returned State A whenever the post-read's start bar sat on\nthe playhead. Nothing required the two reads to be about the SAME region.\n\nSo a selection that drifted during the click could reach State A on a region nobody asked about,\npurely because that region happens to sit on the playhead. State A means performed AND independently\nverified; this one was verified against a subject it never established.\n\n`startBar` cannot be the identity that decides it — that is the property the operation exists to\nchange. The gate now requires the same name and the same track index, and treats a `trackIndex` of\n-1 as what it is: the enumeration saying it could not place the region against any track header,\nwhich is a readback gap and not a match. Both new branches return State B `readback_mismatch` with\n`region_name` and `post_region_name` on the envelope, so a caller can tell \"it did not move\" from\n\"something else moved\".\n\nWHY BOTH FIELDS, MEASURED\n\nName alone would not have been enough. On the probe project all twenty regions are named\n\"MIDI Region\", so any one of them could have certified any other. That is Logic's naming, not this\nproject's: a project of uniquely named regions would have left a name-only check defensible, and the\nmeasurement could have come out that way. It did not.\n\nWHAT THE LIVE RUN COVERS, AND WHAT IT DOES NOT\n\nThe operation is reachable from no tool, so no live call reaches the changed branch, and the\nevidence document says so instead of implying a coverage it does not have. The branch is covered by\nunit tests, including a mutation (`sameRegion = true`) that reddens only the two new drift tests and\nnothing else.\n\nWhat the run adds is the part a unit test cannot reach: the region enumeration this handler leans on\nstill works against the real application, every region resolves to a real track so the second half\nof the gate has a value to compare, and the reachable surface is undisturbed.\n\nRegistering this operation is the next step and is deliberately not in this change. It is a\nverified-write mutating operation, so it needs an entry in the semantic oracle table — a governed\nartifact whose phase increments record when each contract was pinned — and that belongs in a change\nthat can be reviewed as oracle work rather than as a rider on a soundness fix.\n","ordinary_source_sha256":"4ac190bbd49839f7cca95581d3a1014ce86dbfb3712b31275cf21a59eda964cf","ordinary_body_chars":2513,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":3,"insertions":258,"deletions":1,"changed_paths":["Scripts/livekit/live_575_move_to_playhead_identity.py","Sources/LogicProMCP/Channels/AccessibilityChannel+Regions.swift","Tests/LogicProMCPTests/AccessibilityChannelRegionStateATests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-277e883c8a9d3eec","repository_id":"logic-pro-mcp","source_commit_sha":"0c4ada8960af2069afcff8759c29d76f03954b3b","decision_audit_anchor":"277e883c8a9d3eecb6167ca85eae26fc81713f7f29f22c9a7f5081668533ae79","ordinary_source":"fix(#538): AXModal absence is a window declining to answer, not a window saying no\n\nThe blocking predicate had already moved from a subrole allowlist to `AXModal`, because measured on\nLogic 12.3 the Go To Position window is `AXFloatingWindow` with `AXModal == true` and no allowlist\ncould classify it. That move was right and the reading around it was not: `attributeUnsupported`\nand `noValue` both continued past the window, and a malformed successful payload became `nil` and\nfollowed the same path. Apple documents `AXModal` as recommended rather than required for windows,\nso its absence is not proof of `false` — the same guess as the subrole list, one attribute over.\n\nA window that will not say whether it is modal now makes the observation unreadable rather than\nclean, which is enough to stop it certifying State A without turning every unreadable window into a\nhard blocker.\n\nRemoving the causal claim from `performed` left `project.new` with an unreachable success path:\nit still required `outcome.performed` while sheet actions unconditionally return false, so a\nproject that was created — sheet gone, one track readable — returned State B and the router\nsurfaced a hard `channels_exhausted`. The gate now rests on what can be observed, the sheet gone\nplus a positive track count, rather than restoring the causal claim.\n\nThe alert and menu witnesses had the same causation gap as the sheet witness and are bound the same\nway, and the confirmation scan no longer re-resolves the main window independently.\n","ordinary_source_sha256":"e5204274c26cd504727a845465bb0377a53a1f56f0c10791834fa8875fc712b8","ordinary_body_chars":1518,"ordinary_body_survives":true,"removed_trailer_count":4,"residual_record_lines_removed":0,"files_changed":7,"insertions":562,"deletions":209,"changed_paths":["Sources/LogicProMCP/Accessibility/AXHelpers.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+ModalReconcile.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+Project.swift","Tests/LogicProMCPTests/AccessibilityChannelTests.swift","Tests/LogicProMCPTests/Issue453AlertAcknowledgeBindingTests.swift","Tests/LogicProMCPTests/Issue538MenuWitnessHonestyTests.swift","Tests/LogicProMCPTests/Issue538ModalWitnessTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-2853e493f4781414","repository_id":"logic-pro-mcp","source_commit_sha":"a2bb006fa68c4ad8a4e34506b76cc372db6fdc43","decision_audit_anchor":"2853e493f478141484fb550754fc388802b29f7b30303cf5bb5c118da9de899a","ordinary_source":"test(#519): drive a region operation on a Logic running in Korean\n\n#519's outstanding acceptance criterion was that a REGION operation be shown to succeed on a Logic in\nanother language. It could not be met until two things merged: `region.move_to_playhead` was\nimplemented and reachable from no tool, and on a fresh launch the project chooser counted as an open\ndocument, so a Korean project could not be opened at all.\n\n 편집 > 이동 > 재생헤드로\n state A · verified · 'MIDI 리전' · track 1 · bar 1 -> 9 · playhead 9\n\nSeven checks, five of them mutation-backed, and the machine put back afterwards.\n\nTHE EXPECTED LABELS COME FROM THE PRODUCT, NOT FROM THIS FILE\n\nA harness that hard-codes the Korean string and compares it to the live menu proves that this file\nand Logic agree. The claim that matters is that the PRODUCT's label sets are right, so the expected\nstrings are parsed out of AXLocalePolicy.swift at run time and the live menus are checked against\nthose. Editing a LabelSet is now visible here.\n\nThat check could have failed. Logic's Korean renderings are not derivable from the English — this\nrepository already records New = 신규, not the 새로 만들기 a translation produces.\n\nTWO THINGS THIS RUN REFUSES TO TAKE ON TRUST\n\nWhether Logic is actually in Korean is decided by reading its menu bar, not by reading back the\nsetting the run just wrote. The first version of this file did stop on exactly that: Logic came up in\nEnglish, the precondition caught it, and the run failed instead of testing English and filing it as\nKorean evidence.\n\nThe cause was in the shutdown. It pressed Escape and then looked for the discard button - but Escape\nCANCELS the save prompt, so the sequence defeated itself, Logic stayed running, and `open -a` on a\nrunning application does nothing, which left the old language in place. The dialog is now inspected\nbefore anything is sent to it, and the quit is asserted before the language is switched: a quit that\nwas merely SENT is not a Logic that stopped.\n\nWHAT THIS EVIDENCE DOES NOT CARRY\n\nNo visual assertion and no independent AX reader. The region's position after the move is taken from\nthe operation's own envelope, cross-checked only by the localized menu path having resolved. The\nEnglish run in `live_575_move_to_playhead_reachable.py` is the one that holds a second instrument\nagainst the same operation - Logic's own help string read by a separate tool, plus a band of the\narrange area that has to change. This run is about the LANGUAGE, and it says so rather than implying\na coverage it does not have.\n","ordinary_source_sha256":"564201faa7a507f0712ec9642e3998617997f1100fdd443264fe99bc9b3333d6","ordinary_body_chars":2546,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":1,"insertions":349,"deletions":0,"changed_paths":["Scripts/livekit/live_519_region_op_on_a_localized_logic.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-29c6beda0309a747","repository_id":"logic-pro-mcp","source_commit_sha":"45d6a4b6cf029c4306c19b7a1974f939a0c73299","decision_audit_anchor":"29c6beda0309a747fe1fdd6cb2a3e9ebb8bd264476d95d9d79275a79a639784c","ordinary_source":"feat(#291): read a channel strip's output destination, and stop claiming its sends\n\nFirst shippable slice of ADR-008. Not the graph — see below for why.\n\n`ChannelStripState.output` has been on the model since it was written and NOTHING ever set it.\n`defaultGetMixerState` populated trackIndex, volume, pan and plugins and left input, output and sends\nuntouched, so `logic://mixer` published an `output` field that was null on every strip of every\nproject. A consumer could not tell \"not routed\" from \"never read\", because the field never carried\neither.\n\nWHAT IS READ NOW, AND WHAT IS STILL NOT\n\nMeasured on Logic Pro 12.3, English:\n\n output slot AXButton, help \"Output slot. Click and hold to choose the channel strip output…\",\n and its AXDescription carries the destination — \"Stereo Output\"\n send slot AXButton, described only as \"send button\"; an empty one exposes no AXValue, no\n AXValueDescription and no AXTitle at all\n\nAn output can be read. A send destination cannot. So outputs are read and sends are not claimed —\nwhich is the asymmetry ADR-008's `complete` and `partialReason` exist for.\n\nThe reader matches the slot by its help string, so the send button sitting beside it, whose help also\ntalks about sending a signal to an aux, cannot be published as a destination. Only the English rendering is\nrecorded and the variants list is deliberately empty: on a Logic in another language the reader\nyields nothing, so a caller sees an absent output rather than a wrong one. That list grows when a\nlocale is observed, not when one is translated.\n\nSENDS WERE BEING PUBLISHED AS EMPTY, WHICH IS A CLAIM\n\n`sends` was `[SendState] = []`, so every strip serialised `\"sends\": []` while nothing had ever\npopulated it. That reads as \"this strip has no sends\"; the truth was \"nobody looked\". It is optional\nnow and absent until something reads it — and when a send list IS read, an empty one then genuinely\nmeans \"looked, and there are none\". Nothing in the tree consumed the field.\n\nWHY NOT THE GRAPH\n\nThe ADR-008 graph type is present, tested, behind a default-off flag, and built by nothing. It wants bus\nNUMBERS and typed edges, and the roadmap's measured obstacle for this issue is that a display string\ncannot be a node id — the strip says `Bus 1` where the menu says `Sum 1`. A graph assembled from this\nreader would be a list of display strings with no bus numbers and no send edges, which would look\nlike the ADR surface without being one. Filling the field the resource has published as null since\nthe model was written, and refusing to invent sends, is the slice that matches what is in the tree.\n\nA BLIND REVIEW FOUND THE HOLE IN MY OWN TESTS\n\nThe unit tests called the reader directly, so deleting the wiring line from `defaultGetMixerState`\nleft the entire suite green — the only thing pinning it was a live run. There is now a test that goes\nthrough the real readback against the 12.3 fixture, and removing that line reddens it and nothing\nelse.\n\nTHE HARNESS WAS WRONG FOUR TIMES, EACH TIME BLAMING THE PRODUCT\n\nIt called `logic_mixer.get_state`, which is not a registered command. It read the payload from `data`\nwhen it arrives under `strips`. Its \"is the mixer open\" detector counted the toolbar's AXCheckBox,\nthen the Inspector's two-strip area — both of which the product deliberately refuses as a mixer — so\nit concluded the pane was open, read an empty list, and reported the feature as broken. And the View\nmenu entry is a toggle that does not say which way it will go: with the pane already open, one click\nclosed it, and the looser detector called that success.\n\nIt now asks the product the question the product already answers (`data_source`), requires a FRESH\npoll rather than accepting a stale cache as \"open\", judges the toggle by its outcome and tries once\nmore, records the cache age as provenance instead of presenting a cached read as live, and compares\nevery published destination against the set of slot descriptions the witness read — not against\nwhichever slot the window walk happened to see first, which can be the Inspector's.\n","ordinary_source_sha256":"66e7950f45efb0bb83d493970ccafe4601548dc10e68b660f564a8227915dc1c","ordinary_body_chars":4111,"ordinary_body_survives":true,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":6,"insertions":538,"deletions":1,"changed_paths":["Scripts/livekit/live_291_output_slot_is_read.py","Sources/LogicProMCP/Accessibility/AXLocalePolicy.swift","Sources/LogicProMCP/Accessibility/AXLogicProElements+Mixer.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+Mixer.swift","Sources/LogicProMCP/State/StateModels.swift","Tests/LogicProMCPTests/Issue291OutputSlotReadTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-29c79faa31cc4fe2","repository_id":"logic-pro-mcp","source_commit_sha":"f77d13a5970a531d41e9f27aae032dd38fe54ad7","decision_audit_anchor":"29c79faa31cc4fe24e1a0b5055b449cecc3f35448983805ca0dd4ecef2696dc3","ordinary_source":"fix(#576): measure the region inventory's completeness instead of asserting it is never complete\n\n`defaultGetRegions` published `complete: false` on every successful read. Safe, but uninformative —\nand it made every consumer fail closed forever, which is why `midi.import_file` could not tell \"no\nregion\" from \"no region visible\".\n\nIt is now derived from the TRACK HEADERS rather than from the regions, and that distinction is the\nwhole point: a track carrying no regions produces no entry, so the highest observed `trackIndex` says\nnothing about the tracks above it. `allTrackHeaders` is not viewport-limited — measured on Logic 12.3,\n21 of 21 while the region layer stopped at 13 — so \"every header lies inside the visible bounds\"\nanswers the question directly.\n\nThe header bounds test is deliberately NOT `isVisibleArrangeRegion`, which returns true when either\nframe is unreadable. Failing open is right when deciding whether to include a region it can see, and\nwrong here: an unreadable header would inflate a completeness claim, which is the direction that lets\nan absence be published as proof.\n\nZero headers is not completeness. `0 == 0` would make an unreadable arrangement report as\nexhaustively read; the guard is mutation-tested on its own.\n\nThe payload now also carries the denominator — `track_headers` and `track_headers_in_viewport` — so a\ncaller can see how far short a read fell rather than only that it did.\n\nLive, on one project, driving the arrange window's Vertical Zoom slider (a write with a readback,\nunlike `nav.zoom_to_fit`, which is a blind key command):\n\n zoom 0.6 complete false headers 21 in-viewport 6 regions 6\n zoom 0.0 complete true headers 21 in-viewport 21 regions 20\n\nThe second row is also why regions cannot be the denominator: 21 tracks visible, 20 carrying a region.\n\nBoth directions are required by the live harness. A run that only ever saw `false` cannot tell a\nmeasured field from the constant it replaced.\n","ordinary_source_sha256":"a1a3b7507b482f2349e4acd0a7efa9373f07b9cfe7fcdaaac4dad6254f4c3928","ordinary_body_chars":1977,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":4,"insertions":333,"deletions":5,"changed_paths":["Scripts/livekit/live_576_completeness_is_measured.py","Sources/LogicProMCP/Channels/AccessibilityChannel+Regions.swift","Sources/LogicProMCP/State/StateModels.swift","Tests/LogicProMCPTests/Issue576MeasuredCompletenessTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-2aee6afaad42b119","repository_id":"logic-pro-mcp","source_commit_sha":"38df9665586d5f5e5ed28367dc706dbbe5fb6f99","decision_audit_anchor":"2aee6afaad42b11985ba0d6afb542a450202f7f222309b09e9aa91ffca45800a","ordinary_source":"Merge main into fix/425-coordinate-free-plugin-insert\n\nThree conflicts, all in the plug-in insert path, resolved as semantic merges rather\nthan by taking a side:\n\n- clickPopupPluginLeaf: main added the strict AXEnabled guard and a coordFree\n parameter with a coordinate branch; this branch removes the coordinate branch\n entirely. Kept the guard, kept the coordinate-free body, dropped the parameter —\n a disabled entry must still be refused before actuation, and that is orthogonal\n to how the pick is performed.\n- menuItemEnabledForActuation survives; visibleSubmenu and preferredFormatLeaf do\n not, because they exist only to serve the coordinate branch this branch removes.\n- The fixture conflict is a union: main's line enabling gainItem is now required by\n the strict guard, and this branch's fixtures exercise the leaf discriminator.\n","ordinary_source_sha256":"ddafb92bf695dcdefc2eb115578177ed0b91cc0011a5bb11b3d518deec665259","ordinary_body_chars":847,"ordinary_body_survives":true,"removed_trailer_count":9,"residual_record_lines_removed":0,"files_changed":20,"insertions":840,"deletions":41,"changed_paths":["Sources/LogicProMCP/Accessibility/FrontmostGate.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+MarkerDelete.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+Transport.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+VerifiedPlugins.swift","Sources/LogicProMCP/Channels/AccessibilityChannel.swift","Sources/LogicProMCP/Channels/CGEventChannel.swift","Sources/LogicProMCP/Channels/RoutingTable.swift","Sources/LogicProMCP/Dispatchers/TargetRefResolution.swift","Sources/LogicProMCP/Dispatchers/TrackDispatcher+RecordSequence.swift","Sources/LogicProMCP/Resources/ResourceHandlers+StateReaders.swift","Sources/LogicProMCP/Utilities/HonestContract.swift","Sources/LogicProMCP/Utilities/ProcessUtils.swift","Tests/LogicProMCPTests/DispatcherTests.swift","Tests/LogicProMCPTests/Issue254MarkerSurfaceTests.swift","Tests/LogicProMCPTests/Issue440TransportFrontmostTests.swift","Tests/LogicProMCPTests/Issue476TracksReadabilityTests.swift","Tests/LogicProMCPTests/Issue479RecordSequenceEndBarTests.swift","Tests/LogicProMCPTests/PluginInsertVerifiedTests.swift","Tests/LogicProMCPTests/TargetRefResolutionTests.swift","Tests/LogicProMCPTests/VersionedCacheEnvelopeTests.swift"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-304262d2dae79858","repository_id":"logic-pro-mcp","source_commit_sha":"ee239623abaa6686875d481a5bc6a74ecf4165ae","decision_audit_anchor":"304262d2dae798585b69014c395d9fe47d026e6411a6bfdeef174837fc91518e","ordinary_source":"docs(#369): the plan-time model does not accommodate stems either — second correction\n\nThe previous commit removed this ticket's \"blocked\" flag because `ProjectExportExecutor` already runs\nthe Honest Contract per artifact. That finding is right and it stands.\n\nIt was also incomplete, in the same way and for the same reason: I answered a question about\n`ProjectExportPlanner` without opening it.\n\n let url = outputRoot.appendingPathComponent(\"\\(safeProject)-\\(kind).wav\").standardizedFileURL\n let exists = existingPath != nil\n\nOne artifact is one KNOWN PATH, computed at plan time, with `exists`, the collision policy and the\ncontainment check all resolved before anything runs. A stem run breaks every one of those: N files\ninstead of one, names assigned by Logic (`_1.aif`) rather than by the plan, `.aif` rather\nthan the `.wav` the model assumes, and `would_overwrite` unevaluable for names that do not exist yet.\n\n`export_plan` is a DRY RUN whose job is to tell the caller what will be written. For stems it cannot,\nand that is a property of a published contract rather than an implementation detail.\n\nSo the ticket splits. T1 is the AX drive and stands alone — it can be built and live-proven without\ntouching the planner. Wiring it into `export_run artifacts:[stem]` waits on one question: what an\nartifact plan promises when the names arrive late, and what `fail_if_exists` means then.\n\nTwo corrections in two revisions, both from answering about a file without opening it. Left in the\nrecord rather than tidied, because the shape of the mistake is the part worth keeping.\n","ordinary_source_sha256":"fed8c8151c9fa9d1312e917cd39515838a7ff571804a5377e7ae1580c06b8a84","ordinary_body_chars":1599,"ordinary_body_survives":true,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":2,"insertions":55,"deletions":4,"changed_paths":["docs/tickets/issue-369-per-track-stem-export/STATUS.md","docs/tickets/issue-369-per-track-stem-export/T1-drive-the-export-panel.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-30b8d25980ce48a3","repository_id":"logic-pro-mcp","source_commit_sha":"f77d13a5970a531d41e9f27aae032dd38fe54ad7","decision_audit_anchor":"30b8d25980ce48a39bc9420f36f9151cccc94b39a338f39a4f248365f7736f11","ordinary_source":"fix(#576): measure the region inventory's completeness instead of asserting it is never complete\n\n`defaultGetRegions` published `complete: false` on every successful read. Safe, but uninformative —\nand it made every consumer fail closed forever, which is why `midi.import_file` could not tell \"no\nregion\" from \"no region visible\".\n\nIt is now derived from the TRACK HEADERS rather than from the regions, and that distinction is the\nwhole point: a track carrying no regions produces no entry, so the highest observed `trackIndex` says\nnothing about the tracks above it. `allTrackHeaders` is not viewport-limited — measured on Logic 12.3,\n21 of 21 while the region layer stopped at 13 — so \"every header lies inside the visible bounds\"\nanswers the question directly.\n\nThe header bounds test is deliberately NOT `isVisibleArrangeRegion`, which returns true when either\nframe is unreadable. Failing open is right when deciding whether to include a region it can see, and\nwrong here: an unreadable header would inflate a completeness claim, which is the direction that lets\nan absence be published as proof.\n\nZero headers is not completeness. `0 == 0` would make an unreadable arrangement report as\nexhaustively read; the guard is mutation-tested on its own.\n\nThe payload now also carries the denominator — `track_headers` and `track_headers_in_viewport` — so a\ncaller can see how far short a read fell rather than only that it did.\n\nLive, on one project, driving the arrange window's Vertical Zoom slider (a write with a readback,\nunlike `nav.zoom_to_fit`, which is a blind key command):\n\n zoom 0.6 complete false headers 21 in-viewport 6 regions 6\n zoom 0.0 complete true headers 21 in-viewport 21 regions 20\n\nThe second row is also why regions cannot be the denominator: 21 tracks visible, 20 carrying a region.\n\nBoth directions are required by the live harness. A run that only ever saw `false` cannot tell a\nmeasured field from the constant it replaced.\n","ordinary_source_sha256":"a1a3b7507b482f2349e4acd0a7efa9373f07b9cfe7fcdaaac4dad6254f4c3928","ordinary_body_chars":1977,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":4,"insertions":333,"deletions":5,"changed_paths":["Scripts/livekit/live_576_completeness_is_measured.py","Sources/LogicProMCP/Channels/AccessibilityChannel+Regions.swift","Sources/LogicProMCP/State/StateModels.swift","Tests/LogicProMCPTests/Issue576MeasuredCompletenessTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-5a1a7e7a347c6cc0","repository_id":"logic-pro-mcp","source_commit_sha":"83b75171eb2e5a0881b184c07bea08b2e9168dab","decision_audit_anchor":"5a1a7e7a347c6cc061b05b4faafb29599d30166f45094ff883dba2e7c4ef8e9d","ordinary_source":"feat(#291): read a channel strip's input source, and refuse the toggle beside it\n\nSame shape as the output slice, on the field that was still null.\n\n`ChannelStripState.input` had never been set by anything either. Measured on Logic Pro 12.3 with an\naudio track present:\n\n input slot AXButton, help \"Input slot. Choose the channel strip input source…\",\n description carries the source — \"Input 1\"\n input monitoring AXButton, help \"Input Monitoring button. Hear incoming signal…\",\n description \"monitoring\"\n\nThe monitoring button sits on the same strip and its help BEGINS with the same word. A match on\n\"input\" alone publishes a toggle as a signal source — so the keyword is the full phrase \"input slot\",\nand there is a test whose fixture lists the monitoring button FIRST so a loosened match returns it.\nRestoring the bare word reddens exactly that test.\n\nA software-instrument strip has no input slot at all, which is why this needed an audio track to\nmeasure and why `nil` there is the truth. The reader cannot tell that case from \"could not look\", and\nthe doc comment says so rather than papering over it — callers treat an absent input as unknown.\n\nOnly the English help string is measured; the empty variants list is the same fail-closed choice the\noutput reader made. On another locale the reader yields nothing, so a caller sees an absent input\nrather than a wrong one.\n\nThe two readers now share one walk. A second copy would be a second place for \"found the slot and it\nnamed nothing\" to be decided differently, and that case is the whole reason the walk returns nil\ninstead of an empty string.\n\nLIVE\n\nThirteen checks, four mutation-backed. The run reads Logic's own slots with a second instrument and\nrequires every published source to be one of the strings that instrument saw on an input slot — not\nmerely non-null, and not the monitoring button's description. It also asserts the monitoring button\nis really there on the same strip, so the hazard the keyword guards against is confirmed rather than\nassumed.\n","ordinary_source_sha256":"4aabbfdaa8986974359a2eeb2a77a146db0c1dac4a2902b7a4e0214d70fef6ad","ordinary_body_chars":2085,"ordinary_body_survives":true,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":5,"insertions":475,"deletions":5,"changed_paths":["Scripts/livekit/live_291_input_slot_is_read.py","Sources/LogicProMCP/Accessibility/AXLocalePolicy.swift","Sources/LogicProMCP/Accessibility/AXLogicProElements+Mixer.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+Mixer.swift","Tests/LogicProMCPTests/Issue291OutputSlotReadTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-632dec3f10f1e65b","repository_id":"logic-pro-mcp","source_commit_sha":"f8d26e41658f6eddd10d881262d04e5b671972b9","decision_audit_anchor":"632dec3f10f1e65bacaee0d08e6547cc68eda7c57b7fca4e76582ce426c8c00f","ordinary_source":"fix(#594): the first import into a new project, and an error that says what it saw\n\nCloses #594\n\n`record_sequence` imports a Standard MIDI File through Logic's Open panel. After the go-to-folder\nfield accepted the path, the code polled the Import button into an enabled state for 20 x 200ms and\ngave up.\n\nFour seconds is enough for a WARM panel and not for the first one in a freshly created document.\nMeasured five times across two locales: every failure was the first import after project.new, and\nevery retry seconds later reached State A. That is the opening move an agent makes — create a\nproject, record something — so the operation was failing at first contact and working for anyone who\nignored its error, which is the wrong lesson to teach. The budget is now 60 x 200ms.\n\nTHE MESSAGE WAS THE OTHER HALF\n\n IMPORT_BTN_ERROR: Import button never became enabled (file not selected)\n\n\"(file not selected)\" is a cause this code never checked. It is what the code inferred from the\nbutton not enabling, stated as though it had been observed — so a caller could not tell a slow panel\nfrom a wrong path, and this operation's whole contract is that it does not assert what it did not\nsee. The loop now records whether it saw the panel and whether it saw the button, and the failure\nnames which of the three actually happened.\n\nI wrote that message with a duration in it first — \"stayed disabled for 12s\" — which is the same\ndefect one layer down: the code does not measure elapsed time, it counts iterations. The number came\nout wrong the moment a mutation changed the budget, which is how it was caught.\n\nWHAT THE LIVE RUN SHOWS, AND WHAT THE MUTATION ACTUALLY DID\n\nThe run closes any open document, creates a project, and imports IMMEDIATELY — no warm-up call,\nbecause the first one is the whole point. Six checks pass.\n\nThe mutation is not the tidy one the fix suggests, and the evidence document says so. Restoring the\noriginal 20 x 200ms budget did NOT reproduce the failure on that attempt; the panel was warm enough\nby then. Cutting the poll to a single iteration DOES redden the first-import check and only that one,\nwhich establishes the check is sensitive to the poll rather than passing for an unrelated reason.\n\nSo the case for widening rests on five recorded failures with the old budget and none with the new,\nnot on a reproduction under mutation. An intermittent defect is not made deterministic by wanting it\nto be, and the document should not imply otherwise.\n\nTWO THINGS THE HARNESS HAD TO LEARN ABOUT LOGIC\n\nLogic's save prompt is its OWN window, not a sheet on the document. An earlier version of this\nharness put it in the document list and then tried to close the prompt as if it were a project, six\ntimes over.\n\nThat window also exposes no buttons to Accessibility — `dialog_buttons: []` — and\n`first window whose name is \"Save\"` fails with an invalid-index error while that exact name sits in\nthe window list. It cannot be addressed by name or answered by button. Escape dismisses it; nothing\nelse available to this run does. So the shutdown drives project.close, which is the right instrument\nand refuses while a modal is present, and escapes between attempts.\n","ordinary_source_sha256":"6b2a2be0723ceec174bba82d1bc7ed55fc4c111755005d8a85d147291cd34697","ordinary_body_chars":3188,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":259,"deletions":3,"changed_paths":["Scripts/livekit/live_594_first_import_after_project_new.py","Sources/LogicProMCP/Channels/AccessibilityChannel+MIDIImport.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-67ab88f48731b3f1","repository_id":"logic-pro-mcp","source_commit_sha":"18a3ce11fb1d62e35cbc1b51b09328beb0bbedf9","decision_audit_anchor":"67ab88f48731b3f1454b956ca54dd2453d92f2d24cbc66da316662d5b7a6c2c5","ordinary_source":"feat(#448): read whether a track is a stack, and whether it is collapsed\n\nThe roadmap parks #448 in Wave 6 as an expected scope decision, on the reading that stack hierarchy\nis not exposed. Measured on Logic Pro 12.3 today, half of that is wrong.\n\nA track header carries an AXDisclosureTriangle when — and only when — it is the main track of a\ntrack stack. Logic's own help text on the element says so: \"Track stack disclosure arrow. Show or\nhide subtracks. Use the controls on the main track to control all subtracks in the track stack.\"\nExactly one of the 46 layout items in the arrange window carried one.\n\nSo `logic://tracks` now reports `is_stack_header` and `stack_collapsed`. Driven live on the probe\nproject, disclosing that stack moved the arrangement from 21 track headers to 44 and back, with the\narrow's AXValue tracking 0 -> 1 -> 0 and both published fields following it. Collapsed: one row says\nit is a stack and says it is closed. Disclosed: the same row — matched by track name, not by list\nposition — says it is open, and each of the 23 subtracks that appeared says it is not a stack and\ncarries no collapsed state at all.\n\nAbsences are kept as absences, and each is mutation-tested. A header whose children will not read\nreports neither field. A header among whose children one will not identify itself is not called\n\"not a stack\" — that path used a role reader that collapses every failure into nil, which would have\npublished an absence as a claim in the one function written to refuse exactly that. A disclosure\nvalue that is neither 0 nor 1 is left uninterpreted rather than truncated into an answer. A stack\nwhose value will not read reports the half it knows. A plain header reports no collapsed state.\n\nThe two new fields also survive the wire as VALUES: the pre-existing round-trip left both nil, and\nnil is omitted on both sides, so it would have passed unchanged had the keys been dropped.\n\nWHAT THE ARROW DOES NOT DO, AND A CLAIM I HAD TO WITHDRAW\n\nAn earlier draft of this commit said AXPress on the arrow actuates it. That was wrong. Measured\nthrough System Events and through a direct in-process AXUIElementPerformAction alike, the press\nanswers .success and the value does not move; the same press on the Mute checkbox beside it also\nmoves nothing, so the control is not the caller. AXValue reports settable: false. What actuates the\narrow is Logic's own Edit menu entry, which names the operation it will perform.\n\nThe claim survived a first reading because the return code said the press had worked. This is the\nthird finding in this repository of an Accessibility call that reports success and changes nothing,\nand the reason the live harness judges every actuation on the arrow MOVING rather than on the call\nreturning.\n\nColour remains unreadable. A track header exposes thirteen attributes and none of them is colour;\nscanning all 987 elements of the arrange window found no attribute whose name contains \"Color\" at\nall. The scope decision this issue expects narrows to colour and reorder.\n\nTWO DEFECTS IN MY OWN VERIFICATION, BOTH FOUND BY DISBELIEVING A GREEN\n\nThe first version of these tests passed against all three mutations. The assertions compared an\nOptional to nil inside #expect, which does not work on this toolchain in either direction:\n`.some(false) == nil` reports true, and `nil != nil` also reports true. The same comparison on\nString? and Int? is correct, and the same comparison on Bool? computed in an ordinary function and\nhanded to #expect as a plain Bool is correct. The bug is in the macro expansion.\n\n`Scripts/ci-forbid-dead-expect.sh` states this in prose and has no pattern for it, because a textual\nscanner cannot separate Optional from Optional and this suite has hundreds of the\nlatter where the comparison is live. So the fact is pinned as something that runs\n(`DeadOptionalBoolComparisonTests`) rather than as a comment: if the toolchain is fixed, that suite\ngoes red and the projections written around the bug can be reconsidered. A workaround with no expiry\ncondition outlives its reason.\n\nThe second defect: the mutation runs were reading a stale build. Writing the source and immediately\ninvoking `swift test` reused the previous artifact, so a mutation that had genuinely landed in the\nfile reported green. With `touch` plus an explicit `swift build --build-tests` first, all mutations\nfail, each reddening only its own test.\n","ordinary_source_sha256":"81957b1bac651e40aaeb90a5feeae96c5de5908f8596ec0ee8851fa252b2a74f","ordinary_body_chars":4421,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":8,"insertions":933,"deletions":2,"changed_paths":["Scripts/livekit/ax_stack_arrow.swift","Scripts/livekit/live_448_track_stack_readback.py","Sources/LogicProMCP/Accessibility/AXValueExtractors.swift","Sources/LogicProMCP/Dispatchers/TrackDispatcher.swift","Sources/LogicProMCP/State/StateModels.swift","Tests/LogicProMCPTests/DeadOptionalBoolComparisonTests.swift","Tests/LogicProMCPTests/Issue448TrackStackReadbackTests.swift","Tests/LogicProMCPTests/StateModelsCodableTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-710b1008c427461f","repository_id":"logic-pro-mcp","source_commit_sha":"3edbb497686cb8a0897e066a1bc1c494b209c11d","decision_audit_anchor":"710b1008c427461f6e32b64981248fa0ab3e4e8ad82e25438fe2d6e88d8faa29","ordinary_source":"fix(#290): an ordinal write refuses a strip list that was not read whole\n\n`stripEnumeration` has always counted the mixer children whose role would not read, and every caller\nthrew that count away. Its own comment says what the count is for:\n\n A child whose role is unreadable is dropped by the filter, and every later strip then moves down\n one. Callers address strips by ORDINAL, so a request for track 0 would act on physical strip 1 —\n a wrong-target write that no downstream readback can catch, because the readback reads the same\n shifted list.\n\n`mixer.insert_plugin` is such a caller, it is registered, and it is a WRITE:\n\n let strips = mixerChannelStrips(in: mixer, …)\n let strip = strips[track]\n\nSo the hazard was measured, counted, and discarded at every call site — including the one that acts\non the operator's project. It now refuses with State C and `write_attempted: false` when any mixer\nchild would not report a role, and the envelope carries the count so the refusal can be acted on.\n\nThis is ADR-007's rule at the one place it is already measurable: resolve exactly, or refuse. The\nselector resolver that rule belongs to is in the tree, tested, behind a default-off flag, and called\nby nothing — that remains true, and this change does not pretend to have wired it. What it does is\nstop one operation indexing a list it cannot trust while the mechanism to do that properly is built.\n\n`mixer.set_volume` and `set_pan` are NOT affected and did not need to be: they target the per-track\nheader fader, which belongs to exactly one track by construction (#107), and never index the strip\nlist at all.\n\nWHAT THE LIVE RUN CAN AND CANNOT SHOW\n\nThe refusal branch cannot be reached live. It fires when Logic's Accessibility tree fails to report a\nrole for a mixer child — a transient this run cannot induce without corrupting the very tree it is\nmeasuring, and inducing it would prove the fake rather than the guard. That branch is covered by unit\ntests with an injected AX failure, and by a mutation that removes the guard and reddens only its own\ntest.\n\nWhat the run shows is the half a unit test cannot: on a mixer Logic reads completely, the guard lets\neverything through. A guard's cheapest way to be wrong is to reject something that was never broken,\nand the mutation named on that check inverts it to refuse when the count is zero, which reddens on\nevery healthy mixer.\n\nThe harness also had to learn that the mixer resource is served from the poller's cache: closing the\npane does not change the answer until a poll lands on the new state, so measuring immediately read\nthe world as it was and reported a restore that had happened as one that had not.\n","ordinary_source_sha256":"27d51a0eda8142272f86e551a1f8e912cf2dfbe1cca371f17a3cee71878c32b2","ordinary_body_chars":2689,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":4,"insertions":320,"deletions":1,"changed_paths":["Scripts/livekit/live_290_shifted_strips_are_refused.py","Sources/LogicProMCP/Accessibility/AXLogicProElements+Mixer.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+Plugins.swift","Tests/LogicProMCPTests/Issue290ShiftedOrdinalRefusalTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-748bedfbbe5fe417","repository_id":"logic-pro-mcp","source_commit_sha":"32d7d0ba28eac81afd56b5a2bb42735b2fa5b87c","decision_audit_anchor":"748bedfbbe5fe417137df7fc7c106e3410c7d9eca30f87bb4e71db6e3ee29e83","ordinary_source":"docs(#369): the export surface CAN do per-track stems — ticket, not a scope decision\n\nThe roadmap expected this issue to close with a measurement showing the surface cannot drive\nper-track export: \"the export panel's per-track filename fields report settable=true and do not\naccept writes … if that holds, per-track stems cannot be driven from this surface and the issue\ncloses with the measurement.\"\n\nDriven live on Logic Pro 12.3 with Accessibility only and no coordinates, it produced\n\n ~/Music/Logic/Studio Grand_1.aif 394,922 bytes\n 2 ch · 48000 Hz · 2.048 s · peak -13.8 dBFS · 0.744 s non-silent · analyzer status pass\n\nReal audio, from the surface the plan said could not make it. So the issue does not close with a\nmeasurement of absence, and this commit turns the measurements into the ticket that implements it.\n\nWHAT THE EARLIER READING MISSED\n\n`One File per Track` is a popup ON the export panel. The previous measurement saw 148 settable text\nfields and concluded the per-track surface sat behind the panel, after a destination was chosen —\nthat was the file-browser half. The option half was on the same panel the whole time.\n\nFOUR THINGS A NAIVE DRIVE GETS WRONG, ALL MEASURED\n\nMenu enablement read from a CLOSED menu is meaningless: the same items read false closed and true\nopen, because macOS validates on open. I spent a cycle believing export was unavailable.\n\nThe leaf's title is rewritten by Logic with the selection — `Tracks as Audio Files…` became `1 Track\nas Audio File…`. Name resolution has to survive a title the application edits, not only one it\nlocalizes.\n\nTyping a destination path dismisses the panel. Reproduced twice, nothing written. The folder has to\nbe picked as a browser element and the destination popup re-read to confirm it changed before Export.\n\nThe window titled `Logic Pro` that appears after Export is the PROGRESS dialog, not an error. It is\ngone by the time a follow-up read arrives, and a probe that sees a window appear and vanish around a\nwrite will otherwise file it as an unread failure. Its disappearance is the completion signal; the\nExport click returning is not.\n\nWHAT THE TICKET IS BLOCKED ON, AND WHY IT IS NOT DECIDED HERE\n\nLogic writes one file per populated track, so a run can partly succeed. This project's contract has\nno shape for \"mostly worked\", and choosing one — State C for the whole run, or State A per file with\na run-level summary that is not a State — is a contract question. Deciding it inside an\nimplementation ticket is how a contract gets set by whoever happened to be writing code that week.\n","ordinary_source_sha256":"140db034f31a6df9c3c3847316e32f020234d36ae81670e86369637925bb275d","ordinary_body_chars":2585,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":2,"insertions":140,"deletions":0,"changed_paths":["docs/tickets/issue-369-per-track-stem-export/STATUS.md","docs/tickets/issue-369-per-track-stem-export/T1-drive-the-export-panel.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-865d5bb5450bc905","repository_id":"logic-pro-mcp","source_commit_sha":"d6a9bbf813b9bf4177f0b05e34d944b0b80d3722","decision_audit_anchor":"865d5bb5450bc90598d120425a0897622cf8c1baad9e174f62a1bef800ec76a0","ordinary_source":"fix(#495): describe the filter controls Logic actually exposes\n\nFilterControlID named noteEvents, channel, scope and takeFolder. Enumerating the\nEvent pane live shows eight event-type checkboxes and none of those last three, so\na collector reporting the real surface was rejected as incomplete and the only way\nto pass was to invent ids for controls that are not there — the exact fabrication\nthis check exists to prevent.\n\nScope is deliberately not represented as a filter. It is not a checkbox, and the\nassessment already binds it through region identity, which compares two\nindependently obtained identities instead of trusting a boolean. Encoding it twice\nwould let the weaker signal stand in for the stronger one.\n\nscopeFilterActiveRejected is retired rather than dropped: it asserted behaviour for\na control that does not exist. Its replacement was checked, not assumed —\nneutralising the observed-vs-resolved identity comparison fails\nmismatchedObservedIdentityRejected.\n\nThree existing filter tests used the old ids and were therefore passing through the\nunknown-id rule rather than the rule their names claim. Retargeted, then each of\nthe four rules mutated independently: missing-control, duplicate-control,\nunknown-id and Notes-off all fail as designed.\n\nCloses #495\n","ordinary_source_sha256":"6b1a3c8c7a45dd20792ef13b56b2197a31b20772adb8a25d8f001617d2523ea9","ordinary_body_chars":1278,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":3,"insertions":131,"deletions":23,"changed_paths":["Sources/LogicProMCP/MIDIReadback/EventListReadbackEvidence.swift","Sources/LogicProMCP/MIDIReadback/MIDIReadbackAssessment.swift","Tests/LogicProMCPTests/MIDIReadbackAssessmentTests.swift"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-8ea4400a37180162","repository_id":"logic-pro-mcp","source_commit_sha":"65fdf0a2edc1778e558566c12bc3b643405fdd3d","decision_audit_anchor":"8ea4400a3718016250e7f359810e585b871605dd92617147360c8972bf2d604e","ordinary_source":"Revert the release-workflow flag from this branch; it ships separately\n\nThe one-line change to .github/workflows/release.yml cannot merge through this\naccount: the token lacks the `workflow` scope, and GitHub refuses any merge that\ntouches a workflow file without it. Nothing is wrong with the change — it makes the\nrelease suite use the same -Xswiftc -suppress-warnings flag ci.yml already uses,\nverified against ci.yml:69, and warnings-as-errors is set nowhere.\n\nHolding four unrelated fixes hostage to it is the wrong trade. #496 stays open and\nships on its own once the scope exists.\n","ordinary_source_sha256":"3d9f6d38dc307d4006602c785c288796652ab6bb882175bd1934901696749cc7","ordinary_body_chars":588,"ordinary_body_survives":true,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":1,"insertions":1,"deletions":5,"changed_paths":[".github/workflows/release.yml"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-8f7493456cee37a3","repository_id":"logic-pro-mcp","source_commit_sha":"18a3ce11fb1d62e35cbc1b51b09328beb0bbedf9","decision_audit_anchor":"8f7493456cee37a38e0c9deddbc9025f635359a76a706387520de0a63ce772ff","ordinary_source":"feat(#448): read whether a track is a stack, and whether it is collapsed\n\nThe roadmap parks #448 in Wave 6 as an expected scope decision, on the reading that stack hierarchy\nis not exposed. Measured on Logic Pro 12.3 today, half of that is wrong.\n\nA track header carries an AXDisclosureTriangle when — and only when — it is the main track of a\ntrack stack. Logic's own help text on the element says so: \"Track stack disclosure arrow. Show or\nhide subtracks. Use the controls on the main track to control all subtracks in the track stack.\"\nExactly one of the 46 layout items in the arrange window carried one.\n\nSo `logic://tracks` now reports `is_stack_header` and `stack_collapsed`. Driven live on the probe\nproject, disclosing that stack moved the arrangement from 21 track headers to 44 and back, with the\narrow's AXValue tracking 0 -> 1 -> 0 and both published fields following it. Collapsed: one row says\nit is a stack and says it is closed. Disclosed: the same row — matched by track name, not by list\nposition — says it is open, and each of the 23 subtracks that appeared says it is not a stack and\ncarries no collapsed state at all.\n\nAbsences are kept as absences, and each is mutation-tested. A header whose children will not read\nreports neither field. A header among whose children one will not identify itself is not called\n\"not a stack\" — that path used a role reader that collapses every failure into nil, which would have\npublished an absence as a claim in the one function written to refuse exactly that. A disclosure\nvalue that is neither 0 nor 1 is left uninterpreted rather than truncated into an answer. A stack\nwhose value will not read reports the half it knows. A plain header reports no collapsed state.\n\nThe two new fields also survive the wire as VALUES: the pre-existing round-trip left both nil, and\nnil is omitted on both sides, so it would have passed unchanged had the keys been dropped.\n\nWHAT THE ARROW DOES NOT DO, AND A CLAIM I HAD TO WITHDRAW\n\nAn earlier draft of this commit said AXPress on the arrow actuates it. That was wrong. Measured\nthrough System Events and through a direct in-process AXUIElementPerformAction alike, the press\nanswers .success and the value does not move; the same press on the Mute checkbox beside it also\nmoves nothing, so the control is not the caller. AXValue reports settable: false. What actuates the\narrow is Logic's own Edit menu entry, which names the operation it will perform.\n\nThe claim survived a first reading because the return code said the press had worked. This is the\nthird finding in this repository of an Accessibility call that reports success and changes nothing,\nand the reason the live harness judges every actuation on the arrow MOVING rather than on the call\nreturning.\n\nColour remains unreadable. A track header exposes thirteen attributes and none of them is colour;\nscanning all 987 elements of the arrange window found no attribute whose name contains \"Color\" at\nall. The scope decision this issue expects narrows to colour and reorder.\n\nTWO DEFECTS IN MY OWN VERIFICATION, BOTH FOUND BY DISBELIEVING A GREEN\n\nThe first version of these tests passed against all three mutations. The assertions compared an\nOptional to nil inside #expect, which does not work on this toolchain in either direction:\n`.some(false) == nil` reports true, and `nil != nil` also reports true. The same comparison on\nString? and Int? is correct, and the same comparison on Bool? computed in an ordinary function and\nhanded to #expect as a plain Bool is correct. The bug is in the macro expansion.\n\n`Scripts/ci-forbid-dead-expect.sh` states this in prose and has no pattern for it, because a textual\nscanner cannot separate Optional from Optional and this suite has hundreds of the\nlatter where the comparison is live. So the fact is pinned as something that runs\n(`DeadOptionalBoolComparisonTests`) rather than as a comment: if the toolchain is fixed, that suite\ngoes red and the projections written around the bug can be reconsidered. A workaround with no expiry\ncondition outlives its reason.\n\nThe second defect: the mutation runs were reading a stale build. Writing the source and immediately\ninvoking `swift test` reused the previous artifact, so a mutation that had genuinely landed in the\nfile reported green. With `touch` plus an explicit `swift build --build-tests` first, all mutations\nfail, each reddening only its own test.\n","ordinary_source_sha256":"81957b1bac651e40aaeb90a5feeae96c5de5908f8596ec0ee8851fa252b2a74f","ordinary_body_chars":4421,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":8,"insertions":933,"deletions":2,"changed_paths":["Scripts/livekit/ax_stack_arrow.swift","Scripts/livekit/live_448_track_stack_readback.py","Sources/LogicProMCP/Accessibility/AXValueExtractors.swift","Sources/LogicProMCP/Dispatchers/TrackDispatcher.swift","Sources/LogicProMCP/State/StateModels.swift","Tests/LogicProMCPTests/DeadOptionalBoolComparisonTests.swift","Tests/LogicProMCPTests/Issue448TrackStackReadbackTests.swift","Tests/LogicProMCPTests/StateModelsCodableTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-959435801c3ef505","repository_id":"logic-pro-mcp","source_commit_sha":"32d7d0ba28eac81afd56b5a2bb42735b2fa5b87c","decision_audit_anchor":"959435801c3ef505dce652e49e0f27c115960cd91d85ac673467e8ee1c6fd825","ordinary_source":"docs(#369): the export surface CAN do per-track stems — ticket, not a scope decision\n\nThe roadmap expected this issue to close with a measurement showing the surface cannot drive\nper-track export: \"the export panel's per-track filename fields report settable=true and do not\naccept writes … if that holds, per-track stems cannot be driven from this surface and the issue\ncloses with the measurement.\"\n\nDriven live on Logic Pro 12.3 with Accessibility only and no coordinates, it produced\n\n ~/Music/Logic/Studio Grand_1.aif 394,922 bytes\n 2 ch · 48000 Hz · 2.048 s · peak -13.8 dBFS · 0.744 s non-silent · analyzer status pass\n\nReal audio, from the surface the plan said could not make it. So the issue does not close with a\nmeasurement of absence, and this commit turns the measurements into the ticket that implements it.\n\nWHAT THE EARLIER READING MISSED\n\n`One File per Track` is a popup ON the export panel. The previous measurement saw 148 settable text\nfields and concluded the per-track surface sat behind the panel, after a destination was chosen —\nthat was the file-browser half. The option half was on the same panel the whole time.\n\nFOUR THINGS A NAIVE DRIVE GETS WRONG, ALL MEASURED\n\nMenu enablement read from a CLOSED menu is meaningless: the same items read false closed and true\nopen, because macOS validates on open. I spent a cycle believing export was unavailable.\n\nThe leaf's title is rewritten by Logic with the selection — `Tracks as Audio Files…` became `1 Track\nas Audio File…`. Name resolution has to survive a title the application edits, not only one it\nlocalizes.\n\nTyping a destination path dismisses the panel. Reproduced twice, nothing written. The folder has to\nbe picked as a browser element and the destination popup re-read to confirm it changed before Export.\n\nThe window titled `Logic Pro` that appears after Export is the PROGRESS dialog, not an error. It is\ngone by the time a follow-up read arrives, and a probe that sees a window appear and vanish around a\nwrite will otherwise file it as an unread failure. Its disappearance is the completion signal; the\nExport click returning is not.\n\nWHAT THE TICKET IS BLOCKED ON, AND WHY IT IS NOT DECIDED HERE\n\nLogic writes one file per populated track, so a run can partly succeed. This project's contract has\nno shape for \"mostly worked\", and choosing one — State C for the whole run, or State A per file with\na run-level summary that is not a State — is a contract question. Deciding it inside an\nimplementation ticket is how a contract gets set by whoever happened to be writing code that week.\n","ordinary_source_sha256":"140db034f31a6df9c3c3847316e32f020234d36ae81670e86369637925bb275d","ordinary_body_chars":2585,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":2,"insertions":140,"deletions":0,"changed_paths":["docs/tickets/issue-369-per-track-stem-export/STATUS.md","docs/tickets/issue-369-per-track-stem-export/T1-drive-the-export-panel.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-97dfb7f923f08d18","repository_id":"logic-pro-mcp","source_commit_sha":"3c1b9cd9a402d8d2142aa35f7db845f123aae600","decision_audit_anchor":"97dfb7f923f08d189f4c0db4f5d9e5fb62b846cd869bb94438f5ae6b4f47ea0a","ordinary_source":"Restore the AXPressRecorder helper the merge dropped\n\nThe main-into-branch merge kept main's two #474 tests but lost the private\nAXPressRecorder class they construct: the class sat inside a region this branch\ndeletes (the coordinate tests), so git took the deletion while the tests arrived\nthrough a different hunk. The result compiled as a library and failed only when\nthe test target was built.\n\nVerified with swift build --build-tests, not swift build, and by comparing the\ndeclared-symbol sets of main, this branch and the merge result: nothing else is\nreferenced-but-undeclared.\n","ordinary_source_sha256":"bd670212989ebcd18c016b8d35d2f2ea5b2f9ed067525bf52c2c385a3e959647","ordinary_body_chars":584,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":1,"insertions":9,"deletions":0,"changed_paths":["Tests/LogicProMCPTests/PluginInsertVerifiedTests.swift"],"benchmark_authored":false,"provenance_value":"authored","g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a0550761c1997566","repository_id":"logic-pro-mcp","source_commit_sha":"d8b7440fae2243fde0ada94c6e1c08f2e7f6fdee","decision_audit_anchor":"a0550761c1997566cb006e3e54e504fff86d1884b9286c54a5f26516e6160b90","ordinary_source":"feat(#575): register move_to_playhead as an edit verb, with its oracle\n\n`region.move_to_playhead` has been implemented and verified since v3.1.3 and reachable from no tool\nthe whole time. It is now `logic_edit.move_to_playhead`.\n\nThe edit tool is where it belongs. It is a SELECTION-relative verb: the caller does not name a\nregion, Logic's selection does — the same contract cut, split and join already ship with\n`target: .none`. That is not the same defect as a positional index. A bare index is a false claim of\nidentity; a selection verb is the opposite admission, and this project ships thirteen of them.\n\n`region.select_last` stays unregistered, and that is a decision rather than an omission. It selects\nby screen geometry, and measured live against this project the filter it uses (`h > 20`) excludes\nevery region on screen, because regions are 13 points tall at this vertical zoom — it answers \"no\nregion\" on a project with twenty of them. Its actuation and its verification also disagree about\nwhat \"last\" means: bottom-most-then-right-most by position when choosing, largest start bar when\nchecking. It waits for a region target kind.\n\nTHE ORACLE, AND WHY IT IS NOT IN B1..B4\n\nA mutating operation needs an entry in the semantic oracle table. B4's prose said it was the FINAL\nincrement, and with it the covered set plus the audited exclusions accounted for the entire mutating\nsurface. That closure is a property of the registry, so registering a new mutating operation reopens\nit — which the closure invariant caught immediately, exactly as designed.\n\nThe rule the phases encode is therefore not \"B4 was last\" but \"an operation joins the covered set or\nthe audited-exclusion set in the same change that registers it\". The new entry sits in a set of its\nown rather than being back-dated into a phase that never contained it, because those sets record\nwhat was pinned when.\n\nEvery predicate in the oracle relates two INDEPENDENT reads rather than echoing an input back: the\nregion read before the click against the one read after it, `observed` against the post-click start\nbar, `requested` against the playhead read from the transport. The landing rule is `numericNear`\nwithin one bar, not equality — State A does not promise an exact match, and pinning one would\ndescribe a contract the handler never made.\n\nMEASURED LIVE\n\nThe run establishes a single known selection the way a caller would, then drives the operation:\n\n record_sequence -> exactly one region selected, starting at bar 1\n goto_position 9 -> playhead at bar 9\n move_to_playhead -> State A, verified, same region (name + track 22), bar 1 -> 9\n an independent reader -> Logic's own help string now says bar 9\n the arrange content band -> changed\n\nNine checks, five mutation-backed, one visual assertion.\n\nTWO MEASUREMENTS THE HARNESS HAD TO MAKE FIRST\n\nWriting `AXSelected` is not a setter. Setting it true ADDS to Logic's selection instead of replacing\nit, and a pass that set it false on eighteen other regions left those eighteen selected and the\ntarget NOT selected — the opposite of both writes, with success returned throughout. So the witness\nis read-only and the product establishes the selection.\n\nA witness has to be scoped. An earlier version walked the whole application, picked up the Piano\nRoll's own region item, and reported 23 regions on one call and 40 on the next. An index space that\nmoves between two calls is not a witness. It now reads only the arrange window's track-content\ngroup, the same landmark the product uses — whose description on this build is \"Tracks contents\",\nnot the \"Track Content\" a guess would have written.\n\n`logic_edit.undo` did not undo the move. It routes to the send-only key-command channels, which need\na bound key command this run never established, so the restoration goes through Logic's own menu\nentry instead — and only when that entry's title CHANGED across the move, which is Logic saying this\nrun's action is what sits on top of the undo stack. That needs no knowledge of the menu's language.\n","ordinary_source_sha256":"213024e23243be537b61d43217dc33e3cf848eb17b11aab7b46097782830cf38","ordinary_body_chars":4039,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":15,"insertions":529,"deletions":26,"changed_paths":["Scripts/livekit/ax_region_select.swift","Scripts/livekit/live_575_move_to_playhead_reachable.py","Sources/LogicProMCP/Dispatchers/EditDispatcher.swift","Sources/LogicProMCP/Qualification/SemanticOracleTable.swift","Sources/LogicProMCP/Server/OperationRegistry.swift","Sources/LogicProMCP/Workflows/WorkflowSkillCatalog.swift","Tests/LogicProMCPTests/HCGlobalInvariantTests.swift","Tests/LogicProMCPTests/OperationCatalogTests.swift","Tests/LogicProMCPTests/OperationHandlerBindingTests.swift","Tests/LogicProMCPTests/OperationRegistryCoverageTests.swift","Tests/LogicProMCPTests/OperationRegistryTests.swift","Tests/LogicProMCPTests/OperationTraceCoverageTests.swift","Tests/LogicProMCPTests/QualificationRunnerTests.swift","Tests/LogicProMCPTests/SemanticOracleFixtures.swift","Tests/LogicProMCPTests/SemanticOracleTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a2ab2ce0394ace90","repository_id":"logic-pro-mcp","source_commit_sha":"2fe9cac6c9413e5615644a6a01368191e63f2441","decision_audit_anchor":"a2ab2ce0394ace90abc556806da6c2753a1b9f7ad4272d4e5b647048ba129057","ordinary_source":"fix(#575): stop move_to_playhead certifying a region the caller never asked about\n\n`defaultMoveSelectedRegionToPlayhead` reads \"the selected region\" before the Edit > Move > To\nPlayhead click and again after it, then returned State A whenever the post-read's start bar sat on\nthe playhead. Nothing required the two reads to be about the SAME region.\n\nSo a selection that drifted during the click could reach State A on a region nobody asked about,\npurely because that region happens to sit on the playhead. State A means performed AND independently\nverified; this one was verified against a subject it never established.\n\n`startBar` cannot be the identity that decides it — that is the property the operation exists to\nchange. The gate now requires the same name and the same track index, and treats a `trackIndex` of\n-1 as what it is: the enumeration saying it could not place the region against any track header,\nwhich is a readback gap and not a match. Both new branches return State B `readback_mismatch` with\n`region_name` and `post_region_name` on the envelope, so a caller can tell \"it did not move\" from\n\"something else moved\".\n\nWHY BOTH FIELDS, MEASURED\n\nName alone would not have been enough. On the probe project all twenty regions are named\n\"MIDI Region\", so any one of them could have certified any other. That is Logic's naming, not this\nproject's: a project of uniquely named regions would have left a name-only check defensible, and the\nmeasurement could have come out that way. It did not.\n\nWHAT THE LIVE RUN COVERS, AND WHAT IT DOES NOT\n\nThe operation is reachable from no tool, so no live call reaches the changed branch, and the\nevidence document says so instead of implying a coverage it does not have. The branch is covered by\nunit tests, including a mutation (`sameRegion = true`) that reddens only the two new drift tests and\nnothing else.\n\nWhat the run adds is the part a unit test cannot reach: the region enumeration this handler leans on\nstill works against the real application, every region resolves to a real track so the second half\nof the gate has a value to compare, and the reachable surface is undisturbed.\n\nRegistering this operation is the next step and is deliberately not in this change. It is a\nverified-write mutating operation, so it needs an entry in the semantic oracle table — a governed\nartifact whose phase increments record when each contract was pinned — and that belongs in a change\nthat can be reviewed as oracle work rather than as a rider on a soundness fix.\n","ordinary_source_sha256":"4ac190bbd49839f7cca95581d3a1014ce86dbfb3712b31275cf21a59eda964cf","ordinary_body_chars":2513,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":3,"insertions":258,"deletions":1,"changed_paths":["Scripts/livekit/live_575_move_to_playhead_identity.py","Sources/LogicProMCP/Channels/AccessibilityChannel+Regions.swift","Tests/LogicProMCPTests/AccessibilityChannelRegionStateATests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-ae1693443c4f039f","repository_id":"logic-pro-mcp","source_commit_sha":"bc97c4141b1033c94bbc37926ee1d2b1c3727774","decision_audit_anchor":"ae1693443c4f039fbc3757b11d884733d8475ac374c716432365cefb5f96ca2e","ordinary_source":"fix(#575): the harness's Korean reader was agreeing by accident\n\nA blind review of this file found it, not a red run — which is the point.\n\nThe independent region reader parsed the start bar with one pattern for both languages:\n\n (?:starts at|시작)\\D*(\\d+) -- the first digits AFTER the verb\n\nThe two languages put the number on opposite sides of it:\n\n en \"Region starts at 1 bar and ends at 2 bars\" 1 FOLLOWS \"starts at\"\n ko \"리전은 1 마디 에서 시작하여 2 마디 에서 끝납니다\" 1 PRECEDES \"시작\", 2 follows it\n\nSo on a Korean Logic it read the END bar and reported it as the start. That did not crash and it did\nnot fail: after a move to bar 9 the Korean help reads \"9 마디 … 시작하여 10 마디\", the reader returned\n10, and `abs(10 - 9) <= 1` let the assertion through.\n\nA witness that agrees by accident is worse than no witness, because the run files it as\ncorroboration — and this one exists specifically so the operation's envelope is not the only thing\nsaying the region moved.\n\nThe Korean form is now matched on its own terms, with English left as the fallback. Checked against\nboth renderings and against a string that contains neither.\n\nThe visual assertion was also captured one step too early. The \"before\" frame was taken before\n`goto_position`, so the playhead line travelling from bar 1 to bar 9 changes the band by itself —\nthe assertion would have claimed the region moved while measuring that the cursor did. The capture\nnow happens after the seek, so only the region can account for the difference.\n","ordinary_source_sha256":"b23bbd86c343021272615a5e2d9951497f71d16d3a1bcb4adc6bf42ffec15fe9","ordinary_body_chars":1513,"ordinary_body_survives":true,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":1,"insertions":58,"deletions":10,"changed_paths":["Scripts/livekit/live_575_move_to_playhead_reachable.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-aea1ebe08b663d1c","repository_id":"logic-pro-mcp","source_commit_sha":"d5e8035f04fa053f680ae24f627b99d9e6bbdebd","decision_audit_anchor":"aea1ebe08b663d1c50788f8db25cdbe1e33cab8646bb6bd99c7a59b37662499f","ordinary_source":"fix(#590): identifying the chooser by title alone can hide a real document\n\nFollow-up to the commit below it, closing the direction that one opened.\n\n`isProjectPickerWindow` matches the window title by CONTAINMENT. A project the user names \"Choose a\nProject\" produces the arrange window \"Choose a Project - Tracks\", which contains the phrase — so on a\ntitle-only rule that window stops being counted, and `project.new` proceeds with a genuine document\nopen. That is the exact ambiguity the precondition exists to prevent, and it is a worse failure than\nthe refusal it replaced: the old defect refused too often, and accepting too often creates a project\nnobody can tell apart from the ones already on screen.\n\nThe title is now paired with a structural signal. Measured on Logic Pro 12.3:\n\n [Untitled 56 - Tracks] AXDocument = file:///…/Untitled%2056.logicx/\n [Choose a Project] AXDocument = missing value\n\nA document window carries `AXDocument` and the chooser does not, whatever the user called the\nproject. A window leaves the document count only when BOTH signals say chooser.\n\nEvery uncertain case falls to \"this is a document\": an unreadable title, an unreadable `AXDocument`,\nor a title that does not match all count as documents. A failure to identify the chooser therefore\ncosts a refusal, not an ambiguous creation.\n\nThe test is the look-alike project rather than the chooser, because the chooser was already covered\nand the look-alike is the case a title-only rule gets wrong. Restoring the title-only classification\nreddens that test and nothing else.\n","ordinary_source_sha256":"58c151c6d78e984d5bf548a66f73afcbb06cfee478a60aa093d92e2d8615db63","ordinary_body_chars":1575,"ordinary_body_survives":true,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":3,"insertions":112,"deletions":3,"changed_paths":["Scripts/livekit/live_590_project_new_from_cold_launch.py","Sources/LogicProMCP/Channels/AccessibilityChannel+Project.swift","Tests/LogicProMCPTests/Issue516DirectProjectCreationTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-b62d3f38467138a5","repository_id":"logic-pro-mcp","source_commit_sha":"b3190d7a21c26d602e82ed47c73e517bb4e6d989","decision_audit_anchor":"b62d3f38467138a583ed71a5b314acb2f8077b089cd623c3fa1feeb05fac7927","ordinary_source":"fix(#448): stop the live harness from being able to delete the stack it reads\n\nA blind review of the merged-ready branch found the actuator unsafe, and it was right.\n\nThe harness drives Logic's own Edit menu because AXPress on the disclosure arrow is inert. It picked\nthe entry with `name starts with \"Undo\" and name contains \"Track Stack\"`. So does \"Undo Create Track\nStack\" — and clicking that DELETES the stack the run exists to read. This is not hypothetical: the\nfirst run after someone creates the probe stack finds exactly that at the top of the undo history.\n\nWorse, the click was judged on the arrow's value merely DIFFERING. A deleted stack has no arrow, and\n`None != 0` is true, so the destructive case would have been recorded as a successful actuation. The\nrun would still have gone red further down — but only after the subject was gone.\n\nThree changes:\n\nCandidates are now rejected if their action name matches one of Logic's own structural stack\ncommands, and those are read from the live Track menu at run time rather than listed in the script,\nso the guard works on a Logic in any language: both sides of the comparison come from the same\nlocalized menu bar. Checked against the real menu, which yields \"Create Track Stack\" among 28 items;\n\"Undo Create Track Stack\", its Redo, and the ellipsis rendering are all rejected, while \"Undo/Redo\nClose/Disclose Track Stack\" is accepted.\n\nAn actuation counts only if the arrow still EXISTS and its value flipped to another integer. A\nvanished arrow is reported as catastrophic, by that name, rather than as movement.\n\nThe precondition that claimed Logic offers a disclosure command tested only that some entry\nmentioned a track stack — the same predicate-does-not-match-its-sentence shape the previous review\nfound on a different check. It now tests what it says. A second precondition states out loud that\nthe run begins with the stack closed, which the directions of every later assertion depend on and\nwhich was previously an unstated assumption.\n\nTwo test gaps from the same review are closed, both mutation-backed. A child whose role attribute\nreads SUCCESSFULLY as something that is not a role string reaches the extractor as `.success(nil)`,\nnot as a failure; the suite only covered the failure, so a later edit that treated the success case\nas \"ruled out\" would not have been caught. And the wire test pinned only `true`, which an encoder\nthat dropped `false` the way it drops `nil` would have satisfied — while an absent key is exactly\nhow a consumer tells \"this row was never examined\" from \"this stack is open\".\n","ordinary_source_sha256":"6ef93ec84944e3747bae5b752bc23c1ed20e1633754022e6952034b6c6a2332e","ordinary_body_chars":2583,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":3,"insertions":139,"deletions":31,"changed_paths":["Scripts/livekit/live_448_track_stack_readback.py","Tests/LogicProMCPTests/Issue448TrackStackReadbackTests.swift","Tests/LogicProMCPTests/StateModelsCodableTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-cccd3e7fae599767","repository_id":"logic-pro-mcp","source_commit_sha":"ae0a3776a2acca4f0bc569be942ae104b9371550","decision_audit_anchor":"cccd3e7fae5997675e0699777df01bf94c87b177c6210b78ef462beb1f15757f","ordinary_source":"fix(#604): a save_as refusal must say what it saw and must not leave the panel up\n\nTwo changes, both about the refusal rather than the classifier. The classifier itself is untouched:\nI could not establish a better rule than the one that ships, and shipping a guess would be worse than\nshipping the diagnosis.\n\nWHAT WAS OBSERVED\n\n`project.save_as` returned \"Exact Save As dialog did not appear within 3 seconds\". Timed from the\nmenu click, the panel appears in 0.75s. So the budget was never the problem and the message sent the\nreader to the wrong place — the same shape as the message #594 fixed, where a cause that was never\nmeasured was stated as an observation.\n\nWhat actually happens is that `exactSaveAsDialog` does not classify the panel that is on screen. With\nthe refusal now reporting what it saw, one clause of seven fails:\n\n title \"Save\" save_buttons 1 save_enabled true cancel_buttons 1\n package_radios 1 folder_radios 1\n filename_fields 0 <- the rule requires exactly 1\n\nA rule with seven conjuncts that reports one bit cannot be diagnosed from its own output. It now\nreports every candidate window's shape, so the next person sees the failing clause instead of\nguessing at timing.\n\nTHE REFUSAL USED TO WEDGE EVERY LATER OPERATION\n\nThe timeout path returned before `dismissDialog` is even defined, so the panel stayed up. Measured in\none run afterwards: two further `save_as` calls, `project.new`, and the plugin operations all\ncame back `preflight_blocking_dialog` on a \"Save\" window that exposes no buttons a caller can answer\nwith (`dialog_buttons: []`). Escape is the only thing that clears it, and the refusal does that now.\n\nWHY THE CLASSIFIER IS UNCHANGED\n\nThe count is where it fails, and I could not learn why with enough confidence to change it. Two\nreaders disagree about that panel: AppleScript's `entire contents` finds 156 text fields described\n\"text field\" at depth 8 and one at depth 2, while this code's own `findAllDescendants` finds ZERO at\ndepth 12. A shallow search and an ancestor-based filter were both tried against the live panel and\nboth still produced 0, so neither is the rule.\n\nWhatever the panel's real shape is through this reader, it is not what either of my candidate rules\nassumed, and a fix that \"works\" without explaining that disagreement would be a coincidence. The\nmeasurement is filed on the issue; this change makes the failure legible so the next attempt starts\nfrom data instead of from a timing hypothesis.\n","ordinary_source_sha256":"b5320628f9594212d8bb91ce89f179738fbf60517ba5b7ce4e885d98deea5a22","ordinary_body_chars":2518,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":2,"insertions":260,"deletions":1,"changed_paths":["Scripts/livekit/live_604_refusal_says_what_it_saw.py","Sources/LogicProMCP/Channels/AccessibilityChannel+Project.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d171f3ea2a7f7362","repository_id":"logic-pro-mcp","source_commit_sha":"aaed26054ea07bb94fd8b7d8739acbb44556abb4","decision_audit_anchor":"d171f3ea2a7f7362802f260be36ce9d310620905da516d4a53fbf995e9a28fe0","ordinary_source":"fix(#575): retire five region table rows that stood in front of no implementation\n\nThe issue says seven region operations are implemented and reachable from no tool. Five of the seven\nwere not implemented. The channel answered all five with one arm:\n\n case \"region.select\", \"region.loop\", \"region.set_name\", \"region.move\", \"region.resize\":\n return .error(\"Region operations not yet implemented via AX\")\n\nA row in the channel table is a statement that an operation is real and a declaration of which\nsurfaces may carry it. For these it declared a channel order for a refusal, and the sentence it\nrefused with reads as a promise rather than as an answer. Both are gone; the five now fall through\nto the same unsupported-operation default any unknown name gets, and no path to them is offered at\nall.\n\nThe eight region operations therefore split three ways, and only one group needed this change:\n\n region.get_regions in the table, reachable as logic_project.get_regions, implemented\n region.move_to_playhead in the table, implemented, reachable from no dispatcher\n region.select_last in the table, implemented, reachable from no dispatcher\n the five above in the table, reachable from nothing, never implemented\n\nThe two in the middle are finished work behind a missing registry entry — both already carry the\nreadback this repository requires, `move_to_playhead` through kAXSelectedAttribute and `select_last`\nthrough a post-state read of the region it selected. Exposing them is a separate change and is not\nattempted here.\n\nWHAT THE LIVE RUN CAN SHOW, AND WHAT IT CANNOT\n\nOnly one of the eight is reachable from a tool, so no live call can exercise the two that survive\nunreachable. Their survival is visible in the table and in the unit suite, and the evidence document\nsays so rather than implying a coverage it does not have.\n\nWhat the run does show is that removing five named rows took nothing reachable with it: the\nsurviving sibling of the same family still resolves, still reaches Accessibility, and still returns\na real inventory, and the whole reachable read-only surface across every tool still answers.\nRemoving `region.get_regions` alongside the five turns that first check red on its own, which is\nwhat makes it a check rather than a description.\n\nThe removed names are probed too and that check names no mutation, because it cannot distinguish\nthe two versions: they answered invalid_params before this change as well, never having been\nregistered for any tool. It is recorded to show the removal did not bind them to something.\n\nEight more operations share this shape — mixer.set_send, set_input, set_output, toggle_eq,\nreset_strip, plugin.list, automation.get_mode and set_mode all have rows and answer \"not yet\nimplemented\". They are reported and deliberately left alone: #575 is about the region family, and\nwidening a removal past the issue that motivated it is how a scoped fix becomes an unreviewed one.\n","ordinary_source_sha256":"8ce18fdce01025ba9d3dec02543c37fcc9acbde327a1236e6886b91c61da361e","ordinary_body_chars":2976,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":4,"insertions":175,"deletions":8,"changed_paths":["Scripts/livekit/live_575_region_stub_rows_retired.py","Sources/LogicProMCP/Channels/AccessibilityChannel.swift","Sources/LogicProMCP/Channels/RoutingTable.swift","Tests/LogicProMCPTests/AccessibilityChannelTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d7d1121164366d9c","repository_id":"logic-pro-mcp","source_commit_sha":"a2bb006fa68c4ad8a4e34506b76cc372db6fdc43","decision_audit_anchor":"d7d1121164366d9c5db28e1b864378f3a5804c0fe032b69e9bc9a4f1fbb126b2","ordinary_source":"test(#519): drive a region operation on a Logic running in Korean\n\n#519's outstanding acceptance criterion was that a REGION operation be shown to succeed on a Logic in\nanother language. It could not be met until two things merged: `region.move_to_playhead` was\nimplemented and reachable from no tool, and on a fresh launch the project chooser counted as an open\ndocument, so a Korean project could not be opened at all.\n\n 편집 > 이동 > 재생헤드로\n state A · verified · 'MIDI 리전' · track 1 · bar 1 -> 9 · playhead 9\n\nSeven checks, five of them mutation-backed, and the machine put back afterwards.\n\nTHE EXPECTED LABELS COME FROM THE PRODUCT, NOT FROM THIS FILE\n\nA harness that hard-codes the Korean string and compares it to the live menu proves that this file\nand Logic agree. The claim that matters is that the PRODUCT's label sets are right, so the expected\nstrings are parsed out of AXLocalePolicy.swift at run time and the live menus are checked against\nthose. Editing a LabelSet is now visible here.\n\nThat check could have failed. Logic's Korean renderings are not derivable from the English — this\nrepository already records New = 신규, not the 새로 만들기 a translation produces.\n\nTWO THINGS THIS RUN REFUSES TO TAKE ON TRUST\n\nWhether Logic is actually in Korean is decided by reading its menu bar, not by reading back the\nsetting the run just wrote. The first version of this file did stop on exactly that: Logic came up in\nEnglish, the precondition caught it, and the run failed instead of testing English and filing it as\nKorean evidence.\n\nThe cause was in the shutdown. It pressed Escape and then looked for the discard button - but Escape\nCANCELS the save prompt, so the sequence defeated itself, Logic stayed running, and `open -a` on a\nrunning application does nothing, which left the old language in place. The dialog is now inspected\nbefore anything is sent to it, and the quit is asserted before the language is switched: a quit that\nwas merely SENT is not a Logic that stopped.\n\nWHAT THIS EVIDENCE DOES NOT CARRY\n\nNo visual assertion and no independent AX reader. The region's position after the move is taken from\nthe operation's own envelope, cross-checked only by the localized menu path having resolved. The\nEnglish run in `live_575_move_to_playhead_reachable.py` is the one that holds a second instrument\nagainst the same operation - Logic's own help string read by a separate tool, plus a band of the\narrange area that has to change. This run is about the LANGUAGE, and it says so rather than implying\na coverage it does not have.\n","ordinary_source_sha256":"564201faa7a507f0712ec9642e3998617997f1100fdd443264fe99bc9b3333d6","ordinary_body_chars":2546,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":1,"insertions":349,"deletions":0,"changed_paths":["Scripts/livekit/live_519_region_op_on_a_localized_logic.py"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-dd97491c4d227316","repository_id":"logic-pro-mcp","source_commit_sha":"aaed26054ea07bb94fd8b7d8739acbb44556abb4","decision_audit_anchor":"dd97491c4d227316845855cea3c105c3d25423ebeeefdc02767149d29bcf115e","ordinary_source":"fix(#575): retire five region table rows that stood in front of no implementation\n\nThe issue says seven region operations are implemented and reachable from no tool. Five of the seven\nwere not implemented. The channel answered all five with one arm:\n\n case \"region.select\", \"region.loop\", \"region.set_name\", \"region.move\", \"region.resize\":\n return .error(\"Region operations not yet implemented via AX\")\n\nA row in the channel table is a statement that an operation is real and a declaration of which\nsurfaces may carry it. For these it declared a channel order for a refusal, and the sentence it\nrefused with reads as a promise rather than as an answer. Both are gone; the five now fall through\nto the same unsupported-operation default any unknown name gets, and no path to them is offered at\nall.\n\nThe eight region operations therefore split three ways, and only one group needed this change:\n\n region.get_regions in the table, reachable as logic_project.get_regions, implemented\n region.move_to_playhead in the table, implemented, reachable from no dispatcher\n region.select_last in the table, implemented, reachable from no dispatcher\n the five above in the table, reachable from nothing, never implemented\n\nThe two in the middle are finished work behind a missing registry entry — both already carry the\nreadback this repository requires, `move_to_playhead` through kAXSelectedAttribute and `select_last`\nthrough a post-state read of the region it selected. Exposing them is a separate change and is not\nattempted here.\n\nWHAT THE LIVE RUN CAN SHOW, AND WHAT IT CANNOT\n\nOnly one of the eight is reachable from a tool, so no live call can exercise the two that survive\nunreachable. Their survival is visible in the table and in the unit suite, and the evidence document\nsays so rather than implying a coverage it does not have.\n\nWhat the run does show is that removing five named rows took nothing reachable with it: the\nsurviving sibling of the same family still resolves, still reaches Accessibility, and still returns\na real inventory, and the whole reachable read-only surface across every tool still answers.\nRemoving `region.get_regions` alongside the five turns that first check red on its own, which is\nwhat makes it a check rather than a description.\n\nThe removed names are probed too and that check names no mutation, because it cannot distinguish\nthe two versions: they answered invalid_params before this change as well, never having been\nregistered for any tool. It is recorded to show the removal did not bind them to something.\n\nEight more operations share this shape — mixer.set_send, set_input, set_output, toggle_eq,\nreset_strip, plugin.list, automation.get_mode and set_mode all have rows and answer \"not yet\nimplemented\". They are reported and deliberately left alone: #575 is about the region family, and\nwidening a removal past the issue that motivated it is how a scoped fix becomes an unreviewed one.\n","ordinary_source_sha256":"8ce18fdce01025ba9d3dec02543c37fcc9acbde327a1236e6886b91c61da361e","ordinary_body_chars":2976,"ordinary_body_survives":true,"removed_trailer_count":8,"residual_record_lines_removed":0,"files_changed":4,"insertions":175,"deletions":8,"changed_paths":["Scripts/livekit/live_575_region_stub_rows_retired.py","Sources/LogicProMCP/Channels/AccessibilityChannel.swift","Sources/LogicProMCP/Channels/RoutingTable.swift","Tests/LogicProMCPTests/AccessibilityChannelTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-de1096e077fa22d6","repository_id":"logic-pro-mcp","source_commit_sha":"2b4c2bfa9141f59508631ad2b592d260aa17ec99","decision_audit_anchor":"de1096e077fa22d6bb74fbabd548ba496d7f19e91fe9bf33599284678583b7f2","ordinary_source":"docs(#369): the ticket was not blocked — I asserted an absence without reading the executor\n\nThe first revision declared T1 blocked on a contract decision: \"what State does a partially\nsuccessful stem run report\", on the claim that this project has no shape for \"mostly worked\".\n\nIt has one, and it is in the executor `export_run artifacts:[stem]` already flows through.\n`ProjectExportExecutor` runs the Honest Contract PER ARTIFACT — State A when the file verified on\ndisk, State B when it could not be verified, State C on a hard failure — and it walks a list of them.\nA stem run is exactly that list, one artifact per populated track.\n\nSo the blocker was not a gap in the contract. It was an absence I asserted without aiming anything at\nthe place the answer lives, which is the defect class this repository spends most of its guards on and\nthe one I spent today finding in other people's code.\n\nTwo behaviours a stem run should inherit rather than reinvent, both already in that executor: an\nartifact the plan flagged `would_overwrite` fails closed instead of bouncing over an existing file,\nand already-present-and-verified artifacts are skipped, which is what makes `export_resume`\nidempotent.\n\nThe one genuinely new thing is that Logic names the files, not the plan — the panel writes\n`_1.aif`, so the executor cannot pre-compute the paths it polls for. It has to enumerate\nthe destination after the progress window closes and bind each file to a track by name. That is\nimplementation.\n\nCorrected in place rather than left standing with a note, because a ticket that says \"blocked\" is\nread as a reason not to start.\n","ordinary_source_sha256":"f18c4c38ff1d6dfc226430c130f06d44a8a86464ca59425eb650497ba3ab5e1d","ordinary_body_chars":1635,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":2,"insertions":44,"deletions":12,"changed_paths":["docs/tickets/issue-369-per-track-stem-export/STATUS.md","docs/tickets/issue-369-per-track-stem-export/T1-drive-the-export-panel.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-de409d80b116c6ee","repository_id":"logic-pro-mcp","source_commit_sha":"d8b7440fae2243fde0ada94c6e1c08f2e7f6fdee","decision_audit_anchor":"de409d80b116c6eecd940b5203a1be855284f5791a19aac76429454b08675d47","ordinary_source":"feat(#575): register move_to_playhead as an edit verb, with its oracle\n\n`region.move_to_playhead` has been implemented and verified since v3.1.3 and reachable from no tool\nthe whole time. It is now `logic_edit.move_to_playhead`.\n\nThe edit tool is where it belongs. It is a SELECTION-relative verb: the caller does not name a\nregion, Logic's selection does — the same contract cut, split and join already ship with\n`target: .none`. That is not the same defect as a positional index. A bare index is a false claim of\nidentity; a selection verb is the opposite admission, and this project ships thirteen of them.\n\n`region.select_last` stays unregistered, and that is a decision rather than an omission. It selects\nby screen geometry, and measured live against this project the filter it uses (`h > 20`) excludes\nevery region on screen, because regions are 13 points tall at this vertical zoom — it answers \"no\nregion\" on a project with twenty of them. Its actuation and its verification also disagree about\nwhat \"last\" means: bottom-most-then-right-most by position when choosing, largest start bar when\nchecking. It waits for a region target kind.\n\nTHE ORACLE, AND WHY IT IS NOT IN B1..B4\n\nA mutating operation needs an entry in the semantic oracle table. B4's prose said it was the FINAL\nincrement, and with it the covered set plus the audited exclusions accounted for the entire mutating\nsurface. That closure is a property of the registry, so registering a new mutating operation reopens\nit — which the closure invariant caught immediately, exactly as designed.\n\nThe rule the phases encode is therefore not \"B4 was last\" but \"an operation joins the covered set or\nthe audited-exclusion set in the same change that registers it\". The new entry sits in a set of its\nown rather than being back-dated into a phase that never contained it, because those sets record\nwhat was pinned when.\n\nEvery predicate in the oracle relates two INDEPENDENT reads rather than echoing an input back: the\nregion read before the click against the one read after it, `observed` against the post-click start\nbar, `requested` against the playhead read from the transport. The landing rule is `numericNear`\nwithin one bar, not equality — State A does not promise an exact match, and pinning one would\ndescribe a contract the handler never made.\n\nMEASURED LIVE\n\nThe run establishes a single known selection the way a caller would, then drives the operation:\n\n record_sequence -> exactly one region selected, starting at bar 1\n goto_position 9 -> playhead at bar 9\n move_to_playhead -> State A, verified, same region (name + track 22), bar 1 -> 9\n an independent reader -> Logic's own help string now says bar 9\n the arrange content band -> changed\n\nNine checks, five mutation-backed, one visual assertion.\n\nTWO MEASUREMENTS THE HARNESS HAD TO MAKE FIRST\n\nWriting `AXSelected` is not a setter. Setting it true ADDS to Logic's selection instead of replacing\nit, and a pass that set it false on eighteen other regions left those eighteen selected and the\ntarget NOT selected — the opposite of both writes, with success returned throughout. So the witness\nis read-only and the product establishes the selection.\n\nA witness has to be scoped. An earlier version walked the whole application, picked up the Piano\nRoll's own region item, and reported 23 regions on one call and 40 on the next. An index space that\nmoves between two calls is not a witness. It now reads only the arrange window's track-content\ngroup, the same landmark the product uses — whose description on this build is \"Tracks contents\",\nnot the \"Track Content\" a guess would have written.\n\n`logic_edit.undo` did not undo the move. It routes to the send-only key-command channels, which need\na bound key command this run never established, so the restoration goes through Logic's own menu\nentry instead — and only when that entry's title CHANGED across the move, which is Logic saying this\nrun's action is what sits on top of the undo stack. That needs no knowledge of the menu's language.\n","ordinary_source_sha256":"213024e23243be537b61d43217dc33e3cf848eb17b11aab7b46097782830cf38","ordinary_body_chars":4039,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":15,"insertions":529,"deletions":26,"changed_paths":["Scripts/livekit/ax_region_select.swift","Scripts/livekit/live_575_move_to_playhead_reachable.py","Sources/LogicProMCP/Dispatchers/EditDispatcher.swift","Sources/LogicProMCP/Qualification/SemanticOracleTable.swift","Sources/LogicProMCP/Server/OperationRegistry.swift","Sources/LogicProMCP/Workflows/WorkflowSkillCatalog.swift","Tests/LogicProMCPTests/HCGlobalInvariantTests.swift","Tests/LogicProMCPTests/OperationCatalogTests.swift","Tests/LogicProMCPTests/OperationHandlerBindingTests.swift","Tests/LogicProMCPTests/OperationRegistryCoverageTests.swift","Tests/LogicProMCPTests/OperationRegistryTests.swift","Tests/LogicProMCPTests/OperationTraceCoverageTests.swift","Tests/LogicProMCPTests/QualificationRunnerTests.swift","Tests/LogicProMCPTests/SemanticOracleFixtures.swift","Tests/LogicProMCPTests/SemanticOracleTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-eef995b442c7a008","repository_id":"logic-pro-mcp","source_commit_sha":"4e56d46a818685c821a4e7bbb8d5bd56e7378411","decision_audit_anchor":"eef995b442c7a00823b57ee3a7fd1281b8814eacc41c32dd85d1c954f7ec7f08","ordinary_source":"fix(#576): let the import verdict follow how far the region readback reached\n\n#577 made the empty-region branch State B unconditionally. That was right at the time: `complete` was\na hardcoded `false`, so an absent region could never be told from one that was simply out of view,\nand calling it a definite failure sent callers into a retry that creates a second track.\n\nWith completeness measured, the sharper verdict comes back exactly where it is earned. A readback\nthat covered the WHOLE arrangement and still found no imported region is evidence that none was\ncreated — so that case is State C `readback_mismatch` again, and the hint says which kind of absence\nit is: \"an absence that was looked for, not one that was out of view.\"\n\nThe completeness travelled with the enumeration all along and was dropped at the import's call site,\nwhich is the original defect. `MIDIImportRegionReadback.success` now carries it.\n\nOnly the LAST successful post-write reading decides the verdict. The poll loop runs up to ten times,\nso a stale completeness from an earlier attempt must not survive into the answer; it is reset with\nthe regions it came with.\n\nThe two Issue108 cases are now one flag apart on the same fixture, which is the point — the verdict\nfollows the readback's reach, not the shape of the result. Both are mutation-tested: forcing the\ncomplete branch breaks the incomplete case, and inverting the condition breaks both.\n\nStacks on the branch that makes completeness measurable; it consumes `coversWholeArrangement`.\n","ordinary_source_sha256":"d3b582b636ffc537f89343d67ff06398682d3e1e405c05177993be3ea601fdd6","ordinary_body_chars":1524,"ordinary_body_survives":true,"removed_trailer_count":6,"residual_record_lines_removed":0,"files_changed":5,"insertions":97,"deletions":27,"changed_paths":["Sources/LogicProMCP/Channels/AccessibilityChannel+MIDIImport.swift","Tests/LogicProMCPTests/AccessibilityChannelTests.swift","Tests/LogicProMCPTests/Issue108Tests.swift","Tests/LogicProMCPTests/Issue123ImportOcclusionHonestTests.swift","Tests/LogicProMCPTests/Issue519MenuLocaleGeneratorTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-f05b91620a25eee7","repository_id":"logic-pro-mcp","source_commit_sha":"d8b7440fae2243fde0ada94c6e1c08f2e7f6fdee","decision_audit_anchor":"f05b91620a25eee72b06fc644c6cb6dac3d3aa7c74abd7d7ad9727ea82ab425b","ordinary_source":"feat(#575): register move_to_playhead as an edit verb, with its oracle\n\n`region.move_to_playhead` has been implemented and verified since v3.1.3 and reachable from no tool\nthe whole time. It is now `logic_edit.move_to_playhead`.\n\nThe edit tool is where it belongs. It is a SELECTION-relative verb: the caller does not name a\nregion, Logic's selection does — the same contract cut, split and join already ship with\n`target: .none`. That is not the same defect as a positional index. A bare index is a false claim of\nidentity; a selection verb is the opposite admission, and this project ships thirteen of them.\n\n`region.select_last` stays unregistered, and that is a decision rather than an omission. It selects\nby screen geometry, and measured live against this project the filter it uses (`h > 20`) excludes\nevery region on screen, because regions are 13 points tall at this vertical zoom — it answers \"no\nregion\" on a project with twenty of them. Its actuation and its verification also disagree about\nwhat \"last\" means: bottom-most-then-right-most by position when choosing, largest start bar when\nchecking. It waits for a region target kind.\n\nTHE ORACLE, AND WHY IT IS NOT IN B1..B4\n\nA mutating operation needs an entry in the semantic oracle table. B4's prose said it was the FINAL\nincrement, and with it the covered set plus the audited exclusions accounted for the entire mutating\nsurface. That closure is a property of the registry, so registering a new mutating operation reopens\nit — which the closure invariant caught immediately, exactly as designed.\n\nThe rule the phases encode is therefore not \"B4 was last\" but \"an operation joins the covered set or\nthe audited-exclusion set in the same change that registers it\". The new entry sits in a set of its\nown rather than being back-dated into a phase that never contained it, because those sets record\nwhat was pinned when.\n\nEvery predicate in the oracle relates two INDEPENDENT reads rather than echoing an input back: the\nregion read before the click against the one read after it, `observed` against the post-click start\nbar, `requested` against the playhead read from the transport. The landing rule is `numericNear`\nwithin one bar, not equality — State A does not promise an exact match, and pinning one would\ndescribe a contract the handler never made.\n\nMEASURED LIVE\n\nThe run establishes a single known selection the way a caller would, then drives the operation:\n\n record_sequence -> exactly one region selected, starting at bar 1\n goto_position 9 -> playhead at bar 9\n move_to_playhead -> State A, verified, same region (name + track 22), bar 1 -> 9\n an independent reader -> Logic's own help string now says bar 9\n the arrange content band -> changed\n\nNine checks, five mutation-backed, one visual assertion.\n\nTWO MEASUREMENTS THE HARNESS HAD TO MAKE FIRST\n\nWriting `AXSelected` is not a setter. Setting it true ADDS to Logic's selection instead of replacing\nit, and a pass that set it false on eighteen other regions left those eighteen selected and the\ntarget NOT selected — the opposite of both writes, with success returned throughout. So the witness\nis read-only and the product establishes the selection.\n\nA witness has to be scoped. An earlier version walked the whole application, picked up the Piano\nRoll's own region item, and reported 23 regions on one call and 40 on the next. An index space that\nmoves between two calls is not a witness. It now reads only the arrange window's track-content\ngroup, the same landmark the product uses — whose description on this build is \"Tracks contents\",\nnot the \"Track Content\" a guess would have written.\n\n`logic_edit.undo` did not undo the move. It routes to the send-only key-command channels, which need\na bound key command this run never established, so the restoration goes through Logic's own menu\nentry instead — and only when that entry's title CHANGED across the move, which is Logic saying this\nrun's action is what sits on top of the undo stack. That needs no knowledge of the menu's language.\n","ordinary_source_sha256":"213024e23243be537b61d43217dc33e3cf848eb17b11aab7b46097782830cf38","ordinary_body_chars":4039,"ordinary_body_survives":true,"removed_trailer_count":10,"residual_record_lines_removed":0,"files_changed":15,"insertions":529,"deletions":26,"changed_paths":["Scripts/livekit/ax_region_select.swift","Scripts/livekit/live_575_move_to_playhead_reachable.py","Sources/LogicProMCP/Dispatchers/EditDispatcher.swift","Sources/LogicProMCP/Qualification/SemanticOracleTable.swift","Sources/LogicProMCP/Server/OperationRegistry.swift","Sources/LogicProMCP/Workflows/WorkflowSkillCatalog.swift","Tests/LogicProMCPTests/HCGlobalInvariantTests.swift","Tests/LogicProMCPTests/OperationCatalogTests.swift","Tests/LogicProMCPTests/OperationHandlerBindingTests.swift","Tests/LogicProMCPTests/OperationRegistryCoverageTests.swift","Tests/LogicProMCPTests/OperationRegistryTests.swift","Tests/LogicProMCPTests/OperationTraceCoverageTests.swift","Tests/LogicProMCPTests/QualificationRunnerTests.swift","Tests/LogicProMCPTests/SemanticOracleFixtures.swift","Tests/LogicProMCPTests/SemanticOracleTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-f0ea9a2a5b68115b","repository_id":"logic-pro-mcp","source_commit_sha":"51f7821f9d22174d665ee156ad7c1c9880fe8996","decision_audit_anchor":"f0ea9a2a5b68115b270721f09a86c03dabe2763282d1056772ccade0edbc30dc","ordinary_source":"docs(#369): buildable and shippable are not the same word\n\nThe previous revision said T1 \"stands alone and is buildable\". That is true of the code and false of\nshipping it, and the difference matters more than the sentence did.\n\nThe public export surface is two operations — project.export_plan and project.export_run — and\nnothing else. A standalone stem drive has no third place to land. It would either need a new public\noperation, which is a surface decision rather than a free choice inside this ticket, or it would sit\nimplemented and unrouted.\n\nUnrouted is the shape this repository retired eleven table rows for on the same day this ticket was\nwritten: five region rows in #587 and six more in #592, every one of them an implementation behind a\nrow no caller could reach, refusing with a sentence that reads as a promise. Writing a twelfth on\npurpose, in a ticket, would be worse than finding one.\n\nSo the order is fixed rather than parallel. Answer what an artifact plan promises when the names\narrive late, wire export_run artifacts:[stem], and let the drive land inside it. T1 is the mechanism\nthe wiring will use, written down while the measurements are fresh — not a starting point that can\nship by itself.\n\nThree corrections in three revisions. The first two came from answering about a file without opening\nit. This one came from treating \"buildable\" and \"shippable\" as the same word.\n","ordinary_source_sha256":"6a9365c41c12ff4d6c130fc16b13b39491462d2eed69765a2202efbf015e02e3","ordinary_body_chars":1400,"ordinary_body_survives":true,"removed_trailer_count":5,"residual_record_lines_removed":0,"files_changed":2,"insertions":30,"deletions":7,"changed_paths":["docs/tickets/issue-369-per-track-stem-export/STATUS.md","docs/tickets/issue-369-per-track-stem-export/T1-drive-the-export-panel.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-f149c003cc5dae5d","repository_id":"logic-pro-mcp","source_commit_sha":"2da2f7a182090306f4b172003b78fe41c2978c2d","decision_audit_anchor":"f149c003cc5dae5d413960334931befa413211a5195bb27f7a5619e7375645f5","ordinary_source":"chore(#575): retire three table entries whose channels refuse them\n\nThree rows named a channel that has no case for them: the MCU output-volume setter, the mixer\nbus-route getter, and the automation parameter getter. Each falls to its channel's `default` arm —\n`Unknown MCU operation` / `Unsupported AX operation` — so a caller who found one would have reached\nan exhausted chain.\n\nThat is a stronger case than the two system entries retired earlier, which at least named a channel\nthat would have answered: these three had no caller AND no implementation.\n\nVerified live through the running server before removal, not only by grep: each answers\n`invalid_params` under every plausible tool spelling.\n\nAn independent review read both channel execute switches, the router, the mixer dispatcher, the\npoller, the resource handlers, the workflow catalog, the operation and capability registries, the\ndoctor checks, and the route, capability and bypass suites. It confirmed per operation, with line\nnumbers, that no case exists in the destination channel, and traced every consumer: the table count\nassertion goes 140 to 137 against a floor of 80, the registry spec count is untouched because none\nwas ever registered, and the advertised-operation route test is unchanged because none was ever\nadvertised.\n\nPrefix neighbours are pinned untouched, in a unit test against the table and in the live harness\nagainst the running server. The live probe deliberately calls a neighbour with a parameter it\nrejects: proving it survives does not require moving the user's master volume, and the discriminator\nis the hint rather than the error code, since a live command and a retired one both answer\ninvalid_params.\n\nFive of #575's twelve are now gone. The seven region entries remain: those ARE implemented, so\nexposing or retiring them is a decision that overlaps #302, not dead weight to sweep.\n","ordinary_source_sha256":"95eb93ff95e532624bc749377e98d1e385cbf2f9cf24f424ca8cb650cbbdc55e","ordinary_body_chars":1882,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":4,"insertions":86,"deletions":10,"changed_paths":["Scripts/livekit/live_575_retired_routes_change_nothing.py","Sources/LogicProMCP/Channels/RoutingTable.swift","Tests/LogicProMCPTests/Issue567LocalizedOwnerNameTests.swift","docs/roadmap/roadmap-2026-08-10.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-f51f8964286329bb","repository_id":"logic-pro-mcp","source_commit_sha":"117570b6ff17b17119d5b71ed312fb6e6a07d409","decision_audit_anchor":"f51f8964286329bb21087c1c4149b6dc6d8768e2bdda10e57a369b8f2cbdaa65","ordinary_source":"fix(#592): retire six more rows in front of no implementation, and two arms nothing reaches\n\nCloses #592\n\nThe non-region half of the census #587 started. Six table rows had no implementation behind them —\nthe accessibility channel answered each with a refusal string:\n\n mixer.set_input mixer.set_output mixer.toggle_eq\n mixer.reset_strip plugin.list automation.get_mode\n\nTwo of those are worse than empty. `mixer.toggle_eq` and `mixer.reset_strip` named `.mcu` FIRST and\n`MCUChannel` has no arm for either, so the table was promising a fallback that does not exist.\n\nA row states that an operation is real and declares which surfaces may carry it. For these six it\ndeclared a channel order for a refusal, and the sentence it refused with — \"not yet implemented via\nAX\" — reads as a promise rather than as an answer. They come back when there is something behind\nthem.\n\nTWO ARMS DELETED WITHOUT THEIR ROWS, WHICH IS THE OPPOSITE CASE\n\n`mixer.set_send` and `automation.set_mode` keep their rows because they WORK: MCU carries the first,\nthe key-command channel the second. Neither routes through accessibility at all, so their\naccessibility arms were unreachable code — a refusal that the operation never reaches, found by\nanyone who greps the operation name and concludes it is unbuilt.\n\nI had this wrong in a comment on #575, where I called all eight the same shape. Checking each\noperation's CHAIN rather than the arm I happened to read is what separates them.\n\nWHAT THE LIVE RUN SHOWS, AND WHAT IT CANNOT\n\nThe six were registered for no tool, so no live call reached them before or after. Their absence is\nnot what this proves.\n\nWhat it proves is that six named rows came out without disturbing the families they sat in:\n`mixer.set_master_volume` and `mixer.set_volume` share a prefix with four of them,\n`plugins.get_inventory` with `plugin.list`, and `tracks.set_automation` is the reachable automation\nsurface. Each is probed with a parameter it rejects — proving a neighbour survives does not require\nmoving the operator's master volume — and the discriminator is the HINT, because a live command and a\nretired one both answer with an error:\n\n live \"Unknown parameters: nope. Allowed parameters: value, volume.\"\n retired \"Command '…' is not registered for MCP tool '…'\"\n\n`mixer.set_send` and `automation.set_mode` cannot be probed live at all, and the run says so instead\nof dressing a probe of something else as evidence: both are implemented and registered for no tool,\nso their survival rests on the table and the unit suite. The first version of this harness tried to\nprobe them and got \"mixer.set_send is not exposed in the production MCP contract\" — the run corrected\nthe check rather than the other way round.\n","ordinary_source_sha256":"07beb071d6095f61bf8bb910f39a54f94a959fc8b0a4c8b385dac376dd6ce3f3","ordinary_body_chars":2762,"ordinary_body_survives":true,"removed_trailer_count":7,"residual_record_lines_removed":0,"files_changed":5,"insertions":212,"deletions":29,"changed_paths":["Scripts/livekit/live_592_stub_rows_retired.py","Sources/LogicProMCP/Channels/AccessibilityChannel.swift","Sources/LogicProMCP/Channels/RoutingTable.swift","Tests/LogicProMCPTests/AccessibilityChannelTests.swift","Tests/LogicProMCPTests/Issue567LocalizedOwnerNameTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-fd7263067698db44","repository_id":"logic-pro-mcp","source_commit_sha":"0c4ada8960af2069afcff8759c29d76f03954b3b","decision_audit_anchor":"fd7263067698db441536116d78ef25e49eb38a67d19f6ee000dff1504ba2250a","ordinary_source":"fix(#538): AXModal absence is a window declining to answer, not a window saying no\n\nThe blocking predicate had already moved from a subrole allowlist to `AXModal`, because measured on\nLogic 12.3 the Go To Position window is `AXFloatingWindow` with `AXModal == true` and no allowlist\ncould classify it. That move was right and the reading around it was not: `attributeUnsupported`\nand `noValue` both continued past the window, and a malformed successful payload became `nil` and\nfollowed the same path. Apple documents `AXModal` as recommended rather than required for windows,\nso its absence is not proof of `false` — the same guess as the subrole list, one attribute over.\n\nA window that will not say whether it is modal now makes the observation unreadable rather than\nclean, which is enough to stop it certifying State A without turning every unreadable window into a\nhard blocker.\n\nRemoving the causal claim from `performed` left `project.new` with an unreachable success path:\nit still required `outcome.performed` while sheet actions unconditionally return false, so a\nproject that was created — sheet gone, one track readable — returned State B and the router\nsurfaced a hard `channels_exhausted`. The gate now rests on what can be observed, the sheet gone\nplus a positive track count, rather than restoring the causal claim.\n\nThe alert and menu witnesses had the same causation gap as the sheet witness and are bound the same\nway, and the confirmation scan no longer re-resolves the main window independently.\n","ordinary_source_sha256":"e5204274c26cd504727a845465bb0377a53a1f56f0c10791834fa8875fc712b8","ordinary_body_chars":1518,"ordinary_body_survives":true,"removed_trailer_count":4,"residual_record_lines_removed":0,"files_changed":7,"insertions":562,"deletions":209,"changed_paths":["Sources/LogicProMCP/Accessibility/AXHelpers.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+ModalReconcile.swift","Sources/LogicProMCP/Channels/AccessibilityChannel+Project.swift","Tests/LogicProMCPTests/AccessibilityChannelTests.swift","Tests/LogicProMCPTests/Issue453AlertAcknowledgeBindingTests.swift","Tests/LogicProMCPTests/Issue538MenuWitnessHonestyTests.swift","Tests/LogicProMCPTests/Issue538ModalWitnessTests.swift"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-0d7c38f6a60e8b36","repository_id":"agent-control-plane","source_commit_sha":"820df6796792481894c72bfd4995acec386de0fa","decision_audit_anchor":"0d7c38f6a60e8b36591b98d8fb8c9ead8f5764a34d7bf89ee669bb94259270a6","ordinary_source":"fix(db): give 20 unguarded triggers a runtime existence check, and name every invariant (#438)\n\nA rule-inventory sweep asked which enforcement points have no prose explaining them and\nfound 29 database triggers. Checking that turned up something heavier than a documentation\ngap: assertLoadBearingInvariants guarded 9 of those 29. The other 20 could be dropped by a\nmigration rewrite and nothing would fail.\n\nThat gap is invisible by construction. Almost every test enters through the application\npath, which refuses a bad write long before the database is reached, so the suite passes\neither way. The database-layer backstop disappears silently and stays gone until someone\nattempts the raw-SQL bypass the trigger exists to refuse — the deepest form of the silent\ndegradation CP-HI-08 names.\n\nThe original list was not wrong so much as unreconciled: it was assembled by hand around\nthe guards someone had reason to worry about, and nothing ever compared it to the schema.\nSo the fix is the reconciliation, not the twenty entries — schema-trigger-coverage.test.ts\nnow fails if schema.sql grows a trigger the list does not carry.\n\nEach trigger also names the hard invariant it backs, in schema.sql rather than in a table\nelsewhere, and that adjacency is itself tested. Prose kept apart from code drifts: this\nrepository's README spent a day calling a closed issue an open blocker.\n","ordinary_source_sha256":"fade38ba2fde3b8605d3de6360805656be640181091f92467b1c2144c4dccfb4","ordinary_body_chars":1380,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":3,"insertions":161,"deletions":0,"changed_paths":["src/db/migrations.ts","src/db/schema.sql","tests/unit/schema-trigger-coverage.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-0ef57b3438b7d16b","repository_id":"agent-control-plane","source_commit_sha":"0bd2b678d4bd0df40093188ea440ac2c053dd0e8","decision_audit_anchor":"0ef57b3438b7d16b53d0ed609b496ffe37243b40ad1a6cd288f48c4b18d6b527","ordinary_source":"fix: the daemon's budget must outlast the reply timeout it contains (#629)\n\nAn owner turn crosses two process boundaries and had a deadline at each:\nthe daemon waited 60s while the CEO runtime waited 120s for the reply\ncommand it spawns.\n\nOrdered that way the inner deadline can never fire in the ordinary case —\nthe daemon has already abandoned the turn — and the eventual answer arrives\nfor a request id nobody is waiting on. #613 fixed the same shape once, for\nthe handshake.\n\nThey were two constants in two files with nothing relating them, which is\nhow they came to be ordered backwards without anything failing. The outer is\nnow derived from the inner in contracts/ceo-turn-budget.ts, asserted in the\ndaemon's constructor, and asserted again in `serve` — the runtime is the one\nside the daemon cannot observe, so an inner timeout raised there would\notherwise invert the live pair while every check stayed green.\n\nA blind review of this branch found that the first draft's central test was\ncircular: comparing the two contract exports is `margin > 0`, because both\ncome from the same derivation. It said nothing about whether the process\nthat waits on the child still reads the constant — which is the drift that\ncaused the bug. The test now reads `hermes-ceo.ts` and requires it, and\nhardcoding a larger inner timeout there makes it fail.\n\nDeliberately not changed: the sizes. Both remain under a measured turn\n(3m15s, 92 messages, 65 tool calls). The CEO and grok were asked\nindependently on #628 and both rejected raising: a CEO turn is an unbounded\ntool loop so no value fits it, `pollOnce` routes sequentially so the budget\nis also the ceiling on how long one owner message blocks the next, and\n`deliverOwnerGatePrompts` runs after that loop so a thinking CEO stalls\napprovals too. Raising here would make Phase 2b look ready while inbound was\nstill blocked.\n","ordinary_source_sha256":"5b8843839a893831c6ecb2e24f3ba25e5160909777bfc13b2049ff16d4409e14","ordinary_body_chars":1869,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":4,"insertions":182,"deletions":4,"changed_paths":["src/contracts/ceo-turn-budget.ts","src/mcp/ceo-conversation.ts","src/runtime/hermes-ceo.ts","tests/unit/ceo-conversation.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-0ef8cafdf0d11499","repository_id":"agent-control-plane","source_commit_sha":"7626d7ee366ce178478fcdb8857fce503601a1d1","decision_audit_anchor":"0ef8cafdf0d114998caba347fc47c5cb482083f25589fec319a129b5cf5acf61","ordinary_source":"docs: record the remaining verifysec CI failure and its real cause\n\nTwo sandbox tests fail only on the GitHub runner, and only in which refusal they report.\nDarwin has no enforceable hard RSS limit, so the sandbox samples RSS and calls a breach when\na sample exceeds the cap. On a loaded runner the memory-abusive child exits before any sample\nlands: nothing observes the peak, the candidate identity is never captured, and the reason\nbecomes SANDBOX_CHILD_CLEANUP_FAILED rather than SANDBOX_RESOURCE_LIMIT_EXCEEDED.\n\nThe precedence fix landed this round is necessary but not sufficient — it makes an exceeded\nlimit outrank an unobservable child, and on this runner the limit is never observed exceeded.\nThe remaining fix belongs in sampling: one prompt sample after spawn and a final read before\nthe child is reaped.\n","ordinary_source_sha256":"014f6eb23fef8852b2ee4e9acf4a0775aed70ba4d9e00adc932ff2d70bfcf57c","ordinary_body_chars":818,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":1,"insertions":29,"deletions":1,"changed_paths":["docs/HANDOFF-20260814-closeout-round2.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-120b48f40e73f330","repository_id":"agent-control-plane","source_commit_sha":"5c3e08cc0a20615773df858e6b6b1399da380278","decision_audit_anchor":"120b48f40e73f33048fcd6561feeb81cf6bd5f6c49198bd691f6e579792f9d8d","ordinary_source":"docs: hand off the closeout at 9081ed3\n\nThis session reached its context limit mid-closeout, so the state that only existed in it is written\ndown: which owner prerequisites resolved and where their credentials live, what actually blocks each\nopen item, which lane branches hold unmerged work, and the judgements made but not yet in code.\n\nThe part most easily lost is the verification protocol. Twelve lanes were returned during this\ncloseout, almost always because the code was right and its named regression test passed with the\nenforcement deleted. Blind review — the reviewer sees the diff and the original issue only, never the\nauthor's report or prior verdicts — found BLOCKERs in code that the same reviewer had passed when it\nwas shown the author's account first. Every verdict was then reproduced by mutation before merging,\nwhich is how it emerged that a reviewer naming a function is not evidence that the function is the\nenforcement.\n\nAlso recorded: three claims were narrowed to what the code can keep rather than weakened — the\nevidence export is host-anchored, traceability reports declaration coverage, and P1-15 measures\nconfinement instead of claiming a verification command cannot obtain a shell.\n","ordinary_source_sha256":"9cec1a0ef9c962cd5dd11ccfb10cd117ede1269f898b8856f951e3bcc71c2adc","ordinary_body_chars":1216,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":1,"insertions":147,"deletions":0,"changed_paths":["docs/HANDOFF-20260814.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-1a18ceae8a4645cf","repository_id":"agent-control-plane","source_commit_sha":"f14dd14ef1d8587988ac7b8368574ebf884fb556","decision_audit_anchor":"1a18ceae8a4645cf17a8fe3170ceddfdd80e9cb3b47b8fbc65417052b12cdcac","ordinary_source":"feat: a turn gets its own row, because it is not a property of the message that started it (#647)\n\nA turn lived in `inbound_messages.result_json`. That row is the *source*\nmessage's replay and reply-delivery record; a turn is a fact about the\n*target* conversation. The CEO's review of #645 named the confusion:\n\n `inbound_messages` 는 source nonce/replay fact 이고 canonical turn lease 는\n target-conversation serialization fact 라 서로 같은 사실이 아닙니다.\n\nSharing a field made the second a casualty of the first. `recordResultIf`\nreplaces the whole document, so reserving the outbound reply erased the\nclaim — the protection added in #635 covered a crash and not an ordinary\ntimeout, which is the common case at a 3m15s turn against a 120s deadline\n(#646).\n\nThe table is created empty. A claim currently sitting in `inbound_messages`\nbelongs to a turn whose outcome nobody established, and writing a row for it\nhere would assert a state this migration cannot observe.\n\nTwo test expectations went with it, and both were the same shape as the bug:\n\n - `expect(SCHEMA_VERSION).toBe(20)`, twice. It restated the constant, so it\n failed on every correct migration and caught nothing a wrong one would do.\n Replaced by what can actually go wrong — a migration added without the\n version bump, and a gap in the from/to chain.\n - one `objectContaining` per version in the receipt assertion, nine of them,\n identical but for the number. The list above it already pins order and\n ids; this only ever said \"every receipt has a checksum, only the first has\n a backup\". Said that way now.\n\nPart of #646, step 1 of #639's order.\n","ordinary_source_sha256":"c2bcc166d787af6d4503292804ad3e9a5089a8a32d24fdc31f1287d865e4e4cc","ordinary_body_chars":1626,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":4,"insertions":122,"deletions":60,"changed_paths":["src/db/migrations.ts","src/db/schema.sql","tests/unit/baseline-export.test.ts","tests/unit/database-migration-restore.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-23f26b69f816664d","repository_id":"agent-control-plane","source_commit_sha":"9b7c98e0e15ac1af88aac1013254f51b75148e0d","decision_audit_anchor":"23f26b69f816664d1a9938a97b95fc0a0d8138651ec73aebd334caf920293b5b","ordinary_source":"docs: ADR-0009 said Buzz stays a direct path, and it does not (#637)\n\nThe consequences section ended with \"Buzz remains a direct path to Hermes\",\ntwo paragraphs after \"Both of the owner's channels now terminate in the\ncontrol plane, which is what makes one context across channels a property of\nthe system\". Those cannot both hold. The contradiction went unnoticed\nbecause Buzz was out of scope on the day it was written.\n\nRead as licence, that sentence kept `buzz-acp --agent-command hermes\n--agent-args=acp` in place. `hermes acp` takes no session argument — no\n--resume, no --continue — so every Buzz exchange began its own conversation.\nEleven days of them sit in the session store beside the one the owner\nactually uses, and a surface creating a conversational actor is what\nSSOT.md:99 forbids by name.\n\nThe sentence is struck rather than deleted: the decision is a record, and\nremoving the line would hide that the mechanism was licensed by this\ndocument rather than adopted against it.\n","ordinary_source_sha256":"1c33f6ea4bfe2963e228e686947ca068a1373ed2f5fde3335920a3b266d8e130","ordinary_body_chars":993,"ordinary_body_survives":true,"removed_trailer_count":2,"residual_record_lines_removed":0,"files_changed":1,"insertions":16,"deletions":1,"changed_paths":["docs/adr/ADR-0009-owner-ingress-is-the-front-door.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-3ba6d8b1fa31e10f","repository_id":"agent-control-plane","source_commit_sha":"33a123b22decfe1cbad9e29eefdd2d9a5f812852","decision_audit_anchor":"3ba6d8b1fa31e10f6557c0e8ad40d00268078a84d40a3f8cc6aa3a66a9751de2","ordinary_source":"fix(evidence): derive the grok summary from the reviews instead of the last run\n\n`evidence/review-grok/summary.json` reported guard as ERROR/0 and review as ERROR/0 while\n`guard.json` held REVISE with 8 findings and `review.json` held BLOCK with 8. Sixteen\nfindings, including a BLOCK, read as though those areas had never run.\n\nThe cause is that the summary was written from this invocation's in-memory results. A partial\nre-run knows only about the areas it just ran, so it rewrote the whole file and recorded\nevery untouched area as errored — the mtimes show exactly that: summary.json regenerated at\n13:44, guard.json and review.json last written at 13:03 and 12:40.\n\nThis is the CP-HI-08 failure the product exists to prevent, in the product's own evidence\ntree, and pointing the other way: not a failure dressed as a pass, but real findings dressed\nas an absence. The summary now reads the per-area reports and refuses to write at all when a\nfreshly produced result disagrees with the file it just wrote.\n\nThe corrected summary is regenerated here. The findings were not lost in practice — the guard\nand review areas are represented among the filed issues (#358, #360, #361, #363, #364), which\nwere raised from the per-area files rather than from the summary.\n","ordinary_source_sha256":"2fa0e7dcf89131aabe6e43ea3a85158ccdabbac8130762b4e77475259333eab9","ordinary_body_chars":1266,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":2,"insertions":41,"deletions":6,"changed_paths":["evidence/review-grok/summary.json","scripts/grok-review.mjs"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-4001fa0211128649","repository_id":"agent-control-plane","source_commit_sha":"9e6995736b726f1998bb25c6d94c2fe74c66f5e5","decision_audit_anchor":"4001fa0211128649720bba45efa4d156b42e79e788bd721ac37ecfe727774b40","ordinary_source":"fix: a quota nobody could read is not an exhausted one (#636)\n\n`advisoryState` derived `EXHAUSTED` from `lowest === null` — the case where\nno bucket was read at all. The doctor then emitted CAPACITY_LOW with\nseverity ERROR, `confidence: \"HIGH\"`, and the advice \"wait for reset\".\n\nOn this deployment today that was grok:\n\n CAPACITY_SENSOR_FAILED provider:grok \"billing refused the stored\n credential; it has expired\"\n CAPACITY_LOW provider:grok advisoryState: EXHAUSTED\n buckets: []\n\nThe buckets array is empty because nothing was read. grok itself was\nworking the whole time — its billing token expires every six hours, and\nusing the CLI is what renews it. No reset was ever going to arrive.\n\nRouting was never affected. `allocationAdmission` distinguishes \"unknown\"\nfrom \"empty\" three lines above and suspends either way. What was wrong is\nwhat a reader is told, and a reader acting on \"exhausted\" waits. I did: I\nreported to the owner that blind review was down on the strength of this\nfinding, and it was not.\n\nSo the absence gets its own value. UNKNOWN is not a degree of low, and the\ndoctor's low-capacity finding no longer fires on it — CAPACITY_SENSOR_FAILED\nalready says the true thing, and a second finding beside it stated a false\none.\n\nThe second branch is the same distinction: a provider can answer with\nbuckets whose remaining percent is unknown, which `admission` already treats\nas no reading, so the advisory value has to agree or the two disagree about\none observation.\n","ordinary_source_sha256":"16504dd9588c60ecf494c08edae0347c76d4c10e509bab5747977e1fe1911b8e","ordinary_body_chars":1592,"ordinary_body_survives":true,"removed_trailer_count":2,"residual_record_lines_removed":0,"files_changed":3,"insertions":84,"deletions":2,"changed_paths":["src/capacity/capacity-monitor.ts","src/doctor/doctor.ts","tests/unit/unread-quota-is-not-exhausted.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-431dceed9013cb2b","repository_id":"agent-control-plane","source_commit_sha":"8461d82597abb5bf53742e3aec7283f3ed446d13","decision_audit_anchor":"431dceed9013cb2bcf20f3acfee25ca186db42b5a01113d2a5a34c7dd4d96b5c","ordinary_source":"feat(telegram): production ingress, owner prompt records, and retained-consumption proof (#436)\n\n* fix(telegram,ceo): keep the owner channel receiving and keep a consumed approval consumed\n\nTwo blockers from the blind review, both product-breaking and independent.\n\npollOnce delivered owner-gate prompts before getUpdates, and a denied prompt or a Telegram\nsend failure threw past the inbound batch. One parked run whose prompt could not be sent\nstopped every inbound owner command — including the reply that would have resolved that run.\nInbound now runs first and prompt delivery cannot throw: a failure is reported and the outbox\nkeeps the signal for the next poll. The principle is that an incidental send must never block\nthe primary receive path.\n\nThe second is a layering error. assertConsumedApproval asked \"is there a currently admitted\napproval\" by calling assertApproval, which answers from inbound_messages — a replay cache\nwith a 24h TTL that is pruned on the next successful admit. So a correctly admitted *and\nconsumed* approval stopped satisfying the human gate once any later message arrived after the\nwindow, and GitHub merge re-reads that gate. There were two such call sites, not one: the\nretained-read path in assertOwnerDecisionReceipt had the same dependency, so fixing only the\nfirst left the gate still closing. Recording a decision still requires live admission — that\nis when authority is exercised. Re-reading a retained artifact does not, because admission\nwas proven at consumption time and that row is durable. The consumption record now carries\nthe decision itself rather than pointing at something that expires.\n\n* fix(db,tests): reconcile the required-trigger list, and annotate the v17 triggers\n\nRebasing onto the four merged lanes surfaced three things.\n\nThe trigger-coverage check claimed to reconcile schema.sql against the required-trigger\nlist. It did not — it compared schema.sql to the live database, which is a different and\nweaker statement. A migration could add a trigger that was created, annotated, and still\nabsent from the list whose whole purpose is to make its later disappearance an error. The\nmissing assertion is now there, and removing an entry from the list fails it.\n\ntelegram_owner_prompts_immutable and telegram_owner_prompts_no_delete had no invariant\nnamed above them; the adjacency check caught both. They back CP-HI-07 and CP-HI-08.\n\nThe launcher env log carried Buzz in field 3 and Telegram in 3-6 on the two branches that\nwrote it, so each lane's assertions read the other's values. The log is now a superset with\nTelegram in 3-6 and Buzz last, which leaves the Telegram parsers untouched and moves the\ntwo #423 parsers to field 7. Both lanes' assertions survive rather than one displacing the\nother.\n","ordinary_source_sha256":"1eac8410488da04660c9065b275b87251d0804ec72d93d153a594c9ab4165353","ordinary_body_chars":2767,"ordinary_body_survives":true,"removed_trailer_count":1,"residual_record_lines_removed":3,"files_changed":29,"insertions":4383,"deletions":128,"changed_paths":["deploy/install-launchd.sh","src/app/control-plane.ts","src/ceo/owner-authority.ts","src/ceo/production-gate.ts","src/daemon/agentcpd.ts","src/daemon/daemon.ts","src/db/backup.ts","src/db/database.ts","src/db/migrations.ts","src/db/schema.sql","src/doctor/repair.ts","src/ingress/ingress-guard.ts","src/ingress/telegram-polling.ts","src/ingress/telegram-router.ts","src/ingress/telegram.ts","tests/e2e/real-component-integration.test.ts","tests/helpers/harness.ts","tests/helpers/run-agentcpd-main.ts","tests/unit/baseline-export.test.ts","tests/unit/core-hardening.test.ts","tests/unit/daemon-startup.test.ts","tests/unit/database-migration-restore.test.ts","tests/unit/deploy-launchd.test.ts","tests/unit/ops-hardening.test.ts","tests/unit/run-gate-r2.test.ts","tests/unit/runtime-hardening.test.ts","tests/unit/schema-trigger-coverage.test.ts","tests/unit/telegram-ingress.test.ts","tests/unit/verify-hardening.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-45caf6be5b46889d","repository_id":"agent-control-plane","source_commit_sha":"820df6796792481894c72bfd4995acec386de0fa","decision_audit_anchor":"45caf6be5b46889d98f7607d65791be364d343b06cc1d39a5801742195aeb721","ordinary_source":"fix(db): give 20 unguarded triggers a runtime existence check, and name every invariant (#438)\n\nA rule-inventory sweep asked which enforcement points have no prose explaining them and\nfound 29 database triggers. Checking that turned up something heavier than a documentation\ngap: assertLoadBearingInvariants guarded 9 of those 29. The other 20 could be dropped by a\nmigration rewrite and nothing would fail.\n\nThat gap is invisible by construction. Almost every test enters through the application\npath, which refuses a bad write long before the database is reached, so the suite passes\neither way. The database-layer backstop disappears silently and stays gone until someone\nattempts the raw-SQL bypass the trigger exists to refuse — the deepest form of the silent\ndegradation CP-HI-08 names.\n\nThe original list was not wrong so much as unreconciled: it was assembled by hand around\nthe guards someone had reason to worry about, and nothing ever compared it to the schema.\nSo the fix is the reconciliation, not the twenty entries — schema-trigger-coverage.test.ts\nnow fails if schema.sql grows a trigger the list does not carry.\n\nEach trigger also names the hard invariant it backs, in schema.sql rather than in a table\nelsewhere, and that adjacency is itself tested. Prose kept apart from code drifts: this\nrepository's README spent a day calling a closed issue an open blocker.\n","ordinary_source_sha256":"fade38ba2fde3b8605d3de6360805656be640181091f92467b1c2144c4dccfb4","ordinary_body_chars":1380,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":3,"insertions":161,"deletions":0,"changed_paths":["src/db/migrations.ts","src/db/schema.sql","tests/unit/schema-trigger-coverage.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-50d2354c5c9210d1","repository_id":"agent-control-plane","source_commit_sha":"68d8b9c0a9fc5bc7e6c6d0964c8bcb768ef8e04c","decision_audit_anchor":"50d2354c5c9210d15f01bbddf4860e1fd15e028eb47e89421d88d16289fa4ba6","ordinary_source":"docs: synchronise the handoff with what has actually landed\n\nThe lane table now points at the PRs rather than at local test counts, because CI is the only\nsignal this repository trusts. The capacityobs SURVIVAL entry is rewritten: enumerating the\njudgement's inputs first showed that neither the reviewer's framing nor mine was right —\nSURVIVAL needs every required role uncovered, which happens because every provider is\nSUSPENDED, so the judgement and the dispatch refusal are both correct and the defect was a\nmissing re-evaluation edge.\n","ordinary_source_sha256":"95757ff5dd39e9b907addd40b2681655222d100f2d75f186240fae0143c8741e","ordinary_body_chars":541,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":1,"insertions":31,"deletions":24,"changed_paths":["docs/HANDOFF-20260814-closeout-round2.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-56a540b834736c43","repository_id":"agent-control-plane","source_commit_sha":"4c90d3c19f5b4d9a1331ecbea1b951178b2a53f0","decision_audit_anchor":"56a540b834736c43b5fd2f7bb9c031dbf6ed753e31b3b0c37d38ec512d0d23cf","ordinary_source":"fix(buzz): match the transport to the CLI this host actually has (#433)\n\n#423 was found by live probing, not by a test. The adapter passed `--json` to `channels\nlist`, which the installed CLI rejects outright, and read an `id` field the relay does not\nsend. Neither was visible from inside the suite: every other test replaces this class with\na double, and a double agrees with whatever the adapter believes. The fixtures under\n`tests/fixtures/buzz-cli/` are captured from the installed CLI so the argv and the field\nnames have a second source.\n\n`available()` now answers for the purpose it is given. Reporting health from \"the relay has\nrooms in it\" is #423 in a new form: no production purpose is named after a room — they are\nall `role:projectId` — so the daemon would report a healthy channel and then fail at the\nfirst dispatch, which is exactly the failure mode the issue describes.\n\nThe live capture delivers a fenced envelope to the relay, reads it back carrying its\ngeneration, and admits the returning identity through the production ingress —\nIngressGuard.admit -> BuzzActorIngress.bindActor -> SessionRegistry.bindBuzzActor — with the\ndeployment allowlist naming one actor, so a different actor is refused with\nINGRESS_ACTOR_NOT_ALLOWLISTED rather than by having no row to find. It shows the doctor's\nCTO_BUZZ_NOT_CONNECTED clearing for a connected project CTO, and records PARTIAL: #243 also\nrequires a HEALTHY doctor and this deployment does not reach one, so #243 stays open.\n\nTwo production gaps the capture exposed. The launchd launcher pinned PATH to the system\ndirectories while the CLI lives under a user-local bin, so the daemon could never exec the\nbinary a hand-run capture found immediately; the absolute path is now resolved at install\ntime. And the CLI payload was cast rather than checked, so a row that matched by name while\nomitting channel_id produced an undefined address that available() called usable.\nIt runs on the system clock and refuses to write evidence whose timestamps disagree with\nthe relay's own, after an independent review found the P0-14 gate canary had shipped with a\ncompleted_at two days before its own GitHub start.\n","ordinary_source_sha256":"9daecfd08c795ce2d1115b0d4ca788b6f49cbee104808ea160ddeb9ab651b584","ordinary_body_chars":2167,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":15,"insertions":1328,"deletions":30,"changed_paths":["README.md","deploy/install-launchd.sh","docs/ACCEPTANCE.md","evidence/p0-09-buzz-live-delivery.json","scripts/capture-buzz-live.ts","src/buzz/buzz-adapter.ts","tests/fixtures/buzz-cli/README.md","tests/fixtures/buzz-cli/channels-get.json","tests/fixtures/buzz-cli/channels-list.json","tests/fixtures/buzz-cli/cli-version.txt","tests/fixtures/buzz-cli/messages-get.json","tests/helpers/fixtures.ts","tests/helpers/harness.ts","tests/unit/buzz-cli-surface.test.ts","tests/unit/deploy-launchd.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-5b3c19da588ec1d0","repository_id":"agent-control-plane","source_commit_sha":"e626badbee7958db4976375587daa9c8fede3efd","decision_audit_anchor":"5b3c19da588ec1d0792e3edc2bb0398118189f426ca43355acf2882bf72fb876","ordinary_source":"feat(runtime,review): reviewer egress is enforced at the kernel and measured per invocation\n\n#419, #360. Reviewer isolation could not positively prove provider-only egress on macOS: a seatbelt\nprofile that denies network outright breaks dyld, so the profile had to be allow-default, and the\nbest the runtime could do was refuse to attest. Every real reviewer invocation therefore failed\nclosed with ISOLATION_LOST, which meant the mandatory blind review had no working path.\n\nThe owner supplied enforceable infrastructure: a profile that denies all TCP and UDP at the kernel\nexcept loopback, and a CONNECT proxy that is consequently the only route off the machine. A\nreviewer now runs as sandbox-exec -f env HTTPS_PROXY=... , and the\ndaemon owns the allowlist per provider rather than reading the operator's file, so a Claude\nreviewer cannot reach an OpenAI endpoint.\n\nAttestation is a measurement of this invocation, not a property of the setup. The first version\nproved only that the proxy answered: it checked an allowlisted host returned 200, a *.invalid name\nreturned 403, and a direct socket was EPERM. A .invalid name is refused by any resolver, so an open\nproxy that allowed every real host passed all three and the run stored a PASS carrying an isolation\nclaim nobody had measured. The probes now include a real, reachable, non-allowlisted host, any\nALLOW outside the generated allowlist is fatal in both independent readers, the proxy's START\nrecord must bind the exact allowlist bytes the daemon wrote, and the probes run through\nrunProfileCommand under the composed profile rather than from the test process.\n\nThe egress JSONL is bound to the run's evidence, scanned for credential-bearing content before the\nrecord is constructed and again at the gate.\n\nVerified by mutation: removing the unexpected-ALLOW rejection fails the open-proxy regression, and\nthat regression was confirmed failing before the fix landed.\n","ordinary_source_sha256":"eb7e8b263fd39177e9dc6c2269872e85f1ae0512fe05422df0571973e6094fca","ordinary_body_chars":1960,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":21,"insertions":2149,"deletions":218,"changed_paths":["README.md","docs/OPERATIONS.md","docs/SECURITY.md","docs/STATUS.md","docs/reviewer-egress.md","src/app/control-plane.ts","src/db/artifacts.ts","src/review/blind-review.ts","src/runtime/cli-adapters.ts","src/runtime/provider.ts","src/runtime/reviewer-egress.ts","tests/helpers/harness.ts","tests/helpers/production-adapter.ts","tests/integration/pipeline.test.ts","tests/scenarios/doctor-ingress-bootstrap-daemon.test.ts","tests/unit/codex-reviewer-session.test.ts","tests/unit/continuity-r2.test.ts","tests/unit/ops-r2.test.ts","tests/unit/review-r2.test.ts","tests/unit/reviewer-egress.test.ts","tests/unit/run-gate-r2.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-6ace14eeff8e0235","repository_id":"agent-control-plane","source_commit_sha":"2e0e532df25988a95d2d06ef8255a90a2404184c","decision_audit_anchor":"6ace14eeff8e0235d9231494ece08aa25521a60ab9c3d8cfbf1b4e29c6851018","ordinary_source":"fix(guard): a worktree target names both its checkout and its disposable tree\n\n#426. Guarding `git worktree` collapsed two facts into one identity string, and each collapse\nproduced the opposite defect.\n\nNaming the registered checkout as the touched worktree made concurrent verification impossible: a\nsecond run on a different branch of the same repository could not create its tree, because the\nfirst run's checkout claim collided with it — `ClaimRegistry` can only mint a checkout\n`worktree_id`, so every run contends on the same identity by construction. P0-12's own acceptance\nline \"different branches proceed concurrently\" was false on the path that completes a run.\n\nNaming only the disposable tree fixed that and removed the filesystem target from the claim system\nentirely: a `GIT_WORKTREE` whose target sat inside another run's claimed checkout was admitted,\n`cleanup` would `rmSync` it, and the grant settled clean — a disposable-path identity can never\ncollide with a checkout claim.\n\nA request now carries both facts. The repository and checkout answer claim conflicts and\ncontainment; the disposable tree answers exclusion between runs. Two runs creating distinct trees\nin one repository do not conflict; two runs reaching for the same tree still do; and a target\ninside another run's claimed checkout is refused whatever tree identity the caller supplies.\n\n`ClaimRegistry` deliberately still mints only canonical registered-checkout claims. Making a\ndisposable tree claimable would have made \"two runs, same tree\" a claim conflict rather than\nsomething the guard infers, but it also widens what a claim means for every other caller, and the\nguard can already answer that question from the two facts it now has.\n\nBoth blind-review reproductions are tests: cleanup refused before it can `rmSync` a path inside\nanother run's claimed checkout, and a checkout-shaped grant refused regardless of the\n`targetWorktreeId` supplied.\n\nVerified by mutation rather than by report: dropping the `worktreePathOverlap` conflict fails five\nguard-hardening tests. Note that mutating `relativePath` to always return null does not — that\nfunction is not this path's enforcement, which is worth knowing before trusting it as one.\n","ordinary_source_sha256":"23bb75316814ad80ec2a33fd2bbc62f9f5569920b3281987f05dab0bb67d4f41","ordinary_body_chars":2224,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":8,"insertions":821,"deletions":94,"changed_paths":["src/doctor/repair.ts","src/git/git.ts","src/guard/managed-write-guard.ts","src/verify/verification-engine.ts","src/verify/worktree.ts","tests/unit/guard-hardening.test.ts","tests/unit/verify-hardening.test.ts","tests/unit/verify-r2.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-6fa12e79e96b6cc1","repository_id":"agent-control-plane","source_commit_sha":"6c721bed2b2c894544b056bac8e130e84e1e69de","decision_audit_anchor":"6fa12e79e96b6cc1750d4ba244fe40ddc503c17a134ab08875acd96852afbc35","ordinary_source":"test(cli): prove CP-HI-02 by behaviour, and name the paths this repo does not verify\n\nThe CLI-has-no-database property rested partly on reading src/cli/agentctl.ts as text and\nasserting patterns are absent. A renamed import or a computed member access walks past that,\nand the existing process-level test only covers the happy path, with a daemon listening — not\nthe path a direct-database fallback would actually be written for.\n\nThe new test runs the real CLI process with nothing on the socket and an isolated HOME, and\nasserts it creates no state of its own. Mutation-checked both ways, which is the interesting\npart: a bypass written as `mkdirSync` is caught by the regex and *not* by a behavioural test\nplaced on an unreached code path, while `nodeFs[\"mkdir\" + \"Sync\"]` on every command path is\ninvisible to the regex and fails the behavioural one. Both are kept; they fail on different\nthings.\n\nSTATUS.md now names three paths a green suite would otherwise imply are covered: the Linux\nhard-memory branch, which is asserted only as a pure function return while every sandbox test\nis Darwin-only and CI is macos-15; the full-vertical e2e, which is opt-in and is the `1\npending` in traceability; and `pnpm trace` run without ACP_VITEST_RESULTS, which still runs\nthe suite a second time and now says so.\n","ordinary_source_sha256":"de94b7e945ef8c5489b00e5b8dd2d1902139294f1c81cba43d65b6e8f9b2d10f","ordinary_body_chars":1308,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":3,"insertions":66,"deletions":0,"changed_paths":["docs/STATUS.md","src/tools/traceability.ts","tests/unit/operator-socket.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-77018bc628e62482","repository_id":"agent-control-plane","source_commit_sha":"42fb00e70631b6778da2f52542f5c8634c95f7ba","decision_audit_anchor":"77018bc628e624821afd1e82c6ff48d224c0aa81e04aad5cf18b02c6a5882763","ordinary_source":"fix(github): wire App finalization and exact post-merge proof\n\nUse the daemon-owned GitHub App credential path for production gates and preserve exact merge and post-merge verification evidence.\n","ordinary_source_sha256":"1ede0c2c035ff81900befb43f2a91ba5c94be3ce76587497425eefabc27712ab","ordinary_body_chars":195,"ordinary_body_survives":true,"removed_trailer_count":4,"residual_record_lines_removed":0,"files_changed":17,"insertions":1367,"deletions":244,"changed_paths":["HANDOFF-REPORT.md","evidence/p0-14-live-gate-merge-postmerge.json","evidence/p0-14-live-gate-refusals.json","src/app/control-plane.ts","src/core/reason-codes.ts","src/github/credential-store.ts","src/github/github-kernel.ts","src/runtime/cli-adapters.ts","tests/helpers/fake-github.ts","tests/helpers/harness.ts","tests/process/hermes-bootstrap-process.test.ts","tests/scenarios/finalizer.test.ts","tests/scenarios/github-hardening.test.ts","tests/scenarios/github-kernel.test.ts","tests/unit/github-app-credential-store.test.ts","tests/unit/github-r2.test.ts","tests/unit/trusted-core.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-83c6c0a5f5542b97","repository_id":"agent-control-plane","source_commit_sha":"cba208abc260605eabf4e0e9f38e18bb3dcfa682","decision_audit_anchor":"83c6c0a5f5542b977e22d0a1c37fcdb292fe3d1a58840f2b5e83830a326d5019","ordinary_source":"harden(verify,github,session): close P1-14, P1-15, P1-06 and the P1-03 claim edge (#435)\n\n* harden(verify,github,session): close P1-14, P1-15, P1-06 and the P1-03 claim edge\n\nP1-15's parser hole is closed at argv[0], and the filed reproduction — `env FOO=1 bash` —\nis now in the regression rather than only the forms where the shell is argv[1]. The claim\nthis locks stays the narrow one #247 recorded: an allowlist that must contain `node` cannot\nstop a verification command reaching a shell, so what is enforced is confinement. The inside-shell\nproof the docs cite execs `/bin/sh` out of an allowlisted `node` and records the actual\nkernel result for production-layout state reads, writes outside the worktree, network, fork\nunder RLIMIT_NPROC, SIGXCPU and the observed RSS breach.\n\nP1-14's token no longer enters a child environment, and the lock is behavioural: the\ncredential store cannot spawn, because it never imports the means to, and the request\ncompletes with nothing on PATH. The previous assertion compared method names and would have\npassed with `GH_TOKEN` put back on a `gh` child. The boundary file's own P1-14 cases are\ndeleted rather than ported: they constructed `GhCliClient`, the gh-subprocess client the App\ncredential store replaced, and a test that builds a class nobody ships proves nothing.\n\nP1-06 moved the CTO and continuity sites to the managed runtime root; Hermes CEO\nconstitution was still recording `process.cwd()`. Under launchd that is wherever the job\nhappened to start, and the new workdir trigger is BEFORE UPDATE — so a cwd written there\ncould never be corrected afterwards.\n\nThe lane was written against v14 and lands after a v15 that already exists, so its\nmigration is renumbered to v16 rather than merged into it.\n\n* fix(tests): make the v14 fixture carry the triggers a real v14 database has\n\nRebasing onto the merged trigger-coverage check broke two things, both real.\n\nThe v14 fixture is assembled from V11_SCHEMA plus deltas. A database that actually reached\nv14 got there either by bootstrap from the full DDL or through the v12 migration, whose\nentire body is `exec(schemaDdl())` — so it carries every trigger schema.sql declared. The\nfixture skipped that replay and was therefore unrepresentative in exactly the respect its\nown name claims. It now replays the DDL and drops what was introduced after v14, so it is\na v14 database rather than a current one wearing a v14 version number.\n\nsessions_workdir_immutable had no invariant named above it, which the new adjacency check\ncaught. It backs CP-HI-01.\n","ordinary_source_sha256":"9b24b45744a458f0026746d9148709421a0df1baaf9bd19fc2ab661d091c04e4","ordinary_body_chars":2552,"ordinary_body_survives":true,"removed_trailer_count":1,"residual_record_lines_removed":3,"files_changed":29,"insertions":2523,"deletions":215,"changed_paths":["README.md","docs/ACCEPTANCE.md","docs/adr/ADR-0004-verification-sandbox-isolation.md","src/app/control-plane.ts","src/bootstrap/hermes-bootstrap.ts","src/claims/claim-registry.ts","src/continuity/continuity-kernel.ts","src/contracts/verification-command.ts","src/cto/cto-lifecycle.ts","src/db/backup.ts","src/db/database.ts","src/db/migrations.ts","src/db/schema.sql","src/github/credential-store.ts","src/github/github-kernel.ts","src/verify/sandbox.ts","tests/helpers/production-adapter.ts","tests/scenarios/doctor-ingress-bootstrap-daemon.test.ts","tests/unit/baseline-export.test.ts","tests/unit/continuity-hardening.test.ts","tests/unit/cto-registry-r2.test.ts","tests/unit/database-migration-restore.test.ts","tests/unit/github-app-credential-store.test.ts","tests/unit/github-r2.test.ts","tests/unit/handoff-p1-boundaries.test.ts","tests/unit/outbox-buzz-claims-r2.test.ts","tests/unit/trusted-core.test.ts","tests/unit/verify-hardening.test.ts","tests/unit/verify-r2.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-8826ee094751e0ef","repository_id":"agent-control-plane","source_commit_sha":"54ec4eea774d8c6bbcfb072d1cd9bc8d682ba385","decision_audit_anchor":"8826ee094751e0ef82eeb9a29d94a902ffcd57c2ed677fcdee2c135987011e54","ordinary_source":"fix(ci): run the suite in forks and declare the JSON reporter in config\n\nThe CI failure was never a failing test. `pnpm test` exited 139 with `Segmentation fault:\n11` while every file it had reached was green — a crashed worker, not a red suite. The same\ncrash explains the earlier \"Vitest JSON reporter did not produce a result set\": the process\ndied before writing the file, and the error appended captured stdout, which made a missing\nresult look like a corrupt one.\n\nThis suite loads a native addon and starts real sandboxed children under resource limits.\n`pool: \"threads\"` runs that in worker threads, where a native addon can take the whole worker\ndown; `pool: \"forks\"` gives each file its own process.\n\nThe JSON reporter moves into the config's CI branch. Passing it as `pnpm test -- --reporter=…`\nforwarded `--` to vitest, which then has to decide whether what follows is a flag or a test\nfilter — an ambiguity worth removing from a command whose output is the release evidence.\n","ordinary_source_sha256":"b18cfd385dda267212670ec94c11cdbc166616ad3866fd628936e60eda2d8cd7","ordinary_body_chars":988,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":3,"insertions":1554,"deletions":6,"changed_paths":[".github/workflows/ci.yml","evidence/junit.xml","vitest.config.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-8dbd6ece65df6bf7","repository_id":"agent-control-plane","source_commit_sha":"a9c8c56a00388f1f032758c522d5575df1c764b2","decision_audit_anchor":"8dbd6ece65df6bf7716342210364b4d0e7c9678e436286bba37ef79f9d63bf7e","ordinary_source":"fix(ci): run the suite once and let trace read that run's results\n\n`pnpm trace` obtained its JSON reporter pass by running the whole suite a second time. That\ndoubled a suite which starts real sandboxed children under RLIMIT_NPROC and memory caps, and\non the runner the second run produced no output file while the first passed — surfacing as\n\"Vitest JSON reporter did not produce a result set\" with captured stdout appended, which\nreads like a corrupt result rather than a missing one.\n\nThe test gate now emits the JSON reporter output alongside its normal reporter, and trace\nconsumes it through ACP_VITEST_RESULTS. Beyond halving the CI cost this makes the\ntraceability report describe the same execution the gate judged, rather than a second run\nthat could disagree with it. Running `pnpm trace` alone still works: with no supplied result\nset it falls back to running Vitest itself.\n","ordinary_source_sha256":"2f6a47bbb6af2562e7e3c30076df4173e9372efd711df13ff530b09f9bc99d4b","ordinary_body_chars":887,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":4,"insertions":34,"deletions":9,"changed_paths":[".github/workflows/ci.yml","evidence/traceability.json","evidence/traceability.md","src/tools/traceability.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a0bf288e0dd97d24","repository_id":"agent-control-plane","source_commit_sha":"97f5d0a3e4c9e6b052f52acd1fd2b565eaffe854","decision_audit_anchor":"a0bf288e0dd97d24248bcf6184624bfbfeaf7b7f4697aa072cb49ec89ff9d0e2","ordinary_source":"fix: the timeout sentence stops asking the owner to resend (#643)\n\nThree corrections have landed on this one sentence today, and a fourth\nbefore it shipped. Each was the same mistake in a different place.\n\nIt said \"Nothing was lost; ask again.\" The first correction was that this\nseam cannot see whether anything was lost: the reply command resumes the\nowner's own conversation, so the CEO may already have written part of an\nanswer into it (#633).\n\nThe second is that \"ask again\" is not advice — it is a mechanism. A resent\nmessage is a new update with a new nonce and a new turn id, so nothing in\nthe duplicate protection treats it as the same turn, and the transcript gets\nthe exchange twice. The sentence written to help the owner recover was the\npath by which the thing being prevented happened (#641).\n\nThe third came from the CEO's judgement on #641: the automatic path is held\nand the owner keeps an explicit way through.\n\nThe fourth is why this commit does not say that. An earlier draft here read\n\"a new message on this chat is held rather than run\" — and the gate that\nwould hold it does not exist yet. That sentence states a false fact about\nthe system, which is the same defect as \"Nothing was lost\" pointed the other\nway. A blind review caught it in the branch before it merged.\n\nSo it says only what is true now and stays true after the gate lands: the\nturn is unresolved rather than failed, and a resend is a second turn rather\nthan a retry. The second half is a fact about how turns are identified, not\na promise about machinery, so it does not expire.\n\nFour tests, mutation-proved against the old wording. One of them refuses any\npromise of a hold, so the draft that was caught in review cannot come back.\n\nPart of #641.\n","ordinary_source_sha256":"859e6b4ad001e8728d639f904e8c1ce3774d41c588b79d9a9d9214de8039731c","ordinary_body_chars":1739,"ordinary_body_survives":true,"removed_trailer_count":1,"residual_record_lines_removed":0,"files_changed":2,"insertions":63,"deletions":5,"changed_paths":["src/daemon/agentcpd.ts","tests/unit/ceo-unavailable-sentence.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-a6950ee840587dbc","repository_id":"agent-control-plane","source_commit_sha":"11cf9c3422ac2bb6cfb6d6ee8bfa079501935be4","decision_audit_anchor":"a6950ee840587dbc9a224ad374e942e7954228ba58bc32ecfa00a775784a36d6","ordinary_source":"docs: vendor the terminology SSOT and enforce it mechanically (#437)\n\n* docs: vendor the terminology SSOT and enforce it mechanically\n\nThe owner's 2026-08-14 decision fixed the meaning of eight contested words. It lived\noutside the repository, where nothing could hold the code to it.\n\nThe check tests collocations, not words. Every contested word — session, actor, run,\ngate, evidence, binding — has legitimate uses here, so a word ban would have produced\nthousands of hits and been switched off inside a week. Each rule instead encodes the\nspecific confusion the decision was written to prevent, and names the replacement term,\nso a failure says what to write rather than only what not to.\n\nFive sites called a channel identity an `actor` immediately beside allowlist membership,\nwhich is exactly the reading the decision forbids: allowlist presence looking like\nauthority. Reworded. The reason code INGRESS_ACTOR_NOT_ALLOWLISTED keeps its name — it is\npublished and verify-reason-codes refuses removals, so the external contract outranks the\nrename there.\n\nAlso records the measured cost of the `conversational actor` change, since the estimate\nbehind it had not been counted: one migration is achievable, but ~200 code references move\nwith it, and the v15-v17 chain is held by unmerged lanes.\n\n* docs(terminology): field names are an interface, not prose\n\nRenaming a term renames the fields that carry it, and the two fail differently. Wrong prose\ngets noticed by whoever reads it. A renamed field goes silent: the reader gets nothing, with\nno error to say so.\n\nThis happened while applying the decision. STATUS.json's `gate` became\nLEGACY_FIELD__SEE_CURRENT_PHASE_MARKER with the live value moved to `current_phase_marker` —\nthe rename the decision asked for. It blinded a monitor reading `.gate` for three minutes.\nNothing was broken; the value simply became a string no case pattern matched.\n\nThree rules, plus the rename ledger they need to be checkable. The keep-the-old-key pattern\nis recorded as normative because the value itself names the new destination, so a consumer\nthat only knows the old name reads \"moved\" rather than \"absent\".\n\nNotes that this repository already implements the principle for reason codes, and that the\nsame allowlist is why INGRESS_ACTOR_NOT_ALLOWLISTED keeps `actor` while its prose does not:\na published contract outranks a rename.\n","ordinary_source_sha256":"9093565ae614284bfb755d9fb29f95b3e927e78466f1f531b66527253c017767","ordinary_body_chars":2372,"ordinary_body_survives":true,"removed_trailer_count":1,"residual_record_lines_removed":8,"files_changed":9,"insertions":475,"deletions":7,"changed_paths":[".github/workflows/ci.yml","README.md","docs/STATUS.md","docs/TERMINOLOGY.md","package.json","scripts/verify-terminology.mjs","src/ceo/owner-authority.ts","src/daemon/agentcpd.ts","src/ingress/ingress-guard.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-ac85b82316ac5980","repository_id":"agent-control-plane","source_commit_sha":"1285e819618af2f69e04d7d36c1f2c8233fda44e","decision_audit_anchor":"ac85b82316ac598040bb8fe813a64a2879465f72d70fbb28bcef928f7725b897","ordinary_source":"feat: one turn at a time on the CEO's canonical session (#634)\n\n* feat: one turn at a time on the CEO's canonical session\n\nThe reply command resumes one conversation by id, and the runtime fires it\nwith `void` and keeps no queue (hermes-ceo.ts:341). Two overlapping turns\ntherefore both reach `hermes chat --resume ` and interleave in a\ntranscript the CEO carries forward as context for everything after it. That\ncannot be unwound, and the CEO cannot tell it happened.\n\nNothing enforces this today. The property holds only because\n`TelegramLongPoller.pollOnce` awaits each update in turn — the stack frame\nis the mutex, and #630 is about removing that await. So the invariant is\nmade explicit here first, while it is still true, rather than after it\nstops being.\n\nA second turn is refused rather than queued. A queue would hold the caller\nfor the length of a turn, which is the stall the port is being taken out of\nthe poll loop to remove; and the ordering a queue imposes belongs to #631,\nwhere the update is durable. Refusing says the true thing now: this turn did\nnot start.\n\nThe flag is set after the checks that refuse without reaching the session,\nso a failure that never touched the CEO does not lock it, and cleared in a\n`finally` including the timeout path — a turn that timed out is over as far\nas this port is concerned, and holding the flag would cost the owner their\nCEO after one slow message.\n\nMutation-proved: replacing the guard's condition with `false` kills\n\"refuses a second turn while the first is still open\". The test asserts the\nsecond turn never reached the peer, not only that the reason code came back\n— a refusal that still sent the message would satisfy the code and cause the\ninterleaving anyway.\n\n* fix: two sentences the owner is shown were not true\n\nThese are the whole of what the owner sees when the CEO route refuses. They\ngo into a chat, so a claim in one reads as a fact the system checked.\n\n**\"Nothing was lost; ask again\"** is not observable from this seam. The reply\ncommand resumes the owner's own conversation, so when the deadline passes the\nCEO may already have written part of an answer into it, and \"ask again\"\ncontinues on top of that rather than starting over. It now says what is known\nand points at the one place the truth is visible.\n\n**A stale binding was reported as an undeliverable answer.** `STALE` had no\nsentence and fell through to \"answered with something this route cannot\ndeliver\". `ask` refuses a superseded socket *before* speaking to it — the\nexisting port test asserts the peer receives nothing — so the owner was told\nabout an answer that was never requested, on the one occasion when the\nidentity of who answers had just changed.\n\nFound by the third test here, which requires every CEO_CONVERSATION_* code to\nhave its own sentence. A code added without one falls through to the not-text\ndefault, which tells the owner the CEO answered when it never did. That is\nhow STALE came to be wrong, and the test fails on 6 codes and 5 sentences\nrather than waiting for someone to read them.\n","ordinary_source_sha256":"cb3c162089235c9201cf304b8ea6d1fd6513d0ace71d510dfcafb9a77f80544e","ordinary_body_chars":3060,"ordinary_body_survives":true,"removed_trailer_count":2,"residual_record_lines_removed":6,"files_changed":5,"insertions":181,"deletions":2,"changed_paths":["src/core/reason-codes.ts","src/daemon/agentcpd.ts","src/mcp/ceo-conversation.ts","tests/unit/ceo-conversation.test.ts","tests/unit/ceo-unavailable-sentence.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-b4647e5b48ad0f67","repository_id":"agent-control-plane","source_commit_sha":"0be7a992d995e03d7452f68952ecb8372087e64f","decision_audit_anchor":"b4647e5b48ad0f678c113b8fde754e8f07e3e7cea15c3de4a98fa6b3b2e9d493","ordinary_source":"feat(capacity): let an authenticated observation outlive a collector that cannot read quota (#434)\n\n* feat(capacity): let an authenticated observation outlive a collector that cannot read quota\n\nP0-11 was right to delete the provenance-free capacity file, and the consequence was that\nnothing could dispatch: this host's `/usage` surfaces need human interaction, so every\ncollector reading is ERROR, and unknown capacity is correctly not routable.\n\nAn operator observation is a different thing from that file. It records who observed it,\nwhen, and through which daemon-stamped surface, and it expires on the existing staleness\nrule. What makes it usable is narrow: a collector ERROR is the *absence* of a reading, not a\nreading, so it no longer replaces an observation that has not expired. A collector that\nsucceeds always wins, including when its quota is lower — a measurement outranks a\nrecollection — and an expired observation is replaced by the honest ERROR.\n\nThe gate still refreshes. An earlier shape skipped the probe while an observation was\ncurrent, which turned every §14.2 allocation gate into a cache: a collector that had come\nback and now reported exhaustion could not refuse the run. Preserving inside `refresh` is\nwhat protects the observation, so the skip was both redundant and harmful and is gone.\n\nPreserving for admission is not allowed to hide the probe failure. The preserved reading\ncarries the collector error it displaced, and the doctor reports CAPACITY_SENSOR_FAILED off\nit, because CP-HI-08 does not permit a probe failure to be displayed as a pass.\n\nReverted before landing: a refusal for an observation older than the newest stored reading.\nIt rejected the input docs/capacity-source.md instructs the operator to send — the\nprovider-reported observedAt, necessarily in the past, against collectors that stamp an\nERROR every four minutes — and rejected it with the reason code #424 was filed under. New\ncode that refuses the documented path is the thing that is wrong.\n\n* fix(#424): give dispatch the staleness boundary completion already had\n\nassertCompletionAllowed re-evaluates continuity before trusting a SURVIVAL verdict.\ndispatch did not: it read ContinuityGate.mode() and refused, however old the verdict was.\nSo a control plane that entered SURVIVAL during a provider outage stayed undispatchable\nafter the provider recovered, because nothing forced a re-read on the dispatch path.\n\nThe framing this was first filed under — that one observation ordered ahead of another —\nwas a symptom. Ordering observations differently would not have helped: the verdict was\nstale, not misordered.\n\ndispatch now re-evaluates a SURVIVAL verdict older than five minutes before acting on it,\nwhich is the boundary completion already applies.\n","ordinary_source_sha256":"ed7ee6664d0c88be2bad39d5539671cc88276c8a4d27d86f736bf9ed920b1043","ordinary_body_chars":2766,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":3,"files_changed":11,"insertions":1028,"deletions":83,"changed_paths":["docs/capacity-source.md","src/app/control-plane.ts","src/capacity/capacity-monitor.ts","src/cli/agentctl.ts","src/core/reason-codes.ts","src/daemon/daemon.ts","src/doctor/doctor.ts","src/run/run-engine.ts","tests/unit/continuity-hardening.test.ts","tests/unit/dispatch-admission.test.ts","tests/unit/operator-socket.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-b48724ec04025b41","repository_id":"agent-control-plane","source_commit_sha":"11cf9c3422ac2bb6cfb6d6ee8bfa079501935be4","decision_audit_anchor":"b48724ec04025b41da9e83f4736225da963071cbe0d8ae15a2f70bba76d67f9d","ordinary_source":"docs: vendor the terminology SSOT and enforce it mechanically (#437)\n\n* docs: vendor the terminology SSOT and enforce it mechanically\n\nThe owner's 2026-08-14 decision fixed the meaning of eight contested words. It lived\noutside the repository, where nothing could hold the code to it.\n\nThe check tests collocations, not words. Every contested word — session, actor, run,\ngate, evidence, binding — has legitimate uses here, so a word ban would have produced\nthousands of hits and been switched off inside a week. Each rule instead encodes the\nspecific confusion the decision was written to prevent, and names the replacement term,\nso a failure says what to write rather than only what not to.\n\nFive sites called a channel identity an `actor` immediately beside allowlist membership,\nwhich is exactly the reading the decision forbids: allowlist presence looking like\nauthority. Reworded. The reason code INGRESS_ACTOR_NOT_ALLOWLISTED keeps its name — it is\npublished and verify-reason-codes refuses removals, so the external contract outranks the\nrename there.\n\nAlso records the measured cost of the `conversational actor` change, since the estimate\nbehind it had not been counted: one migration is achievable, but ~200 code references move\nwith it, and the v15-v17 chain is held by unmerged lanes.\n\n* docs(terminology): field names are an interface, not prose\n\nRenaming a term renames the fields that carry it, and the two fail differently. Wrong prose\ngets noticed by whoever reads it. A renamed field goes silent: the reader gets nothing, with\nno error to say so.\n\nThis happened while applying the decision. STATUS.json's `gate` became\nLEGACY_FIELD__SEE_CURRENT_PHASE_MARKER with the live value moved to `current_phase_marker` —\nthe rename the decision asked for. It blinded a monitor reading `.gate` for three minutes.\nNothing was broken; the value simply became a string no case pattern matched.\n\nThree rules, plus the rename ledger they need to be checkable. The keep-the-old-key pattern\nis recorded as normative because the value itself names the new destination, so a consumer\nthat only knows the old name reads \"moved\" rather than \"absent\".\n\nNotes that this repository already implements the principle for reason codes, and that the\nsame allowlist is why INGRESS_ACTOR_NOT_ALLOWLISTED keeps `actor` while its prose does not:\na published contract outranks a rename.\n","ordinary_source_sha256":"9093565ae614284bfb755d9fb29f95b3e927e78466f1f531b66527253c017767","ordinary_body_chars":2372,"ordinary_body_survives":true,"removed_trailer_count":1,"residual_record_lines_removed":8,"files_changed":9,"insertions":475,"deletions":7,"changed_paths":[".github/workflows/ci.yml","README.md","docs/STATUS.md","docs/TERMINOLOGY.md","package.json","scripts/verify-terminology.mjs","src/ceo/owner-authority.ts","src/daemon/agentcpd.ts","src/ingress/ingress-guard.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-bd395d87b2865263","repository_id":"agent-control-plane","source_commit_sha":"5fd17d05cbd185a39bddccf0c10162ed6afb8477","decision_audit_anchor":"bd395d87b2865263101f42f25e4818280273994bd4b7a1ba0cfe688ce4a0a23c","ordinary_source":"chore: keep the junit artifact out of the tree\n\nGenerated by running the suite with CI=1 locally and committed by accident. It is a per-run\nartifact, not evidence anyone reads from the repository.\n","ordinary_source_sha256":"e5d6247355ff9ee9035dfa06c8883af32c998d087dcf392c2fdfbdb3b95ef97d","ordinary_body_chars":197,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":2,"insertions":1,"deletions":1538,"changed_paths":[".gitignore","evidence/junit.xml"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c25228afc16748b3","repository_id":"agent-control-plane","source_commit_sha":"d62e22268e0fb2eaf950337a5e7132ee246ac1d6","decision_audit_anchor":"c25228afc16748b308c7df0c27e18fe0f93c8bf55562021484b798e3b7df89f4","ordinary_source":"docs: hand off the second closeout round with four unmergeable lanes\n\nFour lane branches carry finished, locally green work that must not be merged: every one\ncame back DO NOT MERGE from a blind review, and each finding recorded here was reproduced\nrather than taken on trust.\n\nThe two method errors are written down first because they invalidated conclusions, not just\nwork. A local suite proved nothing about CI — this machine's umask is 077 and the runner's\nis 022, so fixtures got 0600 by accident here and 0644 there, and main had been red for five\nruns while four local suites reported green. And rebuilding the lanes with `git diff HEAD`\nsilently dropped every untracked file, which produced a confident and wrong conclusion that\na cited test file had never existed.\n\nAlso corrected: grok must be invoked headless. Every earlier review round ran through the\ninteractive TUI, died, and left partial output formatted exactly like a finished review —\none citing code that had already been deleted.\n","ordinary_source_sha256":"bf53cc03fb0a89058fc3a40859c1d058f05fe2599d9c6a4b578264722844d1fb","ordinary_body_chars":1002,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":1,"insertions":200,"deletions":0,"changed_paths":["docs/HANDOFF-20260814-closeout-round2.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-c8feb84e83c19266","repository_id":"agent-control-plane","source_commit_sha":"8819c567706560b2e7dc2dc67761593c4b45e0b6","decision_audit_anchor":"c8feb84e83c19266867bd9ab363a460a388bb9e93317590847fbf8359b0c3dc7","ordinary_source":"docs(ops): correct the branch-protection runbook to the App that now exists\n\nThe document still said the production gate check needed the App installed first and tracked\nthat as #242. The App exists, is installed, and has live gate/merge/post-merge evidence;\n#242 is closed. It also configured `verify` by context name alone, which is a name match\nrather than a provenance check — any integration reporting that name satisfies it — so both\nchecks now carry their App id.\n\nThe ordering is written down because it is the part that can brick the repository. `verify`\ncan be required as soon as CI is green, since every push already produces it.\n`acp-production-gate` cannot, until the daemon publishes a gate as a matter of course:\nrequiring it earlier blocks every merge that is not a completed ACP run, including the merge\nthat would fix whatever stopped the daemon publishing.\n","ordinary_source_sha256":"568ddfc07bbf7c56253a0046c2afe6446ee9f6a3c46c66aa434307ad202958df","ordinary_body_chars":877,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":1,"insertions":44,"deletions":5,"changed_paths":["docs/ops/branch-protection.md"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-cb7c81aa3e7a1d8c","repository_id":"agent-control-plane","source_commit_sha":"d5697329d88f34dddf2cf613471419d3a1d875ce","decision_audit_anchor":"cb7c81aa3e7a1d8cb4811acf6ba617fb7b946dfb2533d2678645d156c2eae6ca","ordinary_source":"feat: a refusal says whether it reached the CEO (#652)\n\nA claim is taken before the reply command runs, and the design's only\ntransitions are a terminal answer or a recorded override. So a refusal that\nhappens *before* the peer is contacted has nowhere to go: the CEO socket\nbeing briefly detached would wedge the conversation until a human\nadjudicated it.\n\nToday that is invisible, because the refusal's reply reservation overwrites\nthe claim (#646). The bug is doing the settling. Closing #646 without this\nturns a reconnect into a permanent hold, which is why the CEO put this\nfirst in the same slice.\n\nThe CEO's ruling is that the distinction has to be structural:\n\n dispatch 이후 timeout, socket close, rejection, kill attempt, child exit\n code 는 그 증거가 아니다. 이 구분을 error string 이나 추정으로 만들지 말고\n executor boundary 의 typed result 로 강제한다.\n\nSo `attempt()` returns the contact fact beside the answer, and the flag it\nreads is set at `createMessage` and nowhere else. A reason code would not do:\nit is a label the caller attaches, and adding a refusal that reused an\nexisting code would move it to the wrong side of the boundary silently.\n\n`ask()` is unchanged for every caller that only wants an answer.\n\nMutation-proved in both directions, which is what a boundary needs: moving\nthe mark to the function entry kills the three NEVER_REACHED tests, removing\nit kills the four REACHED ones. Each side is held by the other.\n\nOne test asserts the port's claim against the peer's own call log rather\nthan against a reason code — a port that reported NEVER_REACHED for a turn\nthe peer recorded would satisfy every other assertion here.\n\nPart of #651, gate 2 of the activation list on #641.\n","ordinary_source_sha256":"76bde676397c36e02c621760da2b281b1f1d5576072fa88f0acc9b23a5953992","ordinary_body_chars":1683,"ordinary_body_survives":true,"removed_trailer_count":2,"residual_record_lines_removed":0,"files_changed":2,"insertions":167,"deletions":0,"changed_paths":["src/mcp/ceo-conversation.ts","tests/unit/ceo-conversation.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-cf7752a9fa65978e","repository_id":"agent-control-plane","source_commit_sha":"0be7a992d995e03d7452f68952ecb8372087e64f","decision_audit_anchor":"cf7752a9fa65978e8796f5a5fc214e870364716748b03cdeb407378d447e43fc","ordinary_source":"feat(capacity): let an authenticated observation outlive a collector that cannot read quota (#434)\n\n* feat(capacity): let an authenticated observation outlive a collector that cannot read quota\n\nP0-11 was right to delete the provenance-free capacity file, and the consequence was that\nnothing could dispatch: this host's `/usage` surfaces need human interaction, so every\ncollector reading is ERROR, and unknown capacity is correctly not routable.\n\nAn operator observation is a different thing from that file. It records who observed it,\nwhen, and through which daemon-stamped surface, and it expires on the existing staleness\nrule. What makes it usable is narrow: a collector ERROR is the *absence* of a reading, not a\nreading, so it no longer replaces an observation that has not expired. A collector that\nsucceeds always wins, including when its quota is lower — a measurement outranks a\nrecollection — and an expired observation is replaced by the honest ERROR.\n\nThe gate still refreshes. An earlier shape skipped the probe while an observation was\ncurrent, which turned every §14.2 allocation gate into a cache: a collector that had come\nback and now reported exhaustion could not refuse the run. Preserving inside `refresh` is\nwhat protects the observation, so the skip was both redundant and harmful and is gone.\n\nPreserving for admission is not allowed to hide the probe failure. The preserved reading\ncarries the collector error it displaced, and the doctor reports CAPACITY_SENSOR_FAILED off\nit, because CP-HI-08 does not permit a probe failure to be displayed as a pass.\n\nReverted before landing: a refusal for an observation older than the newest stored reading.\nIt rejected the input docs/capacity-source.md instructs the operator to send — the\nprovider-reported observedAt, necessarily in the past, against collectors that stamp an\nERROR every four minutes — and rejected it with the reason code #424 was filed under. New\ncode that refuses the documented path is the thing that is wrong.\n\n* fix(#424): give dispatch the staleness boundary completion already had\n\nassertCompletionAllowed re-evaluates continuity before trusting a SURVIVAL verdict.\ndispatch did not: it read ContinuityGate.mode() and refused, however old the verdict was.\nSo a control plane that entered SURVIVAL during a provider outage stayed undispatchable\nafter the provider recovered, because nothing forced a re-read on the dispatch path.\n\nThe framing this was first filed under — that one observation ordered ahead of another —\nwas a symptom. Ordering observations differently would not have helped: the verdict was\nstale, not misordered.\n\ndispatch now re-evaluates a SURVIVAL verdict older than five minutes before acting on it,\nwhich is the boundary completion already applies.\n","ordinary_source_sha256":"ed7ee6664d0c88be2bad39d5539671cc88276c8a4d27d86f736bf9ed920b1043","ordinary_body_chars":2766,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":3,"files_changed":11,"insertions":1028,"deletions":83,"changed_paths":["docs/capacity-source.md","src/app/control-plane.ts","src/capacity/capacity-monitor.ts","src/cli/agentctl.ts","src/core/reason-codes.ts","src/daemon/daemon.ts","src/doctor/doctor.ts","src/run/run-engine.ts","tests/unit/continuity-hardening.test.ts","tests/unit/dispatch-admission.test.ts","tests/unit/operator-socket.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d3094729cb02a074","repository_id":"agent-control-plane","source_commit_sha":"af2bc9dda813ca2cd5d30b46f6b233d99d5cfb38","decision_audit_anchor":"d3094729cb02a074111efac06c4dd44f85c99eb6d098916e99c5ddde017d8ce5","ordinary_source":"feat: the claim carries what the turn was, and expiry cannot drop it (#640)\n\nTwo things, both from the CEO's design on #632 and a blind review of it.\n\n**The claim now carries an identity.** An opaque turn id plus digests of the\nsession, the prompt and the binding generation, written in the same\nstatement as the claim inside the same transaction. Recording them\nseparately would leave a window where a crash produces a row that is claimed\nbut says nothing about what it claimed — a fourth state, and one nothing can\nresolve, added to the three this file already distinguishes.\n\nThe binding digest is why an id alone is not enough: a turn claimed under\ngeneration N and reconciled under N+1 is a different CEO's work, and\n`bindingGeneration` is the fence the rest of this repository already uses.\nIts absence is recorded as absence — a default of zero would put a number in\nthe digest that no binding ever had, and a later receipt would disagree with\nit for a reason nobody could find.\n\nNothing reads any of this yet. There is no argument on the reply command\nthat would carry the id to Hermes and no receipt comes back to compare\nagainst (#638). What is established now is that the values survive, which is\nthe floor the later comparison stands on: a comparison against an id that\ndrifts fails always, and that failure cannot be told apart from a missing\nreceipt.\n\n**The nonce window no longer expires a claimed turn.** A blind review found\nthis, and it is a hole in the guard merged an hour ago: `prune` deleted by\n`received_at` alone, so after `nonceTtlMs` the claimed row went, the nonce\nwas free again, and a replay would run the turn a second time. The\nfail-closed state quietly became fail-open on a timer.\n\nPruning it also destroys the identity above, so a receipt could exist with\nnothing left to match it against.\n\nThese rows need a person, not a timer. `INGRESS_TURN_OUTCOME_UNKNOWN` in the\naudit log is where they are visible.\n\nThe expiry test ages the row directly rather than shortening the TTL: a TTL\nsmall enough to expire the row also expires it inside the same `admit` that\ninserted it, so the claim under test never gets a row and the test would\npass for the wrong reason.\n\nPart of #639 (contract 1). Found by review of #632.\n","ordinary_source_sha256":"ba7386c6513e3f410b862e4cc3be89f7e9e1c7de310acf676453f5889b0828f2","ordinary_body_chars":2245,"ordinary_body_survives":true,"removed_trailer_count":2,"residual_record_lines_removed":0,"files_changed":4,"insertions":235,"deletions":19,"changed_paths":["src/ingress/ingress-guard.ts","src/ingress/telegram-router.ts","src/ingress/telegram.ts","tests/unit/ingress-turn-claim.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d3c77723a8e09894","repository_id":"agent-control-plane","source_commit_sha":"86a10fd3110b0bf45824b7a22ed02344c2e4171f","decision_audit_anchor":"d3c77723a8e09894b69f2b6272c0c6e0ad89fac0c80e4af56dac9a63cc5e3edf","ordinary_source":"feat: an unresolved turn can be found by its conversation (#642)\n\nA claimed turn could only be looked up by nonce. The person who needs to\nfind one is the owner — who has an unanswered message, not a nonce. So the\nsingle state in this guard that requires a human was reachable only by\nsomeone who already knew where to look.\n\nThe lookup is by `sessionDigest` rather than a stored conversation id. The\ndigest is already written into the claim and is exactly\n`digestOf({ channel, conversation })`, which makes this a query over data\nthat exists rather than a schema change — and keeps one definition of \"the\nsame conversation\". A second column would be a second definition, free to\ndisagree with the first.\n\nOldest first: the question is what is still outstanding, and the oldest\noutstanding turn is the one unanswered longest.\n\nFour tests. One requires the nonce and prompt digest to come back, because a\nlist of ids answers \"how many\" and nothing else — the owner's question is\nwhich of their messages is outstanding. One requires an admitted-but-\nunclaimed row *not* to appear: if it did, every message would look\nunresolved and the list would stop meaning anything.\n\nPart of #641.\n","ordinary_source_sha256":"9846c5bfd0705a0d58e89045f17b7ef7195715377a9778863b2a99aca21be287","ordinary_body_chars":1183,"ordinary_body_survives":true,"removed_trailer_count":2,"residual_record_lines_removed":0,"files_changed":2,"insertions":104,"deletions":0,"changed_paths":["src/ingress/ingress-guard.ts","tests/unit/ingress-turn-claim.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-d61d9c73e11754bc","repository_id":"agent-control-plane","source_commit_sha":"1285e819618af2f69e04d7d36c1f2c8233fda44e","decision_audit_anchor":"d61d9c73e11754bcc2086fb68e5fb46b68c6fd89185912575f5be324d739f15a","ordinary_source":"feat: one turn at a time on the CEO's canonical session (#634)\n\n* feat: one turn at a time on the CEO's canonical session\n\nThe reply command resumes one conversation by id, and the runtime fires it\nwith `void` and keeps no queue (hermes-ceo.ts:341). Two overlapping turns\ntherefore both reach `hermes chat --resume ` and interleave in a\ntranscript the CEO carries forward as context for everything after it. That\ncannot be unwound, and the CEO cannot tell it happened.\n\nNothing enforces this today. The property holds only because\n`TelegramLongPoller.pollOnce` awaits each update in turn — the stack frame\nis the mutex, and #630 is about removing that await. So the invariant is\nmade explicit here first, while it is still true, rather than after it\nstops being.\n\nA second turn is refused rather than queued. A queue would hold the caller\nfor the length of a turn, which is the stall the port is being taken out of\nthe poll loop to remove; and the ordering a queue imposes belongs to #631,\nwhere the update is durable. Refusing says the true thing now: this turn did\nnot start.\n\nThe flag is set after the checks that refuse without reaching the session,\nso a failure that never touched the CEO does not lock it, and cleared in a\n`finally` including the timeout path — a turn that timed out is over as far\nas this port is concerned, and holding the flag would cost the owner their\nCEO after one slow message.\n\nMutation-proved: replacing the guard's condition with `false` kills\n\"refuses a second turn while the first is still open\". The test asserts the\nsecond turn never reached the peer, not only that the reason code came back\n— a refusal that still sent the message would satisfy the code and cause the\ninterleaving anyway.\n\n* fix: two sentences the owner is shown were not true\n\nThese are the whole of what the owner sees when the CEO route refuses. They\ngo into a chat, so a claim in one reads as a fact the system checked.\n\n**\"Nothing was lost; ask again\"** is not observable from this seam. The reply\ncommand resumes the owner's own conversation, so when the deadline passes the\nCEO may already have written part of an answer into it, and \"ask again\"\ncontinues on top of that rather than starting over. It now says what is known\nand points at the one place the truth is visible.\n\n**A stale binding was reported as an undeliverable answer.** `STALE` had no\nsentence and fell through to \"answered with something this route cannot\ndeliver\". `ask` refuses a superseded socket *before* speaking to it — the\nexisting port test asserts the peer receives nothing — so the owner was told\nabout an answer that was never requested, on the one occasion when the\nidentity of who answers had just changed.\n\nFound by the third test here, which requires every CEO_CONVERSATION_* code to\nhave its own sentence. A code added without one falls through to the not-text\ndefault, which tells the owner the CEO answered when it never did. That is\nhow STALE came to be wrong, and the test fails on 6 codes and 5 sentences\nrather than waiting for someone to read them.\n","ordinary_source_sha256":"cb3c162089235c9201cf304b8ea6d1fd6513d0ace71d510dfcafb9a77f80544e","ordinary_body_chars":3060,"ordinary_body_survives":true,"removed_trailer_count":2,"residual_record_lines_removed":6,"files_changed":5,"insertions":181,"deletions":2,"changed_paths":["src/core/reason-codes.ts","src/daemon/agentcpd.ts","src/mcp/ceo-conversation.ts","tests/unit/ceo-conversation.test.ts","tests/unit/ceo-unavailable-sentence.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-db58634970ebbdf7","repository_id":"agent-control-plane","source_commit_sha":"0d12bf2a358306b99df8b9b5b602d1e8e623642c","decision_audit_anchor":"db58634970ebbdf72cc462f90f817deecd642e2822abff4331e4aa3c3ad69be6","ordinary_source":"fix: claim a message's turn before running it, once (#635)\n\nThe ingress recovery path re-admits an update whose workflow is still\nADMITTED, on the assumption that nothing irreversible happened before the\ncrash. That held while a handler only produced a reply. It stopped holding\nwhen Telegram's DIRECT handler became a CEO turn: the reply command resumes\nthe owner's own conversation, so a re-run appends the same exchange twice to\na transcript the CEO then carries forward as context. It cannot be unwound,\nand the CEO cannot tell it happened.\n\nThe window is open today, not after some later change — `recoverInFlight` is\ntrue for Telegram and the CEO was bound this morning. It has not fired only\nbecause the Telegram listener is not started.\n\nSo the handler is claimed before it runs, and a claimed message is not\nrecoverable. A crash after the claim leaves the outcome genuinely unknown:\nthe turn may or may not have reached the session, and the honest response is\nto stop. The owner can ask again; a duplicated turn cannot be taken back.\n\nThe design is the CEO's, asked on #628 and #632. Two points were its\ncorrections rather than mine:\n\n - the state is TURN_CLAIMED, not STARTED. It is written *before* the call,\n so it cannot testify that anything started — only that this daemon took\n the right to try. After a crash that distinction is the whole content.\n - an unknown outcome must not be folded into INGRESS_REPLAY_IGNORED. Both\n are \"this update came back\", but a replay means the work was done and\n this copy is redundant, while this means nobody knows. One code for both\n files every occurrence of the second inside the first.\n\nA first draft compared against `result_json IS NULL` and refused every real\nmessage: `TelegramIngress.admit` writes `phase: \"ADMITTED\"` immediately, so\nthe column is never null on that path. The existing tests caught it.\n","ordinary_source_sha256":"1dee52d1280609c616e59d19e3a2537fea3f9e5319346b35a1a901b71f71f8f7","ordinary_body_chars":1880,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":6,"insertions":345,"deletions":0,"changed_paths":["src/core/reason-codes.ts","src/ingress/ingress-guard.ts","src/ingress/telegram-router.ts","src/ingress/telegram.ts","tests/unit/ingress-turn-claim.test.ts","tests/unit/telegram-ingress.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-ded1bcf6f444c76d","repository_id":"agent-control-plane","source_commit_sha":"0be7a992d995e03d7452f68952ecb8372087e64f","decision_audit_anchor":"ded1bcf6f444c76d7b702e08cf9bc20769e60f63cd71f8ad2f63615259cee9ac","ordinary_source":"feat(capacity): let an authenticated observation outlive a collector that cannot read quota (#434)\n\n* feat(capacity): let an authenticated observation outlive a collector that cannot read quota\n\nP0-11 was right to delete the provenance-free capacity file, and the consequence was that\nnothing could dispatch: this host's `/usage` surfaces need human interaction, so every\ncollector reading is ERROR, and unknown capacity is correctly not routable.\n\nAn operator observation is a different thing from that file. It records who observed it,\nwhen, and through which daemon-stamped surface, and it expires on the existing staleness\nrule. What makes it usable is narrow: a collector ERROR is the *absence* of a reading, not a\nreading, so it no longer replaces an observation that has not expired. A collector that\nsucceeds always wins, including when its quota is lower — a measurement outranks a\nrecollection — and an expired observation is replaced by the honest ERROR.\n\nThe gate still refreshes. An earlier shape skipped the probe while an observation was\ncurrent, which turned every §14.2 allocation gate into a cache: a collector that had come\nback and now reported exhaustion could not refuse the run. Preserving inside `refresh` is\nwhat protects the observation, so the skip was both redundant and harmful and is gone.\n\nPreserving for admission is not allowed to hide the probe failure. The preserved reading\ncarries the collector error it displaced, and the doctor reports CAPACITY_SENSOR_FAILED off\nit, because CP-HI-08 does not permit a probe failure to be displayed as a pass.\n\nReverted before landing: a refusal for an observation older than the newest stored reading.\nIt rejected the input docs/capacity-source.md instructs the operator to send — the\nprovider-reported observedAt, necessarily in the past, against collectors that stamp an\nERROR every four minutes — and rejected it with the reason code #424 was filed under. New\ncode that refuses the documented path is the thing that is wrong.\n\n* fix(#424): give dispatch the staleness boundary completion already had\n\nassertCompletionAllowed re-evaluates continuity before trusting a SURVIVAL verdict.\ndispatch did not: it read ContinuityGate.mode() and refused, however old the verdict was.\nSo a control plane that entered SURVIVAL during a provider outage stayed undispatchable\nafter the provider recovered, because nothing forced a re-read on the dispatch path.\n\nThe framing this was first filed under — that one observation ordered ahead of another —\nwas a symptom. Ordering observations differently would not have helped: the verdict was\nstale, not misordered.\n\ndispatch now re-evaluates a SURVIVAL verdict older than five minutes before acting on it,\nwhich is the boundary completion already applies.\n","ordinary_source_sha256":"ed7ee6664d0c88be2bad39d5539671cc88276c8a4d27d86f736bf9ed920b1043","ordinary_body_chars":2766,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":3,"files_changed":11,"insertions":1028,"deletions":83,"changed_paths":["docs/capacity-source.md","src/app/control-plane.ts","src/capacity/capacity-monitor.ts","src/cli/agentctl.ts","src/core/reason-codes.ts","src/daemon/daemon.ts","src/doctor/doctor.ts","src/run/run-engine.ts","tests/unit/continuity-hardening.test.ts","tests/unit/dispatch-admission.test.ts","tests/unit/operator-socket.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} +{"schema_version":1,"candidate_id":"v4-e5b4843efae58483","repository_id":"agent-control-plane","source_commit_sha":"effe657b5ddebbc07854222b2977ee841ce9b0b0","decision_audit_anchor":"e5b4843efae58483aa9f02665e043574f7c9140962b4e3e33032b736794feca1","ordinary_source":"fix(tests): make the suite mean the same thing under CI's umask\n\nMain's CI had been red for five consecutive runs while every local run passed. The\ndifference was never in the code: this machine runs `umask 077`, the GitHub runner runs\n`umask 022`, and the migration fixtures created their SQLite files with no explicit mode.\nLocally they landed at 0600 by accident; on CI they landed at 0644 and production's own\nstate-file check correctly refused to open them. The fixture now sets 0600 the way the\ndaemon does, so the check being exercised is production's rather than the shell's.\n\nThe two reviewer-egress failures were a cascade from one timing assumption. The dying-proxy\ntest slept a fixed 150ms and then asserted the death had been observed; on a loaded runner\nthat window closes early, the assertion throws, and because it throws before `finalise` the\nlease's proxy is never released. It holds the fixed port, and the next test in the file\nwaits on a port it can never get — surfacing as an unrelated 60s timeout. The wait is now\nbounded polling, and the lease is released in a `finally` so a failed assertion cannot cost\nthe following test its port.\n\nFound by an independent A-to-Z review of the production gate, which read CI rather than\ntrusting a local green suite.\n","ordinary_source_sha256":"d1092b3c7475e9329d646dc7ad28b47c9fe4f32696681c14f7a933488d579a98","ordinary_body_chars":1278,"ordinary_body_survives":true,"removed_trailer_count":3,"residual_record_lines_removed":0,"files_changed":2,"insertions":40,"deletions":10,"changed_paths":["tests/unit/database-migration-restore.test.ts","tests/unit/reviewer-egress.test.ts"],"benchmark_authored":false,"provenance_value":null,"g1_natural_provenance":true,"g2_mechanical":true,"mechanical_exclusion":null,"provenance_tier":"pending"} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/qualification-summary.json b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/qualification-summary.json new file mode 100644 index 00000000..d044c0fb --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/qualification-summary.json @@ -0,0 +1,105 @@ +{ + "schema_version": 1, + "study_id": "cdeb-fresh-v4", + "measured_product_effect_rows": 0, + "thresholds": { + "minEligibleRepositories": 3, + "minQualifiedPerRepository": 12, + "minTotalQualified": 48 + }, + "verdict": { + "verdict": "HOLD", + "eligible_repositories": 0, + "total_qualified": 6, + "recommended_fixed_set": [], + "unmet": [ + "eligible repositories 0 < 3", + "total qualified 6 < 48" + ], + "delivery_observable_with_identity": true, + "delivery_observable_without_identity": true + }, + "reviewer_agreement_by_gate": [ + { + "gate": "G2", + "compared": 207, + "agreed": 188, + "rate": 0.9082125603864735 + }, + { + "gate": "G3", + "compared": 207, + "agreed": 153, + "rate": 0.7391304347826086 + }, + { + "gate": "G4", + "compared": 207, + "agreed": 189, + "rate": 0.9130434782608695 + }, + { + "gate": "G5", + "compared": 207, + "agreed": 193, + "rate": 0.9323671497584541 + }, + { + "gate": "G7", + "compared": 207, + "agreed": 205, + "rate": 0.9903381642512077 + } + ], + "reviewer_quote_concordance": { + "pairs": 159, + "mean_jaccard": 0.5707922950153806, + "near_identical": 72 + }, + "quote_overlap_floor": 0.34, + "quote_overlap_sensitivity": [ + { + "floor": 0.2, + "would_pass": 46 + }, + { + "floor": 0.25, + "would_pass": 39 + }, + { + "floor": 0.3, + "would_pass": 24 + }, + { + "floor": 0.333, + "would_pass": 24 + }, + { + "floor": 0.34, + "would_pass": 17 + }, + { + "floor": 0.4, + "would_pass": 17 + }, + { + "floor": 0.5, + "would_pass": 14 + } + ], + "exclusion_reasons": { + "insufficient-provenance": 190, + "source-packet-empty": 33, + "reason-obvious-from-code": 7, + "wrong-path-not-functionally-viable": 3, + "shipping-content-not-observable": 1, + "scope-unresolvable": 1 + }, + "identity_composition": { + "qualified_total": 6, + "qualified_with_identity": 3, + "qualified_without_identity": 3, + "enumerated_with_identity": 143, + "enumerated_without_identity": 98 + } +} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/qualification.jsonl b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/qualification.jsonl new file mode 100644 index 00000000..a2452237 --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/qualification.jsonl @@ -0,0 +1,241 @@ +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-00efc0041ed3118a","repository_id":"gitseed","decision_audit_anchor":"00efc0041ed3118a9c3f00dbf1e66e3fb2c03edf9fdb6e0bb53c4156207452b0","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-03dd551058ce7aaf","repository_id":"gitseed","decision_audit_anchor":"03dd551058ce7aaf41bac12adc80224796c5bc626d3eabe93dce9f018c3b20b7","identity_present":true,"record_id":"r-gsf512","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-091571a7d13f7f36","repository_id":"gitseed","decision_audit_anchor":"091571a7d13f7f364f1ad4ca49444fcf2e195844e7d4f5b67f0608201ad942f5","identity_present":true,"record_id":"r-f2dep01","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0ecd7426eebc1cab","repository_id":"gitseed","decision_audit_anchor":"0ecd7426eebc1cab55e7d10a9d4e1bc844f482ff3a2f0997461828463cd70adf","identity_present":true,"record_id":"r-gsf501","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0f4dfe2618796b54","repository_id":"gitseed","decision_audit_anchor":"0f4dfe2618796b54543c26d5844a650d0a7c06cc51e47928bcfdd3906df3ecc5","identity_present":true,"record_id":"r-f3rev28","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0f5392e7e8d2cd63","repository_id":"gitseed","decision_audit_anchor":"0f5392e7e8d2cd6318a713be9f342dac1574f23da859ea2dff167c5ee5a63076","identity_present":true,"record_id":"r-m0backtest","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-122f5e996ed8f300","repository_id":"gitseed","decision_audit_anchor":"122f5e996ed8f3004cbfad12ed6a556d52718e43705626e4778835498c2784ff","identity_present":true,"record_id":"r-store62","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-13d2137b8a6296ea","repository_id":"gitseed","decision_audit_anchor":"13d2137b8a6296ea969e324cf9c49d0fc991b150e4feebd3a01c9deff8d30df7","identity_present":true,"record_id":"r-gsf502","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-1438614686129e44","repository_id":"gitseed","decision_audit_anchor":"1438614686129e44dadd5c779d96fdaafbfa99d01a3da892c0de94224c2d76c4","identity_present":true,"record_id":"r-f8replay","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-1d24e887944f0434","repository_id":"gitseed","decision_audit_anchor":"1d24e887944f04349c569c3c5f90162c6bfc5fb787910f7a13aa34d476e893e7","identity_present":true,"record_id":"r-modelgate9","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-1f1cba75144b609f","repository_id":"gitseed","decision_audit_anchor":"1f1cba75144b609f63b07200e1e8394e70a9623681233755656fd3fe525fb86c","identity_present":true,"record_id":"r-gl0001","protocol_version":"2.0.0","lifecycle":"superseded","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"adjudicated"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-1f24c7dbe202ecd8","repository_id":"gitseed","decision_audit_anchor":"1f24c7dbe202ecd8005a68909d5ff2ab09b56d5b98ac475379cc01f84dfd5ab2","identity_present":true,"record_id":"r-m0prereg","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-2115a033e1fb37d0","repository_id":"gitseed","decision_audit_anchor":"2115a033e1fb37d0e64b4e21192cf2433f9ef9ce20dba19f5cde19503b549216","identity_present":true,"record_id":"r-readmel28","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"adjudicated"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-2493fd41b194d8f4","repository_id":"gitseed","decision_audit_anchor":"2493fd41b194d8f48c698bf40bb448039562cc49f2aac13e728b87c79112c636","identity_present":true,"record_id":"r-gs0005","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-2616d7ae1c85fea4","repository_id":"gitseed","decision_audit_anchor":"2616d7ae1c85fea4bde5b0ffad16aca6d8660b87a648de610778fe8121d6661b","identity_present":true,"record_id":"r-search67","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-2c70b58d7ce1117a","repository_id":"gitseed","decision_audit_anchor":"2c70b58d7ce1117acc36cdb6680729ba51b14cbf32f1e9c104c15ec37b050c7e","identity_present":true,"record_id":"r-gs0005","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.75,"qualified":true,"exclusion_code":null,"provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-30517866b1626071","repository_id":"gitseed","decision_audit_anchor":"30517866b1626071c26316a5091bf79af2e6886169540b2034dc133f3da5da24","identity_present":true,"record_id":"r-obs065","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-31ea939e4478ded3","repository_id":"gitseed","decision_audit_anchor":"31ea939e4478ded3d4dfbeb0fc0c3cdbf01c3d5d1e16e716acf43ad210ffcbac","identity_present":true,"record_id":"r-f4rev28","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-3258ac6e08349a04","repository_id":"gitseed","decision_audit_anchor":"3258ac6e08349a04706744aa7ec32876f8b2860151d88e9879068ea73563495d","identity_present":true,"record_id":"r-chlog030","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-377f04276465b59d","repository_id":"gitseed","decision_audit_anchor":"377f04276465b59d3a08b0958ba5d84accdc43e73e92abf326179e89addd1af6","identity_present":true,"record_id":"r-gsb108","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-3ae6c2555769891a","repository_id":"gitseed","decision_audit_anchor":"3ae6c2555769891a57f7e00063bdbe044cb6a92c980e5c86c804ff33a68c1857","identity_present":true,"record_id":"r-gsf502","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-3ebec50e1216f799","repository_id":"gitseed","decision_audit_anchor":"3ebec50e1216f799637cad67990d6e1fdc8466f3288f5b8be4191537f75ebee6","identity_present":true,"record_id":"r-enphs17","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-4042654555ac20e4","repository_id":"gitseed","decision_audit_anchor":"4042654555ac20e44f50ba651d43de7f7c90d0783dfe7a15b7625ba5b539c1f3","identity_present":true,"record_id":"r-adr9rank","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"adjudicated"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.6,"qualified":true,"exclusion_code":null,"provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-468e579f86e22f91","repository_id":"gitseed","decision_audit_anchor":"468e579f86e22f91a5151dc8b1435e50dec2671aa3833b78952849a9e3a4b2a3","identity_present":false,"record_id":null,"protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-48c6427556993157","repository_id":"gitseed","decision_audit_anchor":"48c642755699315776e287af988e71cfb46a6a968ce54e451103a82ac0f44082","identity_present":true,"record_id":"r-f10cli","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-48e8b1b021e6999b","repository_id":"gitseed","decision_audit_anchor":"48e8b1b021e6999bae1bfa6c2bb440ecb72df231fd92727a5d87694157ec695b","identity_present":true,"record_id":"r-f11trust","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-4d2c072dffcb56ba","repository_id":"gitseed","decision_audit_anchor":"4d2c072dffcb56baa6dfee91257f13fb59338e4390c4e54d079d024f134cfd5e","identity_present":true,"record_id":"r-gl0001","protocol_version":"2.0.0","lifecycle":"superseded","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-545d1c9c0d2b969e","repository_id":"gitseed","decision_audit_anchor":"545d1c9c0d2b969e9492834949776cbae158e03cade5958ba687c7c52ce048de","identity_present":true,"record_id":"r-adr10st","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-556562750dedffa7","repository_id":"gitseed","decision_audit_anchor":"556562750dedffa7b6e9e418354e6d568073e1227cc28a005d6d53ba12b1835c","identity_present":true,"record_id":"r-f9adr07","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-572e09dba076a5a3","repository_id":"gitseed","decision_audit_anchor":"572e09dba076a5a37ca3ed1df7a52d80e8f9e86e0939367e2e5e939eefe0d3a6","identity_present":true,"record_id":"r-readme69","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-59f1a2b56b710495","repository_id":"gitseed","decision_audit_anchor":"59f1a2b56b710495bd73aab8327bb859c4445adcaaf533a8d31e65fb03bc04d3","identity_present":true,"record_id":"r-gsf501","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-5f0d8829fcc6f198","repository_id":"gitseed","decision_audit_anchor":"5f0d8829fcc6f1988f8bc143365d3ded0ff6736e21efab52712dc37dbfeed631","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-63e1ec17f2bdadfe","repository_id":"gitseed","decision_audit_anchor":"63e1ec17f2bdadfe8c6bf27d088aba98e49c112d18528ae0b39f54ad5e65c2b3","identity_present":false,"record_id":null,"protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-66695090e5949ea6","repository_id":"gitseed","decision_audit_anchor":"66695090e5949ea696225a24fda43985372c23e2b4623d45390b3883ed78ff70","identity_present":true,"record_id":"r-gs6c03","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-6a3b0b51071ec292","repository_id":"gitseed","decision_audit_anchor":"6a3b0b51071ec2924c01a66d250c4be9a6d3b9266e4b461a690b76e93f9d37e4","identity_present":true,"record_id":"r-replay57","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-6aed03472a14ffc6","repository_id":"gitseed","decision_audit_anchor":"6aed03472a14ffc6e1e43d5d17c2092285619f1f8e9a7813cbed5ba4c5079e55","identity_present":true,"record_id":"r-f1rev28","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-6d2eec862ac0f22c","repository_id":"gitseed","decision_audit_anchor":"6d2eec862ac0f22c76bb3f2461c4cce8e7fa72cb37d57bc9b8c865fac8c5d13e","identity_present":true,"record_id":"r-f2rev28","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-6d92a30ed95357d4","repository_id":"gitseed","decision_audit_anchor":"6d92a30ed95357d41194de81299defb4db4fca049b3a02701c3a6da4ba909d3b","identity_present":true,"record_id":"r-enprd17","protocol_version":null,"lifecycle":"superseded","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-7078a162153bab38","repository_id":"gitseed","decision_audit_anchor":"7078a162153bab380e5e643bd1d766316a2249708ad3bad711d008530c39ae44","identity_present":true,"record_id":"r-gs0006","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-77e1745655a235ce","repository_id":"gitseed","decision_audit_anchor":"77e1745655a235ce75339fae3518ec72beb33a824d4e5a8882d06f170d30ab17","identity_present":true,"record_id":"r-evid610","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-79e5fcfd3fd49649","repository_id":"gitseed","decision_audit_anchor":"79e5fcfd3fd496497a5ea0c2efe67205bcf92253f0e4a96efc78b639357ee8de","identity_present":true,"record_id":"r-gs0002","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-7b84423ed8fa9f34","repository_id":"gitseed","decision_audit_anchor":"7b84423ed8fa9f3463f9d6f5430de1900693992e61f3bf095cee40b608d686be","identity_present":true,"record_id":"r-gsd310","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.3333333333333333,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-7bdc1c42597e48a6","repository_id":"gitseed","decision_audit_anchor":"7bdc1c42597e48a6327a3f952fa102ef41ffaa237061459ba02a86e4634d5faa","identity_present":true,"record_id":"r-f8schema","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-7c0b5ea14295d54c","repository_id":"gitseed","decision_audit_anchor":"7c0b5ea14295d54ccbf816ba968b8c183cc6a63369cf14719739421f9be0adef","identity_present":true,"record_id":"r-gs3844fix","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.3333333333333333,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-7c3c09fcebd01801","repository_id":"gitseed","decision_audit_anchor":"7c3c09fcebd0180189a951c0fef9277059024ad879bd3894062ad94e3146c942","identity_present":true,"record_id":"r-gs45p48fix","protocol_version":"0.2.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-7f42c3f1f7876679","repository_id":"gitseed","decision_audit_anchor":"7f42c3f1f7876679fd6a295654c5ac85d957cd3c3866ac5be4fb6eb6f834b5d5","identity_present":true,"record_id":"r-gs0004","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-81773950b2e67c02","repository_id":"gitseed","decision_audit_anchor":"81773950b2e67c028ad5cbc72c0c8ec4a7efac8401ccdd686eb3252aa947747d","identity_present":true,"record_id":"r-adr10st","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-81aa6660ab83f1dc","repository_id":"gitseed","decision_audit_anchor":"81aa6660ab83f1dcccdc51c9cb63cbcf77999499eeb7ef6ec8108e84d098655b","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-849425816b8050cc","repository_id":"gitseed","decision_audit_anchor":"849425816b8050ccdc7c28866cef2b6e99ee88316c8096935e5f5fdcdba93921","identity_present":true,"record_id":"r-gs3743","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-84cd6d391ac2fa6d","repository_id":"gitseed","decision_audit_anchor":"84cd6d391ac2fa6de4c15e04994aee9c09aa0b005ae3f3a0e2964f7c753b4976","identity_present":true,"record_id":"r-f8adapter","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8ab61d73c22d675b","repository_id":"gitseed","decision_audit_anchor":"8ab61d73c22d675b3f78e86dc7d98b57e0665399ec1fc2ffee6dac61ea521c41","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.125,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8d262bad0a14ca64","repository_id":"gitseed","decision_audit_anchor":"8d262bad0a14ca64c9a1545448165bec50e8dc7336afa80c3f6955e86631c718","identity_present":true,"record_id":"r-enread17","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8e59d287bd2f9248","repository_id":"gitseed","decision_audit_anchor":"8e59d287bd2f9248bc4a07441918a9aef6e340cc23fd672eec56c4cc33d0d202","identity_present":true,"record_id":"r-gs45p48fix","protocol_version":"0.2.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8fc3d2ec14b1c078","repository_id":"gitseed","decision_audit_anchor":"8fc3d2ec14b1c078125a65b40754012ade635b300f0f9224638a31983c254a2a","identity_present":true,"record_id":"r-gs0006","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-9387c3b68473bda9","repository_id":"gitseed","decision_audit_anchor":"9387c3b68473bda9bb9a126e160ec8a2d952e20b189745a513de71c69f6aa631","identity_present":true,"record_id":"r-gs0002","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.5,"qualified":false,"exclusion_code":"reason-obvious-from-code","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-93aa115431f06a91","repository_id":"gitseed","decision_audit_anchor":"93aa115431f06a9118c220a2280f790f002042eb65bf661d1492510ca47a43ff","identity_present":true,"record_id":"r-gsf503","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-9c974f0a8436c03e","repository_id":"gitseed","decision_audit_anchor":"9c974f0a8436c03e234a63aa4f5dbc240947e8ed6a948ac28146392ab44005a5","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-9cc0a659cfa12205","repository_id":"gitseed","decision_audit_anchor":"9cc0a659cfa122058f9ffcb3f9158913ada669f3580e1fb78f174e1e06e4678a","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-9f9eb817a08ae4c9","repository_id":"gitseed","decision_audit_anchor":"9f9eb817a08ae4c9ba4d7563e6642fd2da98527b1d0b981cd647d070bd356e1c","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a2ad4b77ea6a9a3b","repository_id":"gitseed","decision_audit_anchor":"a2ad4b77ea6a9a3bdb6dcb3629e7d34cceb793a512909849a5d499118be3951c","identity_present":true,"record_id":"r-undval63","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a2dbaee9c683ea83","repository_id":"gitseed","decision_audit_anchor":"a2dbaee9c683ea83bb756a7e080266fb866b59e61c90910c8f9536cf5f0e7649","identity_present":true,"record_id":"r-gs0002","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a5b9e9e48752467e","repository_id":"gitseed","decision_audit_anchor":"a5b9e9e48752467ec0391943c4dceccdf1ec3a9a2d45caca5de6f99dc9b1b982","identity_present":true,"record_id":"r-gsart54","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a7b04c5208e493e4","repository_id":"gitseed","decision_audit_anchor":"a7b04c5208e493e453ccfcf763071e1ffe0f070a221fca26213502387d17f459","identity_present":true,"record_id":"r-f9score12","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"adjudicated"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a9ec5cd512c7c2c7","repository_id":"gitseed","decision_audit_anchor":"a9ec5cd512c7c2c74b0981464ff2aae50f06abdb4acd48ec712e26be41eb970f","identity_present":true,"record_id":"r-gs6c03","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a9edac0b4d0f80a8","repository_id":"gitseed","decision_audit_anchor":"a9edac0b4d0f80a8efa4936a799b4acbf5e7f6ac7602beac9278110f33e80864","identity_present":true,"record_id":"r-gs45p48fix","protocol_version":"0.2.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ada5ec890a36e5b2","repository_id":"gitseed","decision_audit_anchor":"ada5ec890a36e5b2ad1c510e090e6a22369293d21b798d518e0537cd41bbbc75","identity_present":true,"record_id":"r-gse411","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-aeaeee659e7b653f","repository_id":"gitseed","decision_audit_anchor":"aeaeee659e7b653f4add012a5fe31145f987734505c8f9da45a1c147adab4a32","identity_present":true,"record_id":"r-entkt17","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-aec71c78e9675ad3","repository_id":"gitseed","decision_audit_anchor":"aec71c78e9675ad30cdb92c437e197758659d08816f03e6090d3186a5a38567f","identity_present":true,"record_id":"r-adr11btf","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-af8446560274248d","repository_id":"gitseed","decision_audit_anchor":"af8446560274248d2723dab8dd5445ea684c61bb397b6d798bc1855f27f24eb2","identity_present":true,"record_id":"r-gsf503","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-b0282a5d21a52335","repository_id":"gitseed","decision_audit_anchor":"b0282a5d21a52335706fbd8916b10bc51bcdb66efa39ed2dc44897a42d0f9bf3","identity_present":true,"record_id":"r-gl0001","protocol_version":"2.0.0","lifecycle":"superseded","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-b291655fbfd2003b","repository_id":"gitseed","decision_audit_anchor":"b291655fbfd2003b06a8c93dfefb52a3eaa2682c8caa4b4b48093bb3587eff89","identity_present":true,"record_id":"r-category10","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-b3568fcfe78e5aab","repository_id":"gitseed","decision_audit_anchor":"b3568fcfe78e5aaba2967d4c31de9a95abc978d21012bff1a394f25db2f4a662","identity_present":true,"record_id":"r-gsf512","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-b6075c378778faff","repository_id":"gitseed","decision_audit_anchor":"b6075c378778faff8b734dab0a0f2192859cb14da7bca6d19d1017305dd4766d","identity_present":true,"record_id":"r-rawmeta64","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-b9bba3d1416828fa","repository_id":"gitseed","decision_audit_anchor":"b9bba3d1416828fa944b51f72aac690b31d7ec6cda387efa8a221b7603b33f31","identity_present":true,"record_id":"r-gs4a01","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.3333333333333333,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-badec4c4ee9efb2a","repository_id":"gitseed","decision_audit_anchor":"badec4c4ee9efb2a2c6911801f84147538432cb3e042641f0445bc3046b34c56","identity_present":true,"record_id":"r-clorder","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-bdf15182275d02b8","repository_id":"gitseed","decision_audit_anchor":"bdf15182275d02b8c857f39f578d2272ce4d45e77c14dbe5f3dfef00eb6384ee","identity_present":true,"record_id":"r-f3super1","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-bef9b4e179c50fe8","repository_id":"gitseed","decision_audit_anchor":"bef9b4e179c50fe8d7ce20a5f2647b31591a46e2cd715d29bfae7cc4695ae106","identity_present":true,"record_id":"r-gs0005","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c08dac879bbde6a4","repository_id":"gitseed","decision_audit_anchor":"c08dac879bbde6a432406755a92746a9db05377a20751dd38cde5a983d9fdad5","identity_present":true,"record_id":"r-rel030fix","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c27e59f236ed7496","repository_id":"gitseed","decision_audit_anchor":"c27e59f236ed7496d8bc6453707ee901d71150b9da406b0dc226f704893ce4cf","identity_present":true,"record_id":"r-gs45p48fix","protocol_version":"0.2.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c38d520fe83cb7d5","repository_id":"gitseed","decision_audit_anchor":"c38d520fe83cb7d5b12c3d792407b0e7ff86ad900a6e547b1946bbd0592724a2","identity_present":true,"record_id":"r-gs4a01","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c8e57b42ac2635de","repository_id":"gitseed","decision_audit_anchor":"c8e57b42ac2635de412064f0b7a61d0a9f30010af047d823f2549d9a412aa89a","identity_present":true,"record_id":"r-adr10st","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c9391d155d7a3fd6","repository_id":"gitseed","decision_audit_anchor":"c9391d155d7a3fd6f2a6a4c09cb6cf598487894f0dcde8ca893e7268ee163e56","identity_present":true,"record_id":"r-gsf503","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c976dc2332d4adab","repository_id":"gitseed","decision_audit_anchor":"c976dc2332d4adab7e878a66192d1e7d51679428394386e22c3acd37f121ea20","identity_present":true,"record_id":"r-gs4a01","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-cadfb63755c3f504","repository_id":"gitseed","decision_audit_anchor":"cadfb63755c3f5046cddc8b502821218f92bf863fe0c42206a81ca6892402e21","identity_present":true,"record_id":"r-gs5b02","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d56e88f5ef1b62cb","repository_id":"gitseed","decision_audit_anchor":"d56e88f5ef1b62cb29036bea6a607e3475bd4a4e36098c56483022fb4f91f1ef","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d5b3514664089aef","repository_id":"gitseed","decision_audit_anchor":"d5b3514664089aefaeeb09cdb263347f7c7aa716df24cabd31e309223480278c","identity_present":true,"record_id":"r-gs0004","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d9887355b9eff3e9","repository_id":"gitseed","decision_audit_anchor":"d9887355b9eff3e9d92cd5e8c045ff691184519ce9697cd9bcb0e88635515fdd","identity_present":true,"record_id":"r-gs0006","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-dc67b4d3b699b947","repository_id":"gitseed","decision_audit_anchor":"dc67b4d3b699b94781f8d300d061ee9230483b19bb8c8a938af9cdde49982344","identity_present":true,"record_id":"r-gl0001","protocol_version":"2.0.0","lifecycle":"superseded","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-dce89f8ad4b7064a","repository_id":"gitseed","decision_audit_anchor":"dce89f8ad4b7064afbb21386ed28d152c99ea26173a11aec9f6451f1723d2d51","identity_present":true,"record_id":"r-enadr17","protocol_version":null,"lifecycle":"superseded","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-df6bfd03300910e2","repository_id":"gitseed","decision_audit_anchor":"df6bfd03300910e2e0bf695b724b346685c902ed4bccb88be34bfb14872581b8","identity_present":true,"record_id":"r-cat5860","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-dfafe1ae814a5dfe","repository_id":"gitseed","decision_audit_anchor":"dfafe1ae814a5dfeb964289f52c3d425057bb9a4574e94738bdd4bc95c568ed3","identity_present":true,"record_id":"r-c24wire","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e05f3639fb4909ba","repository_id":"gitseed","decision_audit_anchor":"e05f3639fb4909ba7458ad926f59a334c6c0b71f0e1f0d1bcf5846033df494e7","identity_present":true,"record_id":"r-f1prst1","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e25462e19110c9eb","repository_id":"gitseed","decision_audit_anchor":"e25462e19110c9ebca40a4c375930e4c0ad9b7de9867138236608732fd24696f","identity_present":true,"record_id":"r-metadata52","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e5a87ee0d8e99a1e","repository_id":"gitseed","decision_audit_anchor":"e5a87ee0d8e99a1ee1e9f01d07595f084ea40bcaeb7921935a0e74c35c63c0d1","identity_present":true,"record_id":"r-gse411","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e60230e53cceff5a","repository_id":"gitseed","decision_audit_anchor":"e60230e53cceff5ac616228a46fc5f7bbfa441a17d4d5536bb9584ab43c1903b","identity_present":true,"record_id":"r-f4commit1","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e82c306ec9e425b2","repository_id":"gitseed","decision_audit_anchor":"e82c306ec9e425b2c3d526053138bc08f129e5eda2af8c2d3e10f7cc60b578d3","identity_present":true,"record_id":"r-gs0002","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ea459217291aa8a3","repository_id":"gitseed","decision_audit_anchor":"ea459217291aa8a3e5ac0d5856138457bbc97fc3758c3a4c4bd97d0ac7e4ad06","identity_present":true,"record_id":"r-gs45p48fix","protocol_version":"0.2.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.5714285714285714,"qualified":false,"exclusion_code":"reason-obvious-from-code","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ed4039b8a411ee62","repository_id":"gitseed","decision_audit_anchor":"ed4039b8a411ee62395d10d778a3b62b4f8510a0edb64a5e765100ef5430cb81","identity_present":true,"record_id":"r-m0backtest","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ed878960135ff45a","repository_id":"gitseed","decision_audit_anchor":"ed878960135ff45a538992a4f04bd2afecd8d77c6a9aa20e8817511c9406a7bc","identity_present":true,"record_id":"r-f8replay","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f3c960a48273132c","repository_id":"gitseed","decision_audit_anchor":"f3c960a48273132ce1ebd32695e43e87ffbc856109223ff1805d147134be60da","identity_present":true,"record_id":"r-gsf501","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f4404e6e27e534e5","repository_id":"gitseed","decision_audit_anchor":"f4404e6e27e534e5605fd301635d0fdea69e2cded91b6d4ed04cbe643da0fd0b","identity_present":true,"record_id":"r-gs5b02","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f65ddc0c062c4a33","repository_id":"gitseed","decision_audit_anchor":"f65ddc0c062c4a33999417036a94961d119515787808dae2cd87404d199f7698","identity_present":true,"record_id":"r-stars65","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f75d4b634c14b66c","repository_id":"gitseed","decision_audit_anchor":"f75d4b634c14b66c31941dca910dd49db71829d285d08261945e29823364352c","identity_present":true,"record_id":"r-gs5b02","protocol_version":"2.0.0","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f901052615fa3aee","repository_id":"gitseed","decision_audit_anchor":"f901052615fa3aeebaf8e88125df7752265befe73484d76d00d633ae5073946c","identity_present":true,"record_id":"r-f8adapter","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"source-packet-empty","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-002ffd1e428c572a","repository_id":"agent-operator-score","decision_audit_anchor":"002ffd1e428c572aa96f1ecc2616c00fb7e90580c334db9e064dd0b824c95607","identity_present":true,"record_id":"r-e0b001","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.16666666666666666,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-00b9b5b83c4ddf87","repository_id":"agent-operator-score","decision_audit_anchor":"00b9b5b83c4ddf87a447269754915b4c73091185e15a5c0dcd4a4cd0dd00dc18","identity_present":true,"record_id":"r-redfileperiod","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.5,"qualified":false,"exclusion_code":"shipping-content-not-observable","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-04c1de5e41d66868","repository_id":"agent-operator-score","decision_audit_anchor":"04c1de5e41d66868e888fdae1d908dbf919f82ef6e1a91380c46c082d33ff4c2","identity_present":true,"record_id":"r-e0b003","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-09c4183e165a4da4","repository_id":"agent-operator-score","decision_audit_anchor":"09c4183e165a4da4f9eaf6d50dcd079824ce5d46e85d2541ee64c474d9272b6f","identity_present":true,"record_id":"r-e0b001b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0bc581744204a282","repository_id":"agent-operator-score","decision_audit_anchor":"0bc581744204a2824cab75a9b5955919310399ef0f89e3eebb20384a91433fbb","identity_present":true,"record_id":"r-e0b002","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0f8cd38c8ba43cfe","repository_id":"agent-operator-score","decision_audit_anchor":"0f8cd38c8ba43cfe926aa508f1e099400f5b28a4e730900de0feaeb8dcf4c026","identity_present":true,"record_id":"r-collectionbudget","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-12b0486cd77dd3a9","repository_id":"agent-operator-score","decision_audit_anchor":"12b0486cd77dd3a90143f1514a2aab77e7f5bf5b3e28f7a81cc4887f51480dcf","identity_present":true,"record_id":"r-e0a002b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-14a911a7f4c96afb","repository_id":"agent-operator-score","decision_audit_anchor":"14a911a7f4c96afb1c2acee01b976e5f87644c3fe96670be670dc2578f765774","identity_present":true,"record_id":"r-e0b003c","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"adjudicated"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2857142857142857,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-163c7d58d0692423","repository_id":"agent-operator-score","decision_audit_anchor":"163c7d58d06924234dd49cb3de5f0245a52896d54619f758a9bde95838f2cbfc","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-1a5dea10137de7da","repository_id":"agent-operator-score","decision_audit_anchor":"1a5dea10137de7dabf178f67996eaea489ecfe4297e8eb5c675b298085bcf444","identity_present":true,"record_id":"r-e0a001c","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-1bc2a34840360fd0","repository_id":"agent-operator-score","decision_audit_anchor":"1bc2a34840360fd0cb9277ae74af622b7f07206fd55afcbb70f465627b03b0ca","identity_present":true,"record_id":"r-e0a002","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-23ba99c6da04e46f","repository_id":"agent-operator-score","decision_audit_anchor":"23ba99c6da04e46fbfb1ab40efa42c64744e62867b601b71b523adeb8f541471","identity_present":true,"record_id":"r-e0b002","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-261cdc76929d85cc","repository_id":"agent-operator-score","decision_audit_anchor":"261cdc76929d85cc03e3ef1cf8e9f731e10cea7fef0f5e706cd77a3fccccd003","identity_present":true,"record_id":"r-e0a002b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-2cadeedf7d7f2251","repository_id":"agent-operator-score","decision_audit_anchor":"2cadeedf7d7f22512439ba585a3ea75ae4698fd9db0c46474703c3e9224f5193","identity_present":true,"record_id":"r-e0b001","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-32281c33a0cd1d51","repository_id":"agent-operator-score","decision_audit_anchor":"32281c33a0cd1d516bbe368d6cd65d0a5dc826b8281369021d73d3460af26f64","identity_present":true,"record_id":"r-e0b002","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-34aef026d81c2f6b","repository_id":"agent-operator-score","decision_audit_anchor":"34aef026d81c2f6bec36561f17c344f419dda3fdeb697dd7a1ea247c90fd1d71","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.14285714285714285,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-3a462c35336b7325","repository_id":"agent-operator-score","decision_audit_anchor":"3a462c35336b732564b34e925e9efaf8d869a8399d6d7e5d496fc9f97374e08b","identity_present":true,"record_id":"r-e0a002","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-3bde5fdd3fb4c13a","repository_id":"agent-operator-score","decision_audit_anchor":"3bde5fdd3fb4c13a67ec907c2de93694bf11540052eba702ff25aa8d5a93bea7","identity_present":true,"record_id":"r-d0002gatereceipt","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"mechanical"},"G3":{"passed":false,"source":"unavailable"},"G4":{"passed":false,"source":"unavailable"},"G5":{"passed":false,"source":"unavailable"},"G6":{"passed":false,"source":"unavailable"},"G7":{"passed":false,"source":"unavailable"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":null,"qualified":false,"exclusion_code":"scope-unresolvable","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-4b7ef509f0403505","repository_id":"agent-operator-score","decision_audit_anchor":"4b7ef509f04035050d848c7b178daec87a3c66a0462335bc56d3392a873519e3","identity_present":true,"record_id":"r-e0a001c","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.125,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-50c24e701b7ba2ef","repository_id":"agent-operator-score","decision_audit_anchor":"50c24e701b7ba2ef70e6f820ae0ce462d5b51c46b8a3f67a3a201344152a20b0","identity_present":true,"record_id":"r-collectionbudget","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-575de52ba54d6758","repository_id":"agent-operator-score","decision_audit_anchor":"575de52ba54d675820e148ba9606c0633137b5b0aef120fa9e51390ea6fe1a97","identity_present":true,"record_id":"r-resolverpage","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.16666666666666666,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-5eb2760a3fa148f3","repository_id":"agent-operator-score","decision_audit_anchor":"5eb2760a3fa148f3ec58ff48a5719c484a985ba8c785eab4cdf438ef6d49d117","identity_present":true,"record_id":"r-completioneffect","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.3333333333333333,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-5f6e3fcc52a2df1d","repository_id":"agent-operator-score","decision_audit_anchor":"5f6e3fcc52a2df1d24cd091f065403ba63eb916429c8cd7b2bca17cba5528f73","identity_present":true,"record_id":"r-d0004c","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-60e3f694ae5ca2d5","repository_id":"agent-operator-score","decision_audit_anchor":"60e3f694ae5ca2d50a0d30aff6eb3938f79114c91d42503e0e21e02cdcdc656e","identity_present":true,"record_id":"r-e0a003","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-7362d21baaf5d618","repository_id":"agent-operator-score","decision_audit_anchor":"7362d21baaf5d618b63a686e9a28b4137068a207c6f119a471c88ad6f4c837cf","identity_present":true,"record_id":"r-e0a003b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.5,"qualified":true,"exclusion_code":null,"provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8001a8835a9351e3","repository_id":"agent-operator-score","decision_audit_anchor":"8001a8835a9351e3bea546e243504c9c55294e063866d98e422be9988f0eed92","identity_present":true,"record_id":"r-e0b001","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-82ae5492d09483d9","repository_id":"agent-operator-score","decision_audit_anchor":"82ae5492d09483d97c79fbec330f6f219698b02d17154da6ed453669b460c097","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-841244a354bd70c7","repository_id":"agent-operator-score","decision_audit_anchor":"841244a354bd70c7a4b209feeb6157db323229ce37da52476996215c32d61af1","identity_present":true,"record_id":"r-e0a003b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-843485d931913281","repository_id":"agent-operator-score","decision_audit_anchor":"843485d931913281c1f9d9d5b4b7ee08f1ea704908d27f830bbda1e8fa2a2d7d","identity_present":true,"record_id":"r-e0b003b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-88299d9c1503bc7b","repository_id":"agent-operator-score","decision_audit_anchor":"88299d9c1503bc7b9e627177f321fe8c8b7272d984665d4ca3204c81404cc096","identity_present":true,"record_id":"r-completioneffect","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-89d86d3677fb18ef","repository_id":"agent-operator-score","decision_audit_anchor":"89d86d3677fb18efb22ef694dcd4b921fbc3fca6f576a6ba88e882bd79c85432","identity_present":true,"record_id":"r-e0a001d","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8c7fdf80ae6c6f2e","repository_id":"agent-operator-score","decision_audit_anchor":"8c7fdf80ae6c6f2e91a3b1470debd1d59cba9453f7b3c4d47fe24647657c4d01","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8f24735524874167","repository_id":"agent-operator-score","decision_audit_anchor":"8f247355248741672de0bfa76c5dfe9ba5fd0571c4efb9ef3a529dbc9fa4bb19","identity_present":true,"record_id":"r-e0b003","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-915f4e606299276c","repository_id":"agent-operator-score","decision_audit_anchor":"915f4e606299276c2921e9f96006b7c768bb7f78269faf7ce528b3380ca455be","identity_present":true,"record_id":"r-e0a003","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-975a69717305d00f","repository_id":"agent-operator-score","decision_audit_anchor":"975a69717305d00fb9c46d83f27cddc79ffbae4615bc575be0a6744c52d1ee78","identity_present":true,"record_id":"r-e0a001b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"adjudicated"},"G5":{"passed":true,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-9b42b1951da730e1","repository_id":"agent-operator-score","decision_audit_anchor":"9b42b1951da730e12ccd20742fca92da1461703c628ea5da580db39544ec0103","identity_present":true,"record_id":"r-e0a001","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a0489f4a19bc3969","repository_id":"agent-operator-score","decision_audit_anchor":"a0489f4a19bc39696d57f7588f0ce2d3f94dca536f17be21f620c8cc564780b2","identity_present":true,"record_id":"r-e0b003b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a2acb02e41d42051","repository_id":"agent-operator-score","decision_audit_anchor":"a2acb02e41d4205156b021a30c0d19d243709914647245c46780424389b64c89","identity_present":true,"record_id":"r-d0011gate","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a3705f2f819df548","repository_id":"agent-operator-score","decision_audit_anchor":"a3705f2f819df54812b816774c2ad2f1700ce63a83be8f6e693e65a49c8d6082","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a3d2b14112b034a4","repository_id":"agent-operator-score","decision_audit_anchor":"a3d2b14112b034a4de9767a73fe77c055f01ced9f603feef460703a9def5d4a3","identity_present":true,"record_id":"r-resolverpage","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.16666666666666666,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ad1efe720ca11f3c","repository_id":"agent-operator-score","decision_audit_anchor":"ad1efe720ca11f3c77f8a6de04225991737a076cbfd553a0ffb918c4bd3d86b0","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-b525ee2c84544b9e","repository_id":"agent-operator-score","decision_audit_anchor":"b525ee2c84544b9ef8a8ec91aa27b848917ccade7e55ba3b2e263426a295c617","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.07692307692307693,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-bed5fc386048e412","repository_id":"agent-operator-score","decision_audit_anchor":"bed5fc386048e412275aac2ababf59909f2d470b5de3ba5bf87e625e5d9cb71b","identity_present":true,"record_id":"r-d0004authority","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c15e92a3b1a755d4","repository_id":"agent-operator-score","decision_audit_anchor":"c15e92a3b1a755d431b2ce75dcf0a1b9d9fcd491413c7926631c798510665c2d","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c20a082f262f21c8","repository_id":"agent-operator-score","decision_audit_anchor":"c20a082f262f21c8c3f7c21d6787d5e4f3f193e43b788132b1a9836e890b479f","identity_present":true,"record_id":"r-e0b003","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c61d7c943edd8cff","repository_id":"agent-operator-score","decision_audit_anchor":"c61d7c943edd8cffdba8a2c124db469368e2262f941771a461d88388420b006a","identity_present":true,"record_id":"r-e0b001b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-cc76268ad4bb9a3e","repository_id":"agent-operator-score","decision_audit_anchor":"cc76268ad4bb9a3e9c2e4e4ad92b1aab588b5b6c7a8fa046d14dd57added2f51","identity_present":true,"record_id":"r-d0011census","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ce2adee3c134ab03","repository_id":"agent-operator-score","decision_audit_anchor":"ce2adee3c134ab0397fc9c561104abd30935cb317a26ca7a53befbeec555bb8f","identity_present":true,"record_id":"r-e0b001b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.16666666666666666,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d47951eaaa562775","repository_id":"agent-operator-score","decision_audit_anchor":"d47951eaaa56277505cafc7f036dc42dee7d35745ccad92a8007904733791aa6","identity_present":true,"record_id":"r-d0004ccatalog","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d4b46b8cf85b5425","repository_id":"agent-operator-score","decision_audit_anchor":"d4b46b8cf85b54257425e8f60494818fdae52ad7dc3026bf847218f8baae1254","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-dd4a74ba2b628991","repository_id":"agent-operator-score","decision_audit_anchor":"dd4a74ba2b628991f1b5d4f8a8a3d4290e3b60a2f2a39deea8c94f2893fc12cf","identity_present":true,"record_id":"r-e0a001","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e0d8d11b190e4e26","repository_id":"agent-operator-score","decision_audit_anchor":"e0d8d11b190e4e26e0d62253b6812cad463dc7ac11e9d55b6f1bbe7fbd0e2572","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e238e7785a6466b5","repository_id":"agent-operator-score","decision_audit_anchor":"e238e7785a6466b57b1bc4e027aa158224b9ecb5ade12945b2075bb403d2c7a9","identity_present":true,"record_id":"r-e0a001","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e2c33042f79e2776","repository_id":"agent-operator-score","decision_audit_anchor":"e2c33042f79e27768e2fd80fbf355c29399b8489ab8dacf7b7bd6f54d4c64f5d","identity_present":true,"record_id":"r-e0a002b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.14285714285714285,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e3aa102492b031b1","repository_id":"agent-operator-score","decision_audit_anchor":"e3aa102492b031b17493982c9241170b6f3b1863e8e18080e12762e253737afe","identity_present":true,"record_id":"r-e0a003","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"adjudicated"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e7587b2b65750306","repository_id":"agent-operator-score","decision_audit_anchor":"e7587b2b65750306c08cff733f9963dc6e64fca32e0e0161652b4a1a8bcd7d95","identity_present":true,"record_id":"r-e0a001b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ece19dc4cef7c803","repository_id":"agent-operator-score","decision_audit_anchor":"ece19dc4cef7c803c569de6e532b3fae1c2b265056144e3289d481749bd689a9","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f691593763c944c4","repository_id":"agent-operator-score","decision_audit_anchor":"f691593763c944c4be56e4b5d137c021980a96e3c19b604acbbd764bcfd244b8","identity_present":true,"record_id":"r-e0a002","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f83f6dbc19155e50","repository_id":"agent-operator-score","decision_audit_anchor":"f83f6dbc19155e500edffc978e5789888581263f46b75c874a562a480c483dbc","identity_present":true,"record_id":"r-e0a001b","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.1111111111111111,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-02764fbf10ceedc1","repository_id":"logic-pro-mcp","decision_audit_anchor":"02764fbf10ceedc1e046e3c23ed6277e4a9d6de540a20b3958171e19cb705068","identity_present":false,"record_id":null,"protocol_version":"0.7.1","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0d2959b1d2bbcec0","repository_id":"logic-pro-mcp","decision_audit_anchor":"0d2959b1d2bbcec0a2738339480b24d9c4704ecb83b4a59d279d3de0749cf21d","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0e840c8816f442f7","repository_id":"logic-pro-mcp","decision_audit_anchor":"0e840c8816f442f7bd775b1f90bf9d2b64dde94e33bff0d6030e6200d8cb7709","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.5,"qualified":false,"exclusion_code":"wrong-path-not-functionally-viable","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-129a3640dab8b53d","repository_id":"logic-pro-mcp","decision_audit_anchor":"129a3640dab8b53d3c406392aebe6b9c2bc6a871f33b53f58375359c1373c1a8","identity_present":false,"record_id":null,"protocol_version":"0.7.1","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-132048855f4d7a5d","repository_id":"logic-pro-mcp","decision_audit_anchor":"132048855f4d7a5dc807f400fe92dc0f264cb4de81491201a4b2606018eb7d89","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.14285714285714285,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-218954b5ef6d08d7","repository_id":"logic-pro-mcp","decision_audit_anchor":"218954b5ef6d08d79222b9fb5fc2d2f238c2f1e9f67f14f0d3dd0dd85f0ad355","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-25eb689fdb9ad98b","repository_id":"logic-pro-mcp","decision_audit_anchor":"25eb689fdb9ad98b3c66a15184c12b42ec73547692adb7451aaed6eb3a1636fa","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-2714c211175c4737","repository_id":"logic-pro-mcp","decision_audit_anchor":"2714c211175c473730f2a34d1b9992734026f8aa9788ede7d39f7b8a873c5650","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.4,"qualified":true,"exclusion_code":null,"provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-2756fbb39f4afc15","repository_id":"logic-pro-mcp","decision_audit_anchor":"2756fbb39f4afc159022e76048ae7b29c636baca0bb94fd6b088790ff14fb75f","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-277e883c8a9d3eec","repository_id":"logic-pro-mcp","decision_audit_anchor":"277e883c8a9d3eecb6167ca85eae26fc81713f7f29f22c9a7f5081668533ae79","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.4,"qualified":true,"exclusion_code":null,"provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-2853e493f4781414","repository_id":"logic-pro-mcp","decision_audit_anchor":"2853e493f478141484fb550754fc388802b29f7b30303cf5bb5c118da9de899a","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-29c6beda0309a747","repository_id":"logic-pro-mcp","decision_audit_anchor":"29c6beda0309a747fe1fdd6cb2a3e9ebb8bd264476d95d9d79275a79a639784c","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-29c79faa31cc4fe2","repository_id":"logic-pro-mcp","decision_audit_anchor":"29c79faa31cc4fe24e1a0b5055b449cecc3f35448983805ca0dd4ecef2696dc3","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-2aee6afaad42b119","repository_id":"logic-pro-mcp","decision_audit_anchor":"2aee6afaad42b11985ba0d6afb542a450202f7f222309b09e9aa91ffca45800a","identity_present":false,"record_id":null,"protocol_version":"0.7.1","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-304262d2dae79858","repository_id":"logic-pro-mcp","decision_audit_anchor":"304262d2dae798585b69014c395d9fe47d026e6411a6bfdeef174837fc91518e","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"adjudicated"},"G5":{"passed":false,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-30b8d25980ce48a3","repository_id":"logic-pro-mcp","decision_audit_anchor":"30b8d25980ce48a39bc9420f36f9151cccc94b39a338f39a4f248365f7736f11","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-5a1a7e7a347c6cc0","repository_id":"logic-pro-mcp","decision_audit_anchor":"5a1a7e7a347c6cc061b05b4faafb29599d30166f45094ff883dba2e7c4ef8e9d","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.5,"qualified":false,"exclusion_code":"reason-obvious-from-code","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-632dec3f10f1e65b","repository_id":"logic-pro-mcp","decision_audit_anchor":"632dec3f10f1e65bacaee0d08e6547cc68eda7c57b7fca4e76582ce426c8c00f","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-67ab88f48731b3f1","repository_id":"logic-pro-mcp","decision_audit_anchor":"67ab88f48731b3f1454b956ca54dd2453d92f2d24cbc66da316662d5b7a6c2c5","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-710b1008c427461f","repository_id":"logic-pro-mcp","decision_audit_anchor":"710b1008c427461f6e32b64981248fa0ab3e4e8ad82e25438fe2d6e88d8faa29","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-748bedfbbe5fe417","repository_id":"logic-pro-mcp","decision_audit_anchor":"748bedfbbe5fe417137df7fc7c106e3410c7d9eca30f87bb4e71db6e3ee29e83","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.6,"qualified":false,"exclusion_code":"reason-obvious-from-code","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-865d5bb5450bc905","repository_id":"logic-pro-mcp","decision_audit_anchor":"865d5bb5450bc90598d120425a0897622cf8c1baad9e174f62a1bef800ec76a0","identity_present":false,"record_id":null,"protocol_version":"0.7.1","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.5,"qualified":false,"exclusion_code":"wrong-path-not-functionally-viable","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8ea4400a37180162","repository_id":"logic-pro-mcp","decision_audit_anchor":"8ea4400a3718016250e7f359810e585b871605dd92617147360c8972bf2d604e","identity_present":false,"record_id":null,"protocol_version":"0.7.1","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8f7493456cee37a3","repository_id":"logic-pro-mcp","decision_audit_anchor":"8f7493456cee37a38e0c9deddbc9025f635359a76a706387520de0a63ce772ff","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.3333333333333333,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-959435801c3ef505","repository_id":"logic-pro-mcp","decision_audit_anchor":"959435801c3ef505dce652e49e0f27c115960cd91d85ac673467e8ee1c6fd825","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-97dfb7f923f08d18","repository_id":"logic-pro-mcp","decision_audit_anchor":"97dfb7f923f08d189f4c0db4f5d9e5fb62b846cd869bb94438f5ae6b4f47ea0a","identity_present":false,"record_id":null,"protocol_version":"0.7.1","lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a0550761c1997566","repository_id":"logic-pro-mcp","decision_audit_anchor":"a0550761c1997566cb006e3e54e504fff86d1884b9286c54a5f26516e6160b90","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a2ab2ce0394ace90","repository_id":"logic-pro-mcp","decision_audit_anchor":"a2ab2ce0394ace90abc556806da6c2753a1b9f7ad4272d4e5b647048ba129057","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.5,"qualified":false,"exclusion_code":"wrong-path-not-functionally-viable","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ae1693443c4f039f","repository_id":"logic-pro-mcp","decision_audit_anchor":"ae1693443c4f039fbc3757b11d884733d8475ac374c716432365cefb5f96ca2e","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":1,"qualified":false,"exclusion_code":"reason-obvious-from-code","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-aea1ebe08b663d1c","repository_id":"logic-pro-mcp","decision_audit_anchor":"aea1ebe08b663d1c50788f8db25cdbe1e33cab8646bb6bd99c7a59b37662499f","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.3333333333333333,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-b62d3f38467138a5","repository_id":"logic-pro-mcp","decision_audit_anchor":"b62d3f38467138a583ed71a5b314acb2f8077b089cd623c3fa1feeb05fac7927","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.16666666666666666,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-cccd3e7fae599767","repository_id":"logic-pro-mcp","decision_audit_anchor":"cccd3e7fae5997675e0699777df01bf94c87b177c6210b78ef462beb1f15757f","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d171f3ea2a7f7362","repository_id":"logic-pro-mcp","decision_audit_anchor":"d171f3ea2a7f7362802f260be36ce9d310620905da516d4a53fbf995e9a28fe0","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d7d1121164366d9c","repository_id":"logic-pro-mcp","decision_audit_anchor":"d7d1121164366d9c5db28e1b864378f3a5804c0fe032b69e9bc9a4f1fbb126b2","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-dd97491c4d227316","repository_id":"logic-pro-mcp","decision_audit_anchor":"dd97491c4d227316845855cea3c105c3d25423ebeeefdc02767149d29bcf115e","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-de1096e077fa22d6","repository_id":"logic-pro-mcp","decision_audit_anchor":"de1096e077fa22d6bb74fbabd548ba496d7f19e91fe9bf33599284678583b7f2","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.16666666666666666,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-de409d80b116c6ee","repository_id":"logic-pro-mcp","decision_audit_anchor":"de409d80b116c6eecd940b5203a1be855284f5791a19aac76429454b08675d47","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-eef995b442c7a008","repository_id":"logic-pro-mcp","decision_audit_anchor":"eef995b442c7a00823b57ee3a7fd1281b8814eacc41c32dd85d1c954f7ec7f08","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2857142857142857,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f05b91620a25eee7","repository_id":"logic-pro-mcp","decision_audit_anchor":"f05b91620a25eee72b06fc644c6cb6dac3d3aa7c74abd7d7ad9727ea82ab425b","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f0ea9a2a5b68115b","repository_id":"logic-pro-mcp","decision_audit_anchor":"f0ea9a2a5b68115b270721f09a86c03dabe2763282d1056772ccade0edbc30dc","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f149c003cc5dae5d","repository_id":"logic-pro-mcp","decision_audit_anchor":"f149c003cc5dae5d413960334931befa413211a5195bb27f7a5619e7375645f5","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"adjudicated"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-f51f8964286329bb","repository_id":"logic-pro-mcp","decision_audit_anchor":"f51f8964286329bb21087c1c4149b6dc6d8768e2bdda10e57a369b8f2cbdaa65","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-fd7263067698db44","repository_id":"logic-pro-mcp","decision_audit_anchor":"fd7263067698db441536116d78ef25e49eb38a67d19f6ee000dff1504ba2250a","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":false,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0d7c38f6a60e8b36","repository_id":"agent-control-plane","decision_audit_anchor":"0d7c38f6a60e8b36591b98d8fb8c9ead8f5764a34d7bf89ee669bb94259270a6","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0ef57b3438b7d16b","repository_id":"agent-control-plane","decision_audit_anchor":"0ef57b3438b7d16b53d0ed609b496ffe37243b40ad1a6cd288f48c4b18d6b527","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-0ef8cafdf0d11499","repository_id":"agent-control-plane","decision_audit_anchor":"0ef8cafdf0d114998caba347fc47c5cb482083f25589fec319a129b5cf5acf61","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-120b48f40e73f330","repository_id":"agent-control-plane","decision_audit_anchor":"120b48f40e73f33048fcd6561feeb81cf6bd5f6c49198bd691f6e579792f9d8d","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":false,"source":"adjudicated"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-1a18ceae8a4645cf","repository_id":"agent-control-plane","decision_audit_anchor":"1a18ceae8a4645cf17a8fe3170ceddfdd80e9cb3b47b8fbc65417052b12cdcac","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-23f26b69f816664d","repository_id":"agent-control-plane","decision_audit_anchor":"23f26b69f816664d1a9938a97b95fc0a0d8138651ec73aebd334caf920293b5b","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-3ba6d8b1fa31e10f","repository_id":"agent-control-plane","decision_audit_anchor":"3ba6d8b1fa31e10f6557c0e8ad40d00268078a84d40a3f8cc6aa3a66a9751de2","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.3333333333333333,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-4001fa0211128649","repository_id":"agent-control-plane","decision_audit_anchor":"4001fa0211128649720bba45efa4d156b42e79e788bd721ac37ecfe727774b40","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-431dceed9013cb2b","repository_id":"agent-control-plane","decision_audit_anchor":"431dceed9013cb2bcf20f3acfee25ca186db42b5a01113d2a5a34c7dd4d96b5c","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"ordinary-source","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-45caf6be5b46889d","repository_id":"agent-control-plane","decision_audit_anchor":"45caf6be5b46889d98f7607d65791be364d343b06cc1d39a5801742195aeb721","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-50d2354c5c9210d1","repository_id":"agent-control-plane","decision_audit_anchor":"50d2354c5c9210d15f01bbddf4860e1fd15e028eb47e89421d88d16289fa4ba6","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":false,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-56a540b834736c43","repository_id":"agent-control-plane","decision_audit_anchor":"56a540b834736c43b5fd2f7bb9c031dbf6ed753e31b3b0c37d38ec512d0d23cf","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-5b3c19da588ec1d0","repository_id":"agent-control-plane","decision_audit_anchor":"5b3c19da588ec1d0792e3edc2bb0398118189f426ca43355acf2882bf72fb876","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-6ace14eeff8e0235","repository_id":"agent-control-plane","decision_audit_anchor":"6ace14eeff8e0235d9231494ece08aa25521a60ab9c3d8cfbf1b4e29c6851018","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2857142857142857,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-6fa12e79e96b6cc1","repository_id":"agent-control-plane","decision_audit_anchor":"6fa12e79e96b6cc1750d4ba244fe40ddc503c17a134ab08875acd96852afbc35","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-77018bc628e62482","repository_id":"agent-control-plane","decision_audit_anchor":"77018bc628e624821afd1e82c6ff48d224c0aa81e04aad5cf18b02c6a5882763","identity_present":true,"record_id":"r-p014live20260814","protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-83c6c0a5f5542b97","repository_id":"agent-control-plane","decision_audit_anchor":"83c6c0a5f5542b977e22d0a1c37fcdb292fe3d1a58840f2b5e83830a326d5019","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"ordinary-source","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8826ee094751e0ef","repository_id":"agent-control-plane","decision_audit_anchor":"8826ee094751e0ef82eeb9a29d94a902ffcd57c2ed677fcdee2c135987011e54","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-8dbd6ece65df6bf7","repository_id":"agent-control-plane","decision_audit_anchor":"8dbd6ece65df6bf7716342210364b4d0e7c9678e436286bba37ef79f9d63bf7e","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.4,"qualified":false,"exclusion_code":"reason-obvious-from-code","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a0bf288e0dd97d24","repository_id":"agent-control-plane","decision_audit_anchor":"a0bf288e0dd97d24248bcf6184624bfbfeaf7b7f4697aa072cb49ec89ff9d0e2","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-a6950ee840587dbc","repository_id":"agent-control-plane","decision_audit_anchor":"a6950ee840587dbc9a224ad374e942e7954228ba58bc32ecfa00a775784a36d6","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"ordinary-source","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ac85b82316ac5980","repository_id":"agent-control-plane","decision_audit_anchor":"ac85b82316ac598040bb8fe813a64a2879465f72d70fbb28bcef928f7725b897","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"ordinary-source","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.6666666666666666,"qualified":false,"exclusion_code":"reason-obvious-from-code","provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-b4647e5b48ad0f67","repository_id":"agent-control-plane","decision_audit_anchor":"b4647e5b48ad0f678c113b8fde754e8f07e3e7cea15c3de4a98fa6b3b2e9d493","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"ordinary-source","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.16666666666666666,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-b48724ec04025b41","repository_id":"agent-control-plane","decision_audit_anchor":"b48724ec04025b41da9e83f4736225da963071cbe0d8ae15a2f70bba76d67f9d","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"ordinary-source","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-bd395d87b2865263","repository_id":"agent-control-plane","decision_audit_anchor":"bd395d87b2865263101f42f25e4818280273994bd4b7a1ba0cfe688ce4a0a23c","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c25228afc16748b3","repository_id":"agent-control-plane","decision_audit_anchor":"c25228afc16748b308c7df0c27e18fe0f93c8bf55562021484b798e3b7df89f4","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.2,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-c8feb84e83c19266","repository_id":"agent-control-plane","decision_audit_anchor":"c8feb84e83c19266867bd9ab363a460a388bb9e93317590847fbf8359b0c3dc7","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":false,"source":"adjudicated"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-cb7c81aa3e7a1d8c","repository_id":"agent-control-plane","decision_audit_anchor":"cb7c81aa3e7a1d8cb4811acf6ba617fb7b946dfb2533d2678645d156c2eae6ca","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":true,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.5,"qualified":true,"exclusion_code":null,"provenance_tier":"P1"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-cf7752a9fa65978e","repository_id":"agent-control-plane","decision_audit_anchor":"cf7752a9fa65978e8796f5a5fc214e870364716748b03cdeb407378d447e43fc","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d3094729cb02a074","repository_id":"agent-control-plane","decision_audit_anchor":"d3094729cb02a074111efac06c4dd44f85c99eb6d098916e99c5ddde017d8ce5","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d3c77723a8e09894","repository_id":"agent-control-plane","decision_audit_anchor":"d3c77723a8e09894b69f2b6272c0c6e0ad89fac0c80e4af56dac9a63cc5e3edf","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":false,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0.25,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-d61d9c73e11754bc","repository_id":"agent-control-plane","decision_audit_anchor":"d61d9c73e11754bcc2086fb68e5fb46b68c6fd89185912575f5be324d739f15a","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"agreed"},"G4":{"passed":false,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-db58634970ebbdf7","repository_id":"agent-control-plane","decision_audit_anchor":"db58634970ebbdf72cc462f90f817deecd642e2822abff4331e4aa3c3ad69be6","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":false,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-ded1bcf6f444c76d","repository_id":"agent-control-plane","decision_audit_anchor":"ded1bcf6f444c76d7b702e08cf9bc20769e60f63cd71f8ad2f63615259cee9ac","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":true,"source":"adjudicated"},"G4":{"passed":true,"source":"agreed"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} +{"schema_version":1,"study_id":"cdeb-fresh-v4","candidate_id":"v4-e5b4843efae58483","repository_id":"agent-control-plane","decision_audit_anchor":"e5b4843efae58483aa9f02665e043574f7c9140962b4e3e33032b736794feca1","identity_present":false,"record_id":null,"protocol_version":null,"lifecycle":"active","storage_kind":"commit-trailer","gates":{"G1":{"passed":true,"source":"mechanical"},"G2":{"passed":false,"source":"agreed"},"G3":{"passed":false,"source":"adjudicated"},"G4":{"passed":true,"source":"adjudicated"},"G5":{"passed":true,"source":"agreed"},"G6":{"passed":true,"source":"mechanical"},"G7":{"passed":true,"source":"agreed"},"G8":{"passed":true,"source":"mechanical"}},"quote_overlap":0,"qualified":false,"exclusion_code":"insufficient-provenance","provenance_tier":"unsupported"} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/repository-summary.json b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/repository-summary.json new file mode 100644 index 00000000..d67bd9ac --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/repository-summary.json @@ -0,0 +1,67 @@ +{ + "schema_version": 1, + "study_id": "cdeb-fresh-v4", + "thresholds": { + "minEligibleRepositories": 3, + "minQualifiedPerRepository": 12, + "minTotalQualified": 48 + }, + "repositories": [ + { + "repository_id": "agent-control-plane", + "raw_decisions": 35, + "provenance_pass": 3, + "hidden_rationale_pass": 17, + "wrong_path_viable": 27, + "oracle_feasible": 30, + "shipping_delivery_feasible": 28, + "bounded": 33, + "final_qualified": 1, + "qualified_with_identity": 0, + "qualified_without_identity": 1, + "eligible": false + }, + { + "repository_id": "agent-operator-score", + "raw_decisions": 59, + "provenance_pass": 2, + "hidden_rationale_pass": 31, + "wrong_path_viable": 35, + "oracle_feasible": 56, + "shipping_delivery_feasible": 41, + "bounded": 58, + "final_qualified": 1, + "qualified_with_identity": 1, + "qualified_without_identity": 0, + "eligible": false + }, + { + "repository_id": "gitseed", + "raw_decisions": 104, + "provenance_pass": 4, + "hidden_rationale_pass": 32, + "wrong_path_viable": 62, + "oracle_feasible": 56, + "shipping_delivery_feasible": 42, + "bounded": 71, + "final_qualified": 2, + "qualified_with_identity": 2, + "qualified_without_identity": 0, + "eligible": false + }, + { + "repository_id": "logic-pro-mcp", + "raw_decisions": 43, + "provenance_pass": 8, + "hidden_rationale_pass": 22, + "wrong_path_viable": 19, + "oracle_feasible": 41, + "shipping_delivery_feasible": 43, + "bounded": 43, + "final_qualified": 2, + "qualified_with_identity": 0, + "qualified_without_identity": 2, + "eligible": false + } + ] +} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/review-stage-a.jsonl b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/review-stage-a.jsonl new file mode 100644 index 00000000..08fcc6fe --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/review-stage-a.jsonl @@ -0,0 +1,433 @@ +{"candidate_id":"v4-00efc0041ed3118a","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"put it inside seconds_until_reset","quoted_reason":"which made the artifact record \"resets in 3600s\" for a limit GitHub said resets in\n14400 — a false sentence in the durable record.","note":""} +{"candidate_id":"v4-03dd551058ce7aaf","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"**No test-only bypass flag was\nadded.**","quoted_reason":"a flag that disables it would be switched on\nin CI within a month, and then the tool would be the thing it was designed not to\nbe.","note":""} +{"candidate_id":"v4-0f4dfe2618796b54","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-122f5e996ed8f300","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-1f1cba75144b609f","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계가 정확히 그것이다.","quoted_reason":"GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다.","note":""} +{"candidate_id":"v4-2115a033e1fb37d0","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-2493fd41b194d8f4","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The gate first sampled the clean check once","quoted_reason":"which would clear a model failing 64% of the time on roughly a quarter of\nattempts — a gate that passes a broken model that often is decoration","note":""} +{"candidate_id":"v4-2616d7ae1c85fea4","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-2c70b58d7ce1117a","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The gate first sampled the clean check once","quoted_reason":"which would clear a model failing 64% of the time on roughly a quarter of\nattempts — a gate that passes a broken model that often is decoration","note":""} +{"candidate_id":"v4-30517866b1626071","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-31ea939e4478ded3","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-3258ac6e08349a04","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-377f04276465b59d","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"trusting the runner to have no egress","quoted_reason":"A test that passes because the sandbox\nblocked it is not a test that proved anything.","note":""} +{"candidate_id":"v4-4042654555ac20e4","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-468e579f86e22f91","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-4d2c072dffcb56ba","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계가 정확히 그것이다.","quoted_reason":"GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다.","note":""} +{"candidate_id":"v4-545d1c9c0d2b969e","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"recommended: bool","quoted_reason":"Recommendation.recommended is risk_verdict != HIGH, which makes zero\nsecurity coverage, zero score coverage, and unknown risk all read as a\npositive recommendation.","note":""} +{"candidate_id":"v4-572e09dba076a5a3","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-5f0d8829fcc6f198","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-63e1ec17f2bdadfe","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-66695090e5949ea6","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a tool whose default writes","quoted_reason":"a tool whose default writes is a\ntool that writes by accident — the first mistyped command, the first copied\nsnippet from a README.","note":""} +{"candidate_id":"v4-6a3b0b51071ec292","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-6aed03472a14ffc6","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"reopening closed AC items","quoted_reason":"Neither is a regression of the AC this ticket already checks off -- both are\ngaps the original AC never named.","note":""} +{"candidate_id":"v4-6d2eec862ac0f22c","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-7078a162153bab38","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A search that hits the limit there comes back short and says nothing","quoted_reason":"That is worse than failing: a failure gets noticed.","note":""} +{"candidate_id":"v4-77e1745655a235ce","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-79e5fcfd3fd49649","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`gradelore`","quoted_reason":"The shape was borrowed without the meaning.","note":""} +{"candidate_id":"v4-7b84423ed8fa9f34","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A ticket back-dated into a plan it never guided","quoted_reason":"is a lie that costs nothing to tell and everything to trust.","note":""} +{"candidate_id":"v4-7c0b5ea14295d54c","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"session-wide reversibility","quoted_reason":"successful stars are easy, successful follows are costly, and unknown or compensated failure states are permanent with their constraints recorded.","note":""} +{"candidate_id":"v4-7c3c09fcebd01801","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"not merely early within it","quoted_reason":"so a manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-7f42c3f1f7876679","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A screen that fires on those","quoted_reason":"gets switched off, and then nobody reads the real findings either.","note":""} +{"candidate_id":"v4-81773950b2e67c02","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"recommended: bool","quoted_reason":"which makes zero security coverage, zero score coverage, and unknown risk all read as a positive recommendation.","note":""} +{"candidate_id":"v4-81aa6660ab83f1dc","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"linked","quoted_reason":"a reader who does not know that undervaluation is not computable today is one plausible formula away from making every recommendation wrong in the same direction.","note":""} +{"candidate_id":"v4-849425816b8050cc","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-8ab61d73c22d675b","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"No retry, no default, no midpoint","quoted_reason":"a substituted number would enter the ranking and then be indistinguishable from one a model actually produced.","note":""} +{"candidate_id":"v4-8e59d287bd2f9248","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"not merely early within it","quoted_reason":"so a manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-8fc3d2ec14b1c078","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-9387c3b68473bda9","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"ADR-0001 chose `gradelore` on three grounds and two of them do not hold.","quoted_reason":"The shape was borrowed without the meaning.","note":""} +{"candidate_id":"v4-9c974f0a8436c03e","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Moving the fields into a struct nobody prints","quoted_reason":"would have left the defect in place.","note":""} +{"candidate_id":"v4-9cc0a659cfa12205","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"inventing a parallel idea.","quoted_reason":"The evidence module already had vocabulary for a claim resting on nothing","note":""} +{"candidate_id":"v4-9f9eb817a08ae4c9","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Multi-action and multi-target runs are not made atomic","quoted_reason":"because GitHub calls cannot be.","note":""} +{"candidate_id":"v4-a2ad4b77ea6a9a3b","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a2dbaee9c683ea83","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"ADR-0001 chose `gradelore` on three grounds and two of them do not hold.","quoted_reason":"The shape was borrowed without the meaning.","note":""} +{"candidate_id":"v4-a5b9e9e48752467e","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"one type with a frozen decorator.","quoted_reason":"#57 — a frozen dataclass wrapping mutable lists is not frozen.","note":""} +{"candidate_id":"v4-a7b04c5208e493e4","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a9ec5cd512c7c2c7","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Suppressing the ranking","quoted_reason":"would hide work that was done;","note":""} +{"candidate_id":"v4-a9edac0b4d0f80a8","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"not merely early within it","quoted_reason":"a manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-ada5ec890a36e5b2","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`if approved:`","quoted_reason":"`if approved:` can be deleted by a careless refactor; a required parameter cannot","note":""} +{"candidate_id":"v4-aec71c78e9675ad3","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Building unmeasured growth/undervaluation/share-loop\nmachinery","quoted_reason":"would repeat the mistake ADR-0007 and M0 exist to prevent, one\nlayer up, on the component closest to the product's public promise.","note":""} +{"candidate_id":"v4-b0282a5d21a52335","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계","quoted_reason":"GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다.","note":""} +{"candidate_id":"v4-b3568fcfe78e5aab","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a flag that disables it","quoted_reason":"would be switched on\nin CI within a month, and then the tool would be the thing it was designed not to\nbe.","note":""} +{"candidate_id":"v4-b9bba3d1416828fa","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A check like `if approved:`","quoted_reason":"puts the line between a UI and a violation on one branch, and that branch will\neventually be taken by mistake.","note":""} +{"candidate_id":"v4-badec4c4ee9efb2a","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-bef9b4e179c50fe8","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The gate first sampled the clean check once","quoted_reason":"which would clear a model failing 64% of the time on roughly a quarter of\nattempts — a gate that passes a broken model that often is decoration","note":""} +{"candidate_id":"v4-c08dac879bbde6a4","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"general\n file ordering was explicitly left unchanged","quoted_reason":"scoped out of that fix","note":""} +{"candidate_id":"v4-c27e59f236ed7496","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"not merely early within it","quoted_reason":"so a\n manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-c38d520fe83cb7d5","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A check like `if approved:`","quoted_reason":"puts the line between a UI and a violation on one branch, and that branch will\neventually be taken by mistake.","note":""} +{"candidate_id":"v4-c8e57b42ac2635de","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Recommendation.recommended is risk_verdict != HIGH","quoted_reason":"which makes zero\nsecurity coverage, zero score coverage, and unknown risk all read as a\npositive recommendation.","note":""} +{"candidate_id":"v4-c976dc2332d4adab","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A check like `if approved:`","quoted_reason":"puts the line between a UI and a violation on one branch, and that branch will\neventually be taken by mistake.","note":""} +{"candidate_id":"v4-cadfb63755c3f504","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"spending tokens to re-decide it","quoted_reason":"the real one is that an enthusiastic grade becomes an argument to\noverride a security signal.","note":""} +{"candidate_id":"v4-d56e88f5ef1b62cb","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-d5b3514664089aef","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-d9887355b9eff3e9","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Partial results are kept\nand flagged, never discarded and never passed off as whole.","quoted_reason":"A search that\nhits the limit there comes back short and says nothing, and the caller writes a\nsmaller world into the database believing it is the whole one. That is worse\nthan failing: a failure gets noticed.","note":""} +{"candidate_id":"v4-dc67b4d3b699b947","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계","quoted_reason":"GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다.","note":""} +{"candidate_id":"v4-df6bfd03300910e2","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"an instructions file alone is reported as uncategorized rather than as a product classification.","quoted_reason":"The built-in coding-agents pack requires AGENTS.md plus deterministic agent runtime source evidence","note":""} +{"candidate_id":"v4-e25462e19110c9eb","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-e5a87ee0d8e99a1e","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`if approved:`","quoted_reason":"can be deleted by a careless refactor; a required parameter cannot,\nand `Approval` is only constructed by a function that read a keystroke from a\nterminal.","note":""} +{"candidate_id":"v4-e82c306ec9e425b2","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`gradelore`","quoted_reason":"In CommitLore the `lore` has a\nreferent — the accumulated decision knowledge attached to commits, which is the\nproduct. In `gradelore` the `lore` would be the scores, and 8/10 is a number,\nnot something handed down. The shape was borrowed without the meaning.","note":""} +{"candidate_id":"v4-ea459217291aa8a3","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"not merely early within it","quoted_reason":"so a\n manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-f4404e6e27e534e5","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`PipelineResult.complete` is therefore never inferred from a non-empty list.","quoted_reason":"a\nrate limit shortens the candidate list, a screening error shortens it, a model\nthat refuses shortens it — and every one of those looks exactly like \"not many\ngood repositories today\". The second is a finding; the first three are bugs, and\na reviewer approving against them is approving against a picture that was never\nreal.","note":""} +{"candidate_id":"v4-f75d4b634c14b66c","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`PipelineResult.complete` is therefore never inferred from a non-empty list.","quoted_reason":"a\nrate limit shortens the candidate list, a screening error shortens it, a model\nthat refuses shortens it — and every one of those looks exactly like \"not many\ngood repositories today\". The second is a finding; the first three are bugs, and\na reviewer approving against them is approving against a picture that was never\nreal.","note":""} +{"candidate_id":"v4-002ffd1e428c572a","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Restoring the literal list in the previous ticket","quoted_reason":"I accepted a review\nfinding that the relaxed form \"lost detection\" without checking that a stronger guard\nalready covered it.","note":""} +{"candidate_id":"v4-00b9b5b83c4ddf87","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"to strike the period from six\ntickets","quoted_reason":"which trades a pattern too strict for its own corpus for six edits\nthat invite the same defect the next time someone writes a sentence.","note":""} +{"candidate_id":"v4-04c1de5e41d66868","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Putting them in the frozen document","quoted_reason":"the ticket grants\nfixtures/doctor/*.json and a ticket outranks a convention.","note":""} +{"candidate_id":"v4-09c4183e165a4da4","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a wildcard","quoted_reason":"a rogue product file plus a one-line\nownership edit passed the whole suite under the wildcard, where the literal census fails\nfour tests.","note":""} +{"candidate_id":"v4-0bc581744204a282","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"an Ed25519 attestation","quoted_reason":"The\nSSOT has no signature, attestation or key-management clause anywhere, so it was invented\narchitecture in a contract-freezing ticket; worse, the canonical sessions were signed\nover their full content by a key whose private half was not kept, which would have made\nthem unamendable by any future ticket.","note":""} +{"candidate_id":"v4-0f8cd38c8ba43cfe","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-12b0486cd77dd3a9","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"believing the verdict the document declares","quoted_reason":"The declared-verdict comparison was bypassable: padding expected.failed_gates\nwith one unknown or duplicated entry disabled the only check comparing declared against\nderived issuability, so a document could declare a NOT_OBSERVED candidate issuable, which\nis precisely what this ticket exists to prevent.","note":""} +{"candidate_id":"v4-14a911a7f4c96afb","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"supplemented","quoted_reason":"It asserted only that the frozen sibling\nmatrix currently contains all three classes; it never called the inventory with a subset,\nso both filter mutations still returned all three and survived.","note":""} +{"candidate_id":"v4-163c7d58d0692423","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"added to the timing","quoted_reason":"The preregistered assumptions carry no\noverhead term and the family distributions are the only declared source of\nminutes; inventing one would be fabricated timing, which the ticket forbids.","note":""} +{"candidate_id":"v4-1a5dea10137de7da","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Writing its\nintruder file into the live tree","quoted_reason":"raced with the fixture tests that copy this repository\nwhile it was present, failing three unrelated cases.","note":""} +{"candidate_id":"v4-1bc2a34840360fd0","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"pinned literally","quoted_reason":"the ticket-owned list grows with every product ticket","note":""} +{"candidate_id":"v4-23ba99c6da04e46f","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"an Ed25519 attestation","quoted_reason":"The\nSSOT has no signature, attestation or key-management clause anywhere, so it was invented\narchitecture in a contract-freezing ticket; worse, the canonical sessions were signed\nover their full content by a key whose private half was not kept, which would have made\nthem unamendable by any future ticket.","note":""} +{"candidate_id":"v4-261cdc76929d85cc","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"believing the verdict the document declares","quoted_reason":"The declared-verdict comparison was bypassable: padding expected.failed_gates\nwith one unknown or duplicated entry disabled the only check comparing declared against\nderived issuability, so a document could declare a NOT_OBSERVED candidate issuable, which\nis precisely what this ticket exists to prevent.","note":""} +{"candidate_id":"v4-2cadeedf7d7f2251","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Restoring the literal list in the previous ticket was my error","quoted_reason":"I accepted a review finding that the relaxed form \"lost detection\" without checking that a stronger guard already covered it.","note":""} +{"candidate_id":"v4-32281c33a0cd1d51","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"An earlier attempt closed that gap with an Ed25519 attestation and was reverted.","quoted_reason":"The SSOT has no signature, attestation or key-management clause anywhere, so it was invented architecture in a contract-freezing ticket; worse, the canonical sessions were signed over their full content by a key whose private half was not kept, which would have made them unamendable by any future ticket. A trust root with no owner and no rotation reads as proof while resting on a keypair nobody holds.","note":""} +{"candidate_id":"v4-34aef026d81c2f6b","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"filtering them later","quoted_reason":"a stale or hand-edited document cannot become authority over live repository state.","note":""} +{"candidate_id":"v4-3a462c35336b7325","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Its output is no longer pinned literally","quoted_reason":"the ticket-owned list grows with every product ticket","note":""} +{"candidate_id":"v4-4b7ef509f0403505","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Node 20","quoted_reason":"its test runner does not discover a .ts test file at all, so the thirteen metric-registry cases never ran there and their absence looked like success.","note":""} +{"candidate_id":"v4-50c24e701b7ba2ef","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-575de52ba54d6758","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-5eb2760a3fa148f3","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Parsing declared ownership looked simpler","quoted_reason":"D0-004's own ownership paragraph turned out to name maintainer-gate-registry.v1.json as a path that must NOT be restored, which a naive reading would have demanded exist.","note":""} +{"candidate_id":"v4-5f6e3fcc52a2df1d","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Cross-file atomicity is not available","quoted_reason":"the renderer is made reversible instead","note":""} +{"candidate_id":"v4-60e3f694ae5ca2d5","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-7362d21baaf5d618","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The required-core condition replaced the old derivable check rather than joining it","quoted_reason":"a complete core implies both indices derive and the pair would have shipped an unkillable conjunct.","note":""} +{"candidate_id":"v4-8001a8835a9351e3","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Restoring the literal list in the previous ticket was my error","quoted_reason":"I accepted a review finding that the relaxed form \"lost detection\" without checking that a stronger guard already covered it.","note":""} +{"candidate_id":"v4-82ae5492d09483d9","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Identifier order is never a tie-break","quoted_reason":"because that would be an arbitrary prescription under a deterministic name.","note":""} +{"candidate_id":"v4-841244a354bd70c7","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The required-core condition replaced the old derivable check rather than joining it","quoted_reason":"because a complete core implies both indices derive and the pair would have shipped an unkillable conjunct.","note":""} +{"candidate_id":"v4-843485d931913281","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"kept as an unkillable guard","quoted_reason":"The required-observed filter was dead by construction","note":""} +{"candidate_id":"v4-88299d9c1503bc7b","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Parsing declared ownership looked simpler","quoted_reason":"D0-004's own ownership paragraph turned out to name maintainer-gate-registry.v1.json as a path that must NOT be restored, which a naive reading would have demanded exist.","note":""} +{"candidate_id":"v4-89d86d3677fb18ef","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-8c7fdf80ae6c6f2e","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Identifier order is never a tie-break","quoted_reason":"because that would be an arbitrary prescription under a deterministic name.","note":""} +{"candidate_id":"v4-8f24735524874167","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Putting them in the frozen document","quoted_reason":"the ticket grants fixtures/doctor/*.json and a ticket outranks a convention.","note":""} +{"candidate_id":"v4-915f4e606299276c","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-975a69717305d00f","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-9b42b1951da730e1","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a0489f4a19bc3969","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"kept as an unkillable guard","quoted_reason":"The required-observed filter was dead by construction","note":""} +{"candidate_id":"v4-a2acb02e41d42051","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a3705f2f819df548","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a3d2b14112b034a4","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"never requesting the next page","quoted_reason":"the collector's single-page search hit its own page size","note":""} +{"candidate_id":"v4-ad1efe720ca11f3c","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"transition_overhead is declared in specs/pack-simulation.v0.json and is deliberately not added to the timing.","quoted_reason":"inventing one would be fabricated timing, which the ticket forbids.","note":""} +{"candidate_id":"v4-b525ee2c84544b9e","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"transition_overhead is declared in specs/pack-simulation.v0.json and is deliberately not added to the timing.","quoted_reason":"inventing one would be fabricated timing, which the ticket forbids.","note":""} +{"candidate_id":"v4-bed5fc386048e412","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"I previously tried to fix this in the resolver first.","quoted_reason":"That was the wrong order: the ticket is the authority and the implementation follows it, not the reverse.","note":""} +{"candidate_id":"v4-c15e92a3b1a755d4","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"filtering them later","quoted_reason":"so a stale or hand-edited document cannot become authority over live repository state.","note":""} +{"candidate_id":"v4-c20a082f262f21c8","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Putting them in the frozen document","quoted_reason":"the ticket grants fixtures/doctor/*.json and a ticket outranks a convention.","note":""} +{"candidate_id":"v4-c61d7c943edd8cff","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a wildcard","quoted_reason":"The review covered growth: a rogue product file plus a one-line\nownership edit passed the whole suite under the wildcard, where the literal census fails\nfour tests.","note":""} +{"candidate_id":"v4-cc76268ad4bb9a3e","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-ce2adee3c134ab03","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a wildcard","quoted_reason":"The review covered growth: a rogue product file plus a one-line\nownership edit passed the whole suite under the wildcard, where the literal census fails\nfour tests.","note":""} +{"candidate_id":"v4-d47951eaaa562775","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-d4b46b8cf85b5425","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-dd4a74ba2b628991","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-e0d8d11b190e4e26","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The renderer read `parsed.issues`","quoted_reason":"while the catalog declares `tickets`, so every\nprojection rendered empty.","note":""} +{"candidate_id":"v4-e238e7785a6466b5","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-e2c33042f79e2776","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"rather than entering it as a failure","quoted_reason":"so missing adapter data is reported as missing evidence and never as\noperator failure.","note":""} +{"candidate_id":"v4-e3aa102492b031b1","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-e7587b2b65750306","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Encoding the contract correctly was\nrejected.","quoted_reason":"their vectors carried an invented {key,total} shape,\nand the validator enforced the invented side.","note":""} +{"candidate_id":"v4-ece19dc4cef7c803","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-f691593763c944c4","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"rather than\nentering it as a failure","quoted_reason":"so missing adapter data is reported as missing evidence and\nnever as operator failure.","note":""} +{"candidate_id":"v4-f83f6dbc19155e50","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Encoding the contract correctly was\nrejected.","quoted_reason":"their vectors carried an invented {key,total} shape,\nand the validator enforced the invented side.","note":""} +{"candidate_id":"v4-02764fbf10ceedc1","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A containment match would find this control through クリック","quoted_reason":"but would equally let an unrelated label containing 再生 be taken for Play, which is the\nlocale collision the policy exists to prevent.","note":""} +{"candidate_id":"v4-0d2959b1d2bbcec0","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"it said to run project.close with confirmation","quoted_reason":"from this state\nthere is nothing to close. A caller following it is sent somewhere else.","note":""} +{"candidate_id":"v4-0e840c8816f442f7","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"it said to run project.close with confirmation","quoted_reason":"from this state\nthere is nothing to close. A caller following it is sent somewhere else.","note":""} +{"candidate_id":"v4-129a3640dab8b53d","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"main added the strict AXEnabled guard and a coordFree\n parameter with a coordinate branch; this branch removes the coordinate branch\n entirely.","quoted_reason":"a disabled entry must still be refused before actuation, and that is orthogonal\n to how the pick is performed.","note":""} +{"candidate_id":"v4-132048855f4d7a5d","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A shallow search and an ancestor-based filter","quoted_reason":"both still produced 0, so neither is the rule.","note":""} +{"candidate_id":"v4-218954b5ef6d08d7","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"flipping the default","quoted_reason":"the flip missed the\npath that still fail-opens.","note":""} +{"candidate_id":"v4-25eb689fdb9ad98b","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"exposing or retiring them","quoted_reason":"those ARE implemented, so exposing or retiring them is a decision that overlaps #302, not dead weight to sweep.","note":""} +{"candidate_id":"v4-2714c211175c4737","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A graph assembled from this\nreader","quoted_reason":"would be a list of display strings with no bus numbers and no send edges, which would look\nlike the ADR surface without being one.","note":""} +{"candidate_id":"v4-2756fbb39f4afc15","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Name alone","quoted_reason":"On the probe project all twenty regions are named\n\"MIDI Region\", so any one of them could have certified any other.","note":""} +{"candidate_id":"v4-277e883c8a9d3eec","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a window saying no","quoted_reason":"Apple documents `AXModal` as recommended rather than required for windows,\nso its absence is not proof of `false` — the same guess as the subrole list, one attribute over.","note":""} +{"candidate_id":"v4-2853e493f4781414","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"It pressed Escape and then looked for the discard button","quoted_reason":"Escape\nCANCELS the save prompt, so the sequence defeated itself, Logic stayed running, and `open -a` on a\nrunning application does nothing, which left the old language in place.","note":""} +{"candidate_id":"v4-29c6beda0309a747","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A graph assembled from this\nreader","quoted_reason":"would be a list of display strings with no bus numbers and no send edges, which would look\nlike the ADR surface without being one.","note":""} +{"candidate_id":"v4-29c79faa31cc4fe2","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"isVisibleArrangeRegion","quoted_reason":"which returns true when either\nframe is unreadable. Failing open is right when deciding whether to include a region it can see, and\nwrong here: an unreadable header would inflate a completeness claim, which is the direction that lets\nan absence be published as proof.","note":""} +{"candidate_id":"v4-2aee6afaad42b119","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"main added the strict AXEnabled guard and a coordFree\n parameter with a coordinate branch; this branch removes the coordinate branch\n entirely.","quoted_reason":"a disabled entry must still be refused before actuation, and that is orthogonal\n to how the pick is performed.","note":""} +{"candidate_id":"v4-304262d2dae79858","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Wiring it into `export_run artifacts:[stem]`","quoted_reason":"waits on one question: what an\nartifact plan promises when the names arrive late, and what `fail_if_exists` means then.","note":""} +{"candidate_id":"v4-30b8d25980ce48a3","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"regions cannot be the denominator","quoted_reason":"21 tracks visible, 20 carrying a region.","note":""} +{"candidate_id":"v4-5a1a7e7a347c6cc0","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A match on\n\"input\" alone","quoted_reason":"publishes a toggle as a signal source","note":""} +{"candidate_id":"v4-632dec3f10f1e65b","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a duration in it first — \"stayed disabled for 12s\"","quoted_reason":"the code does not measure elapsed time, it counts iterations.","note":""} +{"candidate_id":"v4-67ab88f48731b3f1","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"AXPress on the arrow actuates it.","quoted_reason":"the press answers .success and the value does not move","note":""} +{"candidate_id":"v4-710b1008c427461f","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The refusal branch cannot be reached live.","quoted_reason":"a transient this run cannot induce without corrupting the very tree it is measuring, and inducing it would prove the fake rather than the guard.","note":""} +{"candidate_id":"v4-748bedfbbe5fe417","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"this issue to close with a measurement showing the surface cannot drive\nper-track export","quoted_reason":"Real audio, from the surface the plan said could not make it.","note":""} +{"candidate_id":"v4-865d5bb5450bc905","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Scope is deliberately not represented as a filter.","quoted_reason":"It is not a checkbox, and the\nassessment already binds it through region identity, which compares two\nindependently obtained identities instead of trusting a boolean. Encoding it twice\nwould let the weaker signal stand in for the stronger one.","note":""} +{"candidate_id":"v4-8ea4400a37180162","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The one-line change to .github/workflows/release.yml","quoted_reason":"the token lacks the `workflow` scope, and GitHub refuses any merge that\ntouches a workflow file without it.","note":""} +{"candidate_id":"v4-8f7493456cee37a3","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"AXPress on the arrow actuates it.","quoted_reason":"the press answers .success and the value does not move","note":""} +{"candidate_id":"v4-959435801c3ef505","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"this issue to close with a measurement showing the surface cannot drive\nper-track export","quoted_reason":"Real audio, from the surface the plan said could not make it.","note":""} +{"candidate_id":"v4-97dfb7f923f08d18","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`swift build`","quoted_reason":"The result compiled as a library and failed only when\nthe test target was built.","note":""} +{"candidate_id":"v4-a0550761c1997566","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`region.select_last` stays unregistered, and that is a decision rather than an omission.","quoted_reason":"It selects by screen geometry, and measured live against this project the filter it uses (`h > 20`) excludes every region on screen, because regions are 13 points tall at this vertical zoom — it answers \"no region\" on a project with twenty of them.","note":""} +{"candidate_id":"v4-a2ab2ce0394ace90","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Name alone","quoted_reason":"would not have been enough. On the probe project all twenty regions are named\n\"MIDI Region\", so any one of them could have certified any other.","note":""} +{"candidate_id":"v4-ae1693443c4f039f","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"one pattern for both languages","quoted_reason":"The two languages put the number on opposite sides of it:","note":""} +{"candidate_id":"v4-aea1ebe08b663d1c","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a title-only rule","quoted_reason":"A project the user names \"Choose a\nProject\" produces the arrange window \"Choose a Project - Tracks\", which contains the phrase — so on a\ntitle-only rule that window stops being counted, and `project.new` proceeds with a genuine document\nopen.","note":""} +{"candidate_id":"v4-b62d3f38467138a5","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`name starts with \"Undo\" and name contains \"Track Stack\"`","quoted_reason":"So does \"Undo Create Track\nStack\" — and clicking that DELETES the stack the run exists to read.","note":""} +{"candidate_id":"v4-cccd3e7fae599767","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A shallow search and an ancestor-based filter","quoted_reason":"were both tried against the live panel and\nboth still produced 0, so neither is the rule.","note":""} +{"candidate_id":"v4-d171f3ea2a7f7362","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"widening a removal past the issue that motivated it","quoted_reason":"is how a scoped fix becomes an unreviewed one.","note":""} +{"candidate_id":"v4-d7d1121164366d9c","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"reading back the\nsetting the run just wrote","quoted_reason":"Logic came up in\nEnglish, the precondition caught it, and the run failed instead of testing English and filing it as\nKorean evidence.","note":""} +{"candidate_id":"v4-dd97491c4d227316","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"widening a removal past the issue that motivated it","quoted_reason":"is how a scoped fix becomes an unreviewed one.","note":""} +{"candidate_id":"v4-de1096e077fa22d6","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"T1 blocked on a contract decision: \"what State does a partially\nsuccessful stem run report\"","quoted_reason":"It has one, and it is in the executor `export_run artifacts:[stem]` already flows through.","note":""} +{"candidate_id":"v4-de409d80b116c6ee","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`logic_edit.undo`","quoted_reason":"It routes to the send-only key-command channels, which need\na bound key command this run never established","note":""} +{"candidate_id":"v4-eef995b442c7a008","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"#577 made the empty-region branch State B unconditionally.","quoted_reason":"With completeness measured, the sharper verdict comes back exactly where it is earned. A readback\nthat covered the WHOLE arrangement and still found no imported region is evidence that none was\ncreated","note":""} +{"candidate_id":"v4-f05b91620a25eee7","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`logic_edit.undo`","quoted_reason":"It routes to the send-only key-command channels, which need\na bound key command this run never established","note":""} +{"candidate_id":"v4-f0ea9a2a5b68115b","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"T1 \"stands alone and is buildable\"","quoted_reason":"A standalone stem drive has no third place to land. It would either need a new public operation, which is a surface decision rather than a free choice inside this ticket, or it would sit implemented and unrouted.","note":""} +{"candidate_id":"v4-f149c003cc5dae5d","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-f51f8964286329bb","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The first version of this harness tried to\nprobe them","quoted_reason":"`mixer.set_send` and `automation.set_mode` cannot be probed live at all, and the run says so instead\nof dressing a probe of something else as evidence: both are implemented and registered for no tool,\nso their survival rests on the table and the unit suite.","note":""} +{"candidate_id":"v4-fd7263067698db44","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a subrole allowlist","quoted_reason":"measured on\nLogic 12.3 the Go To Position window is `AXFloatingWindow` with `AXModal == true` and no allowlist\ncould classify it.","note":""} +{"candidate_id":"v4-0d7c38f6a60e8b36","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"in a table\nelsewhere","quoted_reason":"Prose kept apart from code drifts: this\nrepository's README spent a day calling a closed issue an open blocker.","note":""} +{"candidate_id":"v4-0ef57b3438b7d16b","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"comparing the two contract exports","quoted_reason":"both come from the same derivation. It said nothing about whether the process\nthat waits on the child still reads the constant — which is the drift that\ncaused the bug.","note":""} +{"candidate_id":"v4-0ef8cafdf0d11499","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-120b48f40e73f330","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"weakened","quoted_reason":"what the code can keep","note":""} +{"candidate_id":"v4-1a18ceae8a4645cf","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"writing a row for it\nhere","quoted_reason":"A claim currently sitting in `inbound_messages`\nbelongs to a turn whose outcome nobody established, and writing a row for it\nhere would assert a state this migration cannot observe.","note":""} +{"candidate_id":"v4-23f26b69f816664d","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"removing the line","quoted_reason":"the decision is a record, and\nremoving the line would hide that the mechanism was licensed by this\ndocument rather than adopted against it.","note":""} +{"candidate_id":"v4-3ba6d8b1fa31e10f","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The summary was written from this invocation's in-memory results.","quoted_reason":"A partial\nre-run knows only about the areas it just ran, so it rewrote the whole file and recorded\nevery untouched area as errored","note":""} +{"candidate_id":"v4-4001fa0211128649","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`advisoryState` derived `EXHAUSTED` from `lowest === null`","quoted_reason":"The buckets array is empty because nothing was read. grok itself was\nworking the whole time — its billing token expires every six hours, and\nusing the CLI is what renews it. No reset was ever going to arrive.","note":""} +{"candidate_id":"v4-431dceed9013cb2b","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"fixing only the first","quoted_reason":"the retained-read path in assertOwnerDecisionReceipt had the same dependency, so fixing only the first left the gate still closing.","note":""} +{"candidate_id":"v4-45caf6be5b46889d","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"So the fix is the reconciliation, not the twenty entries","quoted_reason":"The original list was not wrong so much as unreconciled: it was assembled by hand around the guards someone had reason to worry about, and nothing ever compared it to the schema.","note":""} +{"candidate_id":"v4-50d2354c5c9210d1","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"local test counts","quoted_reason":"because CI is the only signal this repository trusts.","note":""} +{"candidate_id":"v4-56a540b834736c43","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The CLI payload was cast rather than checked","quoted_reason":"so a row that matched by name while omitting channel_id produced an undefined address that available() called usable.","note":""} +{"candidate_id":"v4-5b3c19da588ec1d0","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a seatbelt profile that denies network outright","quoted_reason":"breaks dyld","note":""} +{"candidate_id":"v4-6ace14eeff8e0235","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Making a disposable tree claimable","quoted_reason":"it also widens what a claim means for every other caller, and the guard can already answer that question from the two facts it now has.","note":""} +{"candidate_id":"v4-6fa12e79e96b6cc1","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-77018bc628e62482","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-83c6c0a5f5542b97","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The boundary file's own P1-14 cases are deleted rather than ported","quoted_reason":"they constructed `GhCliClient`, the gh-subprocess client the App credential store replaced, and a test that builds a class nobody ships proves nothing.","note":""} +{"candidate_id":"v4-8826ee094751e0ef","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"`pool: \"threads\"` runs that in worker threads","quoted_reason":"where a native addon can take the whole worker down","note":""} +{"candidate_id":"v4-8dbd6ece65df6bf7","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a second run that could disagree with it","quoted_reason":"on the runner the second run produced no output file while the first passed","note":""} +{"candidate_id":"v4-a0bf288e0dd97d24","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a new message on this chat is held rather than run","quoted_reason":"the gate that would hold it does not exist yet. That sentence states a false fact about the system","note":""} +{"candidate_id":"v4-a6950ee840587dbc","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a word ban","quoted_reason":"would have produced\nthousands of hits and been switched off inside a week.","note":""} +{"candidate_id":"v4-ac85b82316ac5980","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"queued","quoted_reason":"A queue would hold the caller\nfor the length of a turn, which is the stall the port is being taken out of\nthe poll loop to remove; and the ordering a queue imposes belongs to #631,\nwhere the update is durable.","note":""} +{"candidate_id":"v4-b4647e5b48ad0f67","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a refusal for an observation older than the newest stored reading","quoted_reason":"It rejected the input docs/capacity-source.md instructs the operator to send — the\nprovider-reported observedAt, necessarily in the past, against collectors that stamp an\nERROR every four minutes — and rejected it with the reason code #424 was filed under. New\ncode that refuses the documented path is the thing that is wrong.","note":""} +{"candidate_id":"v4-b48724ec04025b41","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a word ban","quoted_reason":"would have produced\nthousands of hits and been switched off inside a week.","note":""} +{"candidate_id":"v4-bd395d87b2865263","reviewer":"reviewer-1","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-c25228afc16748b3","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"the\ninteractive TUI","quoted_reason":"Every earlier review round ran through the\ninteractive TUI, died, and left partial output formatted exactly like a finished review —\none citing code that had already been deleted.","note":""} +{"candidate_id":"v4-c8feb84e83c19266","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"requiring it earlier","quoted_reason":"blocks every merge that is not a completed ACP run, including the merge\nthat would fix whatever stopped the daemon publishing.","note":""} +{"candidate_id":"v4-cb7c81aa3e7a1d8c","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A reason code","quoted_reason":"would not do:\nit is a label the caller attaches, and adding a refusal that reused an\nexisting code would move it to the wrong side of the boundary silently.","note":""} +{"candidate_id":"v4-cf7752a9fa65978e","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a refusal for an observation older than the newest stored reading","quoted_reason":"It rejected the input docs/capacity-source.md instructs the operator to send — the\nprovider-reported observedAt, necessarily in the past, against collectors that stamp an\nERROR every four minutes — and rejected it with the reason code #424 was filed under. New\ncode that refuses the documented path is the thing that is wrong.","note":""} +{"candidate_id":"v4-d3094729cb02a074","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"Recording them\nseparately","quoted_reason":"would leave a window where a crash produces a row that is claimed\nbut says nothing about what it claimed — a fourth state, and one nothing can\nresolve, added to the three this file already distinguishes.","note":""} +{"candidate_id":"v4-d3c77723a8e09894","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"a stored conversation id","quoted_reason":"A second column would be a second definition, free to\ndisagree with the first.","note":""} +{"candidate_id":"v4-d61d9c73e11754bc","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"queued","quoted_reason":"A queue would hold the caller\nfor the length of a turn, which is the stall the port is being taken out of\nthe poll loop to remove; and the ordering a queue imposes belongs to #631,\nwhere the update is durable.","note":""} +{"candidate_id":"v4-db58634970ebbdf7","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"A first draft compared against `result_json IS NULL` and refused every real message","quoted_reason":"`TelegramIngress.admit` writes `phase: \"ADMITTED\"` immediately, so the column is never null on that path. The existing tests caught it.","note":""} +{"candidate_id":"v4-ded1bcf6f444c76d","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"An earlier shape skipped the probe while an observation was current","quoted_reason":"which turned every §14.2 allocation gate into a cache: a collector that had come back and now reported exhaustion could not refuse the run. Preserving inside `refresh` is what protects the observation, so the skip was both redundant and harmful and is gone.","note":""} +{"candidate_id":"v4-e5b4843efae58483","reviewer":"reviewer-1","states_rejected_alternative":true,"quoted_alternative":"The dying-proxy test slept a fixed 150ms and then asserted the death had been observed","quoted_reason":"on a loaded runner that window closes early, the assertion throws, and because it throws before `finalise` the lease's proxy is never released. It holds the fixed port, and the next test in the file waits on a port it can never get — surfacing as an unrelated 60s timeout.","note":""} +{"candidate_id":"v4-00efc0041ed3118a","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"An earlier attempt put it inside seconds_until_reset","quoted_reason":"which made\nthe artifact record \"resets in 3600s\" for a limit GitHub said resets in\n14400 — a false sentence in the durable record. What the server said and how\nlong this process is willing to wait are different questions, and one value\ncannot answer both.","note":""} +{"candidate_id":"v4-03dd551058ce7aaf","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"No test-only bypass flag was\nadded.","quoted_reason":"The refusal is the feature; a flag that disables it would be switched on\nin CI within a month, and then the tool would be the thing it was designed not to\nbe.","note":""} +{"candidate_id":"v4-0f4dfe2618796b54","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-122f5e996ed8f300","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-1f1cba75144b609f","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"버리는 것은 그것을 실행하는\n방식이다.","quoted_reason":"GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다. 씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계가 정확히 그것이다.","note":""} +{"candidate_id":"v4-2115a033e1fb37d0","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-2493fd41b194d8f4","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The gate first sampled the clean check once","quoted_reason":"which would clear a model failing 64% of the time on roughly a quarter of\nattempts — a gate that passes a broken model that often is decoration, so it\nsamples five times now.","note":""} +{"candidate_id":"v4-2616d7ae1c85fea4","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-2c70b58d7ce1117a","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The gate first sampled the clean check once","quoted_reason":"which would clear a model failing 64% of the time on roughly a quarter of\nattempts — a gate that passes a broken model that often is decoration, so it\nsamples five times now.","note":""} +{"candidate_id":"v4-30517866b1626071","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-31ea939e4478ded3","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-3258ac6e08349a04","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"by commit order","quoted_reason":"Entries are grouped by what a user needs to know rather than by commit order","note":""} +{"candidate_id":"v4-377f04276465b59d","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"trusting the runner to have no egress","quoted_reason":"A test that passes because the sandbox\nblocked it is not a test that proved anything.","note":""} +{"candidate_id":"v4-4042654555ac20e4","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"the radar table sorts on the deterministic\nmetadata score while the approval queue sorts on Reviewed.score\n(grade.idea + grade.skill) -- two independent orderings from the same run","quoted_reason":"with nothing enforcing agreement between them.","note":""} +{"candidate_id":"v4-468e579f86e22f91","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-4d2c072dffcb56ba","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"fetch->evaluate->subscribe->star 체이닝","quoted_reason":"GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다.","note":""} +{"candidate_id":"v4-545d1c9c0d2b969e","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Recommendation.recommended is risk_verdict != HIGH","quoted_reason":"which makes zero\nsecurity coverage, zero score coverage, and unknown risk all read as a\npositive recommendation.","note":""} +{"candidate_id":"v4-572e09dba076a5a3","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-5f0d8829fcc6f198","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-63e1ec17f2bdadfe","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-66695090e5949ea6","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Suppressing the\nranking","quoted_reason":"would hide work that was done","note":""} +{"candidate_id":"v4-6a3b0b51071ec292","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-6aed03472a14ffc6","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"reopening closed AC items","quoted_reason":"Neither is a regression of the AC this ticket already checks off -- both are\ngaps the original AC never named.","note":""} +{"candidate_id":"v4-6d2eec862ac0f22c","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-7078a162153bab38","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A search that\nhits the limit there comes back short and says nothing, and the caller writes a\nsmaller world into the database believing it is the whole one.","quoted_reason":"That is worse\nthan failing: a failure gets noticed.","note":""} +{"candidate_id":"v4-77e1745655a235ce","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-79e5fcfd3fd49649","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"ADR-0001 chose `gradelore` on three grounds and two of them do not hold.","quoted_reason":"In `gradelore` the `lore` would be the scores, and 8/10 is a number,\nnot something handed down. The shape was borrowed without the meaning.","note":""} +{"candidate_id":"v4-7b84423ed8fa9f34","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A ticket back-dated into a plan it never\nguided","quoted_reason":"is a lie that costs nothing to tell and everything to trust.","note":""} +{"candidate_id":"v4-7c0b5ea14295d54c","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Intent commits no longer claim session-wide reversibility.","quoted_reason":"Outcome commits derive Undo from each action and status: successful stars are easy, successful follows are costly, and unknown or compensated failure states are permanent with their constraints recorded.","note":""} +{"candidate_id":"v4-7c3c09fcebd01801","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"selects priority matches before the\n 20-file count cap is applied at all -- not merely early within it --","quoted_reason":"so a\n manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-7f42c3f1f7876679","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A Signal cannot be constructed without a citation — path, 1-based line, and the\nline itself.","quoted_reason":"An uncitable finding is the\nfailure this layer exists to avoid: the seed emitted a boolean whose stated\nreason sometimes said the code was fine, and a user could not go and look.","note":""} +{"candidate_id":"v4-81773950b2e67c02","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Recommendation.recommended is risk_verdict != HIGH","quoted_reason":"which makes zero\nsecurity coverage, zero score coverage, and unknown risk all read as a\npositive recommendation.","note":""} +{"candidate_id":"v4-81aa6660ab83f1dc","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"ADR-0012's boundary is restated here rather than linked","quoted_reason":"because a reader who\ndoes not know that undervaluation is not computable today is one plausible\nformula away from making every recommendation wrong in the same direction.","note":""} +{"candidate_id":"v4-849425816b8050cc","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-8ab61d73c22d675b","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"No retry, no default, no midpoint","quoted_reason":"a\nsubstituted number would enter the ranking and then be indistinguishable\nfrom one a model actually produced.","note":""} +{"candidate_id":"v4-8e59d287bd2f9248","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"selects priority matches before the\n 20-file count cap is applied at all -- not merely early within it --","quoted_reason":"so a\n manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-8fc3d2ec14b1c078","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Sleeping for up to an hour inside a library call","quoted_reason":"is the caller's decision","note":""} +{"candidate_id":"v4-9387c3b68473bda9","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`gradelore`","quoted_reason":"The shape was borrowed without the meaning.","note":""} +{"candidate_id":"v4-9c974f0a8436c03e","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Moving the fields into a struct nobody prints","quoted_reason":"would have left the defect in place.","note":""} +{"candidate_id":"v4-9cc0a659cfa12205","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"inventing a parallel idea","quoted_reason":"The evidence module already had vocabulary for a claim resting on nothing","note":""} +{"candidate_id":"v4-9f9eb817a08ae4c9","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"made atomic","quoted_reason":"because GitHub calls cannot be.","note":""} +{"candidate_id":"v4-a2ad4b77ea6a9a3b","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a2dbaee9c683ea83","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`gradelore`","quoted_reason":"The shape was borrowed without the meaning.","note":""} +{"candidate_id":"v4-a5b9e9e48752467e","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"one type with a frozen decorator","quoted_reason":"a frozen dataclass wrapping mutable lists is not frozen.","note":""} +{"candidate_id":"v4-a7b04c5208e493e4","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a9ec5cd512c7c2c7","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Suppressing the ranking","quoted_reason":"would hide work that was done","note":""} +{"candidate_id":"v4-a9edac0b4d0f80a8","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"merely early within it","quoted_reason":"so a manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-ada5ec890a36e5b2","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`if approved:`","quoted_reason":"can be deleted by a careless refactor","note":""} +{"candidate_id":"v4-aec71c78e9675ad3","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Building unmeasured growth/undervaluation/share-loop\nmachinery","quoted_reason":"would repeat the mistake ADR-0007 and M0 exist to prevent, one\nlayer up, on the component closest to the product's public promise.","note":""} +{"candidate_id":"v4-b0282a5d21a52335","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"fetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계","quoted_reason":"GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다.","note":""} +{"candidate_id":"v4-b3568fcfe78e5aab","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a flag that disables it","quoted_reason":"would be switched on\nin CI within a month, and then the tool would be the thing it was designed not to\nbe.","note":""} +{"candidate_id":"v4-b9bba3d1416828fa","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A check like `if approved:`","quoted_reason":"puts the line between a UI and a violation on one branch, and that branch will\neventually be taken by mistake.","note":""} +{"candidate_id":"v4-badec4c4ee9efb2a","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"putting the older stub first","quoted_reason":"makes the newest section look\nlike an appendix to it.","note":""} +{"candidate_id":"v4-bef9b4e179c50fe8","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The gate first sampled the clean check once","quoted_reason":"which would clear a model failing 64% of the time on roughly a quarter of\nattempts — a gate that passes a broken model that often is decoration","note":""} +{"candidate_id":"v4-c08dac879bbde6a4","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"general\n file ordering was explicitly left unchanged","quoted_reason":"scoped out of that fix.","note":""} +{"candidate_id":"v4-c27e59f236ed7496","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"merely early within it","quoted_reason":"so a\n manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-c38d520fe83cb7d5","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A check like `if approved:`","quoted_reason":"puts the line between a UI and a violation on one branch, and that branch will\neventually be taken by mistake.","note":""} +{"candidate_id":"v4-c8e57b42ac2635de","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Recommendation.recommended is risk_verdict != HIGH","quoted_reason":"which makes zero\nsecurity coverage, zero score coverage, and unknown risk all read as a\npositive recommendation.","note":""} +{"candidate_id":"v4-c976dc2332d4adab","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A check like `if approved:`","quoted_reason":"puts the line between a UI and a violation on one branch, and that branch will\neventually be taken by mistake.","note":""} +{"candidate_id":"v4-cadfb63755c3f504","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a grader told a repository has 40k stars","quoted_reason":"has been told\nthe answer, and the point of grading is a judgement that does not already know it.","note":""} +{"candidate_id":"v4-d56e88f5ef1b62cb","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-d5b3514664089aef","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"F3 depends on this and not the other way round.","quoted_reason":"ADR-0002 requires the pipeline to complete on F2 alone when F3's smoke test\nfails","note":""} +{"candidate_id":"v4-d9887355b9eff3e9","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A search that\nhits the limit there comes back short and says nothing, and the caller writes a\nsmaller world into the database believing it is the whole one.","quoted_reason":"That is worse\nthan failing: a failure gets noticed.","note":""} +{"candidate_id":"v4-dc67b4d3b699b947","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"씨앗의\nfetch->evaluate->subscribe->star 체이닝에서 뒤 두 단계","quoted_reason":"GitHub Acceptable Use Policies 가 \"rank abuse, such\nas automated starring or following\" 을 명시 금지하고 조문에 수량 임계가 없다.","note":""} +{"candidate_id":"v4-df6bfd03300910e2","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"an instructions file alone is reported as uncategorized rather than as a product classification.","quoted_reason":"The built-in coding-agents pack requires AGENTS.md plus deterministic agent runtime source evidence","note":""} +{"candidate_id":"v4-e25462e19110c9eb","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-e5a87ee0d8e99a1e","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`if approved:`","quoted_reason":"`if approved:` can be deleted by a careless refactor; a required parameter cannot,\nand `Approval` is only constructed by a function that read a keystroke from a\nterminal. GitHub's AUP forbids automating stars and follows, so the line between a\nUI and a violation belongs in the type system, not in a branch.","note":""} +{"candidate_id":"v4-e82c306ec9e425b2","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"ADR-0001 chose `gradelore` on three grounds and two of them do not hold.","quoted_reason":"\"It matches CommitLore's pattern, so they form a family\" is a branding\nconvenience, not a claim about this product. In CommitLore the `lore` has a\nreferent — the accumulated decision knowledge attached to commits, which is the\nproduct. In `gradelore` the `lore` would be the scores, and 8/10 is a number,\nnot something handed down. The shape was borrowed without the meaning.","note":""} +{"candidate_id":"v4-ea459217291aa8a3","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"selects priority matches before the\n 20-file count cap is applied at all -- not merely early within it --","quoted_reason":"so a\n manifest's tree position cannot push it out of the scan.","note":""} +{"candidate_id":"v4-f4404e6e27e534e5","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a grader told a repository has 40k stars","quoted_reason":"has been told\nthe answer, and the point of grading is a judgement that does not already know it.","note":""} +{"candidate_id":"v4-f75d4b634c14b66c","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a grader told a repository has 40k stars","quoted_reason":"has been told\nthe answer, and the point of grading is a judgement that does not already know it.","note":""} +{"candidate_id":"v4-002ffd1e428c572a","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Restoring the literal list in the previous ticket was my error","quoted_reason":"I accepted a review\nfinding that the relaxed form \"lost detection\" without checking that a stronger guard\nalready covered it. Deleting both of a ticket's owned files is caught by the focused-lane\ncount guard, verified here by deleting them and observing \"focused lane metric-registry\nran 2 tests and not at least 13\". Pinning the path list only reintroduced a per-ticket\nedit that every remaining product ticket would have to make.","note":""} +{"candidate_id":"v4-00b9b5b83c4ddf87","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The alternative was to strike the period from six\ntickets","quoted_reason":"which trades a pattern too strict for its own corpus for six edits\nthat invite the same defect the next time someone writes a sentence.","note":""} +{"candidate_id":"v4-04c1de5e41d66868","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Putting them in the frozen document","quoted_reason":"the ticket grants\nfixtures/doctor/*.json and a ticket outranks a convention.","note":""} +{"candidate_id":"v4-09c4183e165a4da4","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"I had reverted it to a wildcard","quoted_reason":"a rogue product file plus a one-line\nownership edit passed the whole suite under the wildcard, where the literal census fails\nfour tests.","note":""} +{"candidate_id":"v4-0bc581744204a282","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"An earlier attempt closed that gap with an Ed25519 attestation and was reverted.","quoted_reason":"The\nSSOT has no signature, attestation or key-management clause anywhere, so it was invented\narchitecture in a contract-freezing ticket; worse, the canonical sessions were signed\nover their full content by a key whose private half was not kept, which would have made\nthem unamendable by any future ticket.","note":""} +{"candidate_id":"v4-0f8cd38c8ba43cfe","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a 90s ceiling","quoted_reason":"Collection cost scales with the\nnumber of merged Ticket-linked pull requests -- one authoritative fetch per search hit\n-- so ordinary backlog growth was going to reach 90s regardless","note":""} +{"candidate_id":"v4-12b0486cd77dd3a9","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The declared-verdict comparison","quoted_reason":"padding expected.failed_gates\nwith one unknown or duplicated entry disabled the only check comparing declared against\nderived issuability, so a document could declare a NOT_OBSERVED candidate issuable, which\nis precisely what this ticket exists to prevent.","note":""} +{"candidate_id":"v4-14a911a7f4c96afb","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The source-class inventory guard","quoted_reason":"It asserted only that the frozen sibling\nmatrix currently contains all three classes; it never called the inventory with a subset,\nso both filter mutations still returned all three and survived.","note":""} +{"candidate_id":"v4-163c7d58d0692423","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"transition_overhead is declared in specs/pack-simulation.v0.json and is\ndeliberately not added to the timing.","quoted_reason":"The preregistered assumptions carry no\noverhead term and the family distributions are the only declared source of\nminutes; inventing one would be fabricated timing, which the ticket forbids.","note":""} +{"candidate_id":"v4-1a5dea10137de7da","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Writing its\nintruder file into the live tree","quoted_reason":"raced with the fixture tests that copy this repository\nwhile it was present, failing three unrelated cases.","note":""} +{"candidate_id":"v4-1bc2a34840360fd0","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Its output is no longer pinned literally","quoted_reason":"because the ticket-owned list grows with every product ticket","note":""} +{"candidate_id":"v4-23ba99c6da04e46f","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"An earlier attempt closed that gap with an Ed25519 attestation and was reverted.","quoted_reason":"The\nSSOT has no signature, attestation or key-management clause anywhere, so it was invented\narchitecture in a contract-freezing ticket; worse, the canonical sessions were signed\nover their full content by a key whose private half was not kept, which would have made\nthem unamendable by any future ticket.","note":""} +{"candidate_id":"v4-261cdc76929d85cc","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The declared-verdict comparison","quoted_reason":"padding expected.failed_gates\nwith one unknown or duplicated entry disabled the only check comparing declared against\nderived issuability, so a document could declare a NOT_OBSERVED candidate issuable, which\nis precisely what this ticket exists to prevent.","note":""} +{"candidate_id":"v4-2cadeedf7d7f2251","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Restoring the literal list in the previous ticket was my error","quoted_reason":"Pinning the path list only reintroduced a per-ticket\nedit that every remaining product ticket would have to make.","note":""} +{"candidate_id":"v4-32281c33a0cd1d51","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"An earlier attempt closed that gap with an Ed25519 attestation and was reverted.","quoted_reason":"The SSOT has no signature, attestation or key-management clause anywhere, so it was invented\narchitecture in a contract-freezing ticket; worse, the canonical sessions were signed\nover their full content by a key whose private half was not kept, which would have made\nthem unamendable by any future ticket.","note":""} +{"candidate_id":"v4-34aef026d81c2f6b","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"filtering them later","quoted_reason":"so\na stale or hand-edited document cannot become authority over live repository\nstate.","note":""} +{"candidate_id":"v4-3a462c35336b7325","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"pinned literally","quoted_reason":"the ticket-owned list grows with every product ticket","note":""} +{"candidate_id":"v4-4b7ef509f0403505","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Writing its\nintruder file into the live tree","quoted_reason":"raced with the fixture tests that copy this repository\nwhile it was present, failing three unrelated cases.","note":""} +{"candidate_id":"v4-50c24e701b7ba2ef","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a 90s ceiling","quoted_reason":"Collection cost scales with the\nnumber of merged Ticket-linked pull requests -- one authoritative fetch per search hit\n-- so ordinary backlog growth was going to reach 90s regardless; the new calls only\narrived first.","note":""} +{"candidate_id":"v4-575de52ba54d6758","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"the collector's single-page search","quoted_reason":"hit its own page size and rejected\nthe whole collection with \"merged Ticket PR search possibly truncated at 30 items\".","note":""} +{"candidate_id":"v4-5eb2760a3fa148f3","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Parsing declared ownership\nlooked simpler","quoted_reason":"D0-004's own ownership paragraph turned out to name\nmaintainer-gate-registry.v1.json as a path that must NOT be restored, which a naive\nreading would have demanded exist.","note":""} +{"candidate_id":"v4-5f6e3fcc52a2df1d","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The start marker was matched by prefix","quoted_reason":"so a line reading `starter` was\naccepted as the marker and the authored prose beneath it was replaced.","note":""} +{"candidate_id":"v4-60e3f694ae5ca2d5","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"reading a declared\nresult","quoted_reason":"so a document cannot declare a score\nits own inputs do not produce.","note":""} +{"candidate_id":"v4-7362d21baaf5d618","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The required-core condition replaced the old derivable check rather than joining\nit","quoted_reason":"because a complete core implies both indices derive and the pair would have\nshipped an unkillable conjunct.","note":""} +{"candidate_id":"v4-8001a8835a9351e3","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Restoring the literal list in the previous ticket was my error","quoted_reason":"Pinning the path list only reintroduced a per-ticket\nedit that every remaining product ticket would have to make.","note":""} +{"candidate_id":"v4-82ae5492d09483d9","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Identifier order is never a tie-break","quoted_reason":"because that would be an arbitrary prescription under a deterministic name.","note":""} +{"candidate_id":"v4-841244a354bd70c7","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"joining it","quoted_reason":"because a complete core implies both indices derive and the pair would have\nshipped an unkillable conjunct.","note":""} +{"candidate_id":"v4-843485d931913281","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"kept as\nan unkillable guard","quoted_reason":"The required-observed filter was dead by construction","note":""} +{"candidate_id":"v4-88299d9c1503bc7b","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Parsing declared ownership","quoted_reason":"D0-004's own ownership paragraph turned out to name\nmaintainer-gate-registry.v1.json as a path that must NOT be restored, which a naive\nreading would have demanded exist.","note":""} +{"candidate_id":"v4-89d86d3677fb18ef","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a single pass","quoted_reason":"since a\nrace that reproduces intermittently is not disproved by one green run.","note":""} +{"candidate_id":"v4-8c7fdf80ae6c6f2e","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Identifier order is never a tie-break","quoted_reason":"because that would be an arbitrary prescription under a deterministic name.","note":""} +{"candidate_id":"v4-8f24735524874167","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Putting them in the frozen document","quoted_reason":"the ticket grants\nfixtures/doctor/*.json and a ticket outranks a convention.","note":""} +{"candidate_id":"v4-915f4e606299276c","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-975a69717305d00f","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-9b42b1951da730e1","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a0489f4a19bc3969","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"kept as\nan unkillable guard","quoted_reason":"The required-observed filter was dead by construction","note":""} +{"candidate_id":"v4-a2acb02e41d42051","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a3705f2f819df548","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-a3d2b14112b034a4","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"the collector's single-page search","quoted_reason":"hit its own page size","note":""} +{"candidate_id":"v4-ad1efe720ca11f3c","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"reading a second spec from disk","quoted_reason":"would make the function non-hermetic","note":""} +{"candidate_id":"v4-b525ee2c84544b9e","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"reading a second spec from disk","quoted_reason":"would make the function non-hermetic","note":""} +{"candidate_id":"v4-bed5fc386048e412","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"fix this in the resolver first","quoted_reason":"the implementation follows it, not the reverse","note":""} +{"candidate_id":"v4-c15e92a3b1a755d4","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"filtering them later","quoted_reason":"a stale or hand-edited document cannot become authority over live repository","note":""} +{"candidate_id":"v4-c20a082f262f21c8","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Putting them in the frozen document","quoted_reason":"a ticket outranks a convention","note":""} +{"candidate_id":"v4-c61d7c943edd8cff","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"I had reverted it to a wildcard","quoted_reason":"a rogue product file plus a one-line\nownership edit passed the whole suite under the wildcard","note":""} +{"candidate_id":"v4-cc76268ad4bb9a3e","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-ce2adee3c134ab03","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"I had reverted it to a wildcard","quoted_reason":"a rogue product file plus a one-line\nownership edit passed the whole suite under the wildcard","note":""} +{"candidate_id":"v4-d47951eaaa562775","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The catalog was accepted on faith.","quoted_reason":"A file holding `null` skipped validation","note":""} +{"candidate_id":"v4-d4b46b8cf85b5425","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`readCatalog` hardcoded its own path","quoted_reason":"the guarantee would have survived\nchanging the renderer to read the roadmap directly","note":""} +{"candidate_id":"v4-dd4a74ba2b628991","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"read from the vector","quoted_reason":"M10 regret and M20 distance are derived from the frozen route table and frontier","note":""} +{"candidate_id":"v4-e0d8d11b190e4e26","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The renderer read `parsed.issues` while the catalog declares `tickets`","quoted_reason":"so every\nprojection rendered empty.","note":""} +{"candidate_id":"v4-e238e7785a6466b5","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"read from the vector","quoted_reason":"M10 regret and M20 distance are derived from the frozen route table and frontier","note":""} +{"candidate_id":"v4-e2c33042f79e2776","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"believing the verdict the document declares","quoted_reason":"The declared-verdict comparison was bypassable: padding expected.failed_gates\nwith one unknown or duplicated entry disabled the only check comparing declared against\nderived issuability, so a document could declare a NOT_OBSERVED candidate issuable, which\nis precisely what this ticket exists to prevent.","note":""} +{"candidate_id":"v4-e3aa102492b031b1","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"reading a declared\nresult","quoted_reason":"so a document cannot declare a score\nits own inputs do not produce.","note":""} +{"candidate_id":"v4-e7587b2b65750306","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-ece19dc4cef7c803","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-f691593763c944c4","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"believing the verdict the document declares","quoted_reason":"a document claiming a coverage-only\ncandidate is issuable is rejected and names the exact gate it lied about.","note":""} +{"candidate_id":"v4-f83f6dbc19155e50","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-02764fbf10ceedc1","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A containment match would find this control through クリック","quoted_reason":"but\nwould equally let an unrelated label containing 再生 be taken for Play, which is the\nlocale collision the policy exists to prevent.","note":""} +{"candidate_id":"v4-0d2959b1d2bbcec0","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`project.new`'s open-document precondition counted\nraw AX windows","quoted_reason":"so that chooser WAS an open document and the operation refused","note":""} +{"candidate_id":"v4-0e840c8816f442f7","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`project.new`'s open-document precondition counted\nraw AX windows","quoted_reason":"so that chooser WAS an open document and the operation refused","note":""} +{"candidate_id":"v4-129a3640dab8b53d","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a coordFree\n parameter with a coordinate branch","quoted_reason":"a disabled entry must still be refused before actuation, and that is orthogonal\n to how the pick is performed.","note":""} +{"candidate_id":"v4-132048855f4d7a5d","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A shallow search and an ancestor-based filter","quoted_reason":"both still produced 0, so neither is the rule.","note":""} +{"candidate_id":"v4-218954b5ef6d08d7","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"flipping the default","quoted_reason":"if it is reachable then the flip missed the\npath that still fail-opens. It was the second.","note":""} +{"candidate_id":"v4-25eb689fdb9ad98b","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-2714c211175c4737","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"the graph","quoted_reason":"A graph assembled from this\nreader would be a list of display strings with no bus numbers and no send edges, which would look\nlike the ADR surface without being one.","note":""} +{"candidate_id":"v4-2756fbb39f4afc15","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Name alone would not have been enough.","quoted_reason":"On the probe project all twenty regions are named\n\"MIDI Region\", so any one of them could have certified any other.","note":""} +{"candidate_id":"v4-277e883c8a9d3eec","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a subrole allowlist","quoted_reason":"because measured on\nLogic 12.3 the Go To Position window is `AXFloatingWindow` with `AXModal == true` and no allowlist\ncould classify it.","note":""} +{"candidate_id":"v4-2853e493f4781414","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"It pressed Escape and then looked for the discard button","quoted_reason":"Escape\nCANCELS the save prompt, so the sequence defeated itself, Logic stayed running, and `open -a` on a\nrunning application does nothing, which left the old language in place.","note":""} +{"candidate_id":"v4-29c6beda0309a747","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"the graph","quoted_reason":"A graph assembled from this\nreader would be a list of display strings with no bus numbers and no send edges, which would look\nlike the ADR surface without being one.","note":""} +{"candidate_id":"v4-29c79faa31cc4fe2","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`isVisibleArrangeRegion`","quoted_reason":"an unreadable header would inflate a completeness claim, which is the direction that lets\nan absence be published as proof.","note":""} +{"candidate_id":"v4-2aee6afaad42b119","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a coordFree\n parameter with a coordinate branch","quoted_reason":"a disabled entry must still be refused before actuation, and that is orthogonal\n to how the pick is performed.","note":""} +{"candidate_id":"v4-304262d2dae79858","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"One artifact is one KNOWN PATH, computed at plan time, with `exists`, the collision policy and the\ncontainment check all resolved before anything runs.","quoted_reason":"A stem run breaks every one of those: N files\ninstead of one, names assigned by Logic (`_1.aif`) rather than by the plan, `.aif` rather\nthan the `.wav` the model assumes, and `would_overwrite` unevaluable for names that do not exist yet.","note":""} +{"candidate_id":"v4-30b8d25980ce48a3","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The header bounds test is deliberately NOT `isVisibleArrangeRegion`","quoted_reason":"which returns true when either\nframe is unreadable. Failing open is right when deciding whether to include a region it can see, and\nwrong here: an unreadable header would inflate a completeness claim, which is the direction that lets\nan absence be published as proof.","note":""} +{"candidate_id":"v4-5a1a7e7a347c6cc0","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A match on\n\"input\" alone","quoted_reason":"publishes a toggle as a signal source","note":""} +{"candidate_id":"v4-632dec3f10f1e65b","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"I wrote that message with a duration in it first — \"stayed disabled for 12s\" —","quoted_reason":"the code does not measure elapsed time, it counts iterations. The number came\nout wrong the moment a mutation changed the budget, which is how it was caught.","note":""} +{"candidate_id":"v4-67ab88f48731b3f1","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"An earlier draft of this commit said AXPress on the arrow actuates it.","quoted_reason":"That was wrong. Measured\nthrough System Events and through a direct in-process AXUIElementPerformAction alike, the press\nanswers .success and the value does not move; the same press on the Mute checkbox beside it also\nmoves nothing, so the control is not the caller. AXValue reports settable: false.","note":""} +{"candidate_id":"v4-710b1008c427461f","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"induce without corrupting the very tree it is\nmeasuring","quoted_reason":"inducing it would prove the fake rather than the guard.","note":""} +{"candidate_id":"v4-748bedfbbe5fe417","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Typing a destination path","quoted_reason":"dismisses the panel. Reproduced twice, nothing written.","note":""} +{"candidate_id":"v4-865d5bb5450bc905","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Scope is deliberately not represented as a filter.","quoted_reason":"It is not a checkbox, and the\nassessment already binds it through region identity, which compares two\nindependently obtained identities instead of trusting a boolean. Encoding it twice\nwould let the weaker signal stand in for the stronger one.","note":""} +{"candidate_id":"v4-8ea4400a37180162","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The one-line change to .github/workflows/release.yml","quoted_reason":"cannot merge through this\naccount: the token lacks the `workflow` scope, and GitHub refuses any merge that\ntouches a workflow file without it.","note":""} +{"candidate_id":"v4-8f7493456cee37a3","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"An earlier draft of this commit said AXPress on the arrow actuates it.","quoted_reason":"That was wrong. Measured\nthrough System Events and through a direct in-process AXUIElementPerformAction alike, the press\nanswers .success and the value does not move; the same press on the Mute checkbox beside it also\nmoves nothing, so the control is not the caller. AXValue reports settable: false.","note":""} +{"candidate_id":"v4-959435801c3ef505","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Typing a destination path","quoted_reason":"dismisses the panel. Reproduced twice, nothing written.","note":""} +{"candidate_id":"v4-97dfb7f923f08d18","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"swift build","quoted_reason":"The result compiled as a library and failed only when\nthe test target was built.","note":""} +{"candidate_id":"v4-a0550761c1997566","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"An earlier version walked the whole application","quoted_reason":"picked up the Piano\nRoll's own region item, and reported 23 regions on one call and 40 on the next. An index space that\nmoves between two calls is not a witness.","note":""} +{"candidate_id":"v4-a2ab2ce0394ace90","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Name alone would not have been enough.","quoted_reason":"On the probe project all twenty regions are named\n\"MIDI Region\", so any one of them could have certified any other.","note":""} +{"candidate_id":"v4-ae1693443c4f039f","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The \"before\" frame was taken before\n`goto_position`","quoted_reason":"so the playhead line travelling from bar 1 to bar 9 changes the band by itself —\nthe assertion would have claimed the region moved while measuring that the cursor did.","note":""} +{"candidate_id":"v4-aea1ebe08b663d1c","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`isProjectPickerWindow` matches the window title by CONTAINMENT.","quoted_reason":"A project the user names \"Choose a\nProject\" produces the arrange window \"Choose a Project - Tracks\", which contains the phrase — so on a\ntitle-only rule that window stops being counted, and `project.new` proceeds with a genuine document\nopen.","note":""} +{"candidate_id":"v4-b62d3f38467138a5","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"It picked\nthe entry with `name starts with \"Undo\" and name contains \"Track Stack\"`.","quoted_reason":"So does \"Undo Create Track\nStack\" — and clicking that DELETES the stack the run exists to read.","note":""} +{"candidate_id":"v4-cccd3e7fae599767","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A shallow search and an ancestor-based filter were both tried against the live panel","quoted_reason":"both still produced 0, so neither is the rule.","note":""} +{"candidate_id":"v4-d171f3ea2a7f7362","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"widening a removal past the issue that motivated it","quoted_reason":"is how a scoped fix becomes an unreviewed one.","note":""} +{"candidate_id":"v4-d7d1121164366d9c","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"It pressed Escape and then looked for the discard button","quoted_reason":"Escape\nCANCELS the save prompt, so the sequence defeated itself, Logic stayed running, and `open -a` on a\nrunning application does nothing, which left the old language in place.","note":""} +{"candidate_id":"v4-dd97491c4d227316","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"widening a removal past the issue that motivated it","quoted_reason":"is how a scoped fix becomes an unreviewed one.","note":""} +{"candidate_id":"v4-de1096e077fa22d6","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Two behaviours a stem run should inherit rather than reinvent","quoted_reason":"both already in that executor","note":""} +{"candidate_id":"v4-de409d80b116c6ee","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The landing rule is `numericNear`\nwithin one bar, not equality","quoted_reason":"State A does not promise an exact match, and pinning one would\ndescribe a contract the handler never made.","note":""} +{"candidate_id":"v4-eef995b442c7a008","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"#577 made the empty-region branch State B unconditionally.","quoted_reason":"A readback\nthat covered the WHOLE arrangement and still found no imported region is evidence that none was\ncreated — so that case is State C `readback_mismatch` again","note":""} +{"candidate_id":"v4-f05b91620a25eee7","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The landing rule is `numericNear`\nwithin one bar, not equality","quoted_reason":"State A does not promise an exact match, and pinning one would\ndescribe a contract the handler never made.","note":""} +{"candidate_id":"v4-f0ea9a2a5b68115b","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A standalone stem drive","quoted_reason":"The public export surface is two operations — project.export_plan and project.export_run — and\nnothing else. A standalone stem drive has no third place to land.","note":""} +{"candidate_id":"v4-f149c003cc5dae5d","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"the error code","quoted_reason":"since a live command and a retired one both answer\ninvalid_params.","note":""} +{"candidate_id":"v4-f51f8964286329bb","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The first version of this harness tried to\nprobe them","quoted_reason":"`mixer.set_send` and `automation.set_mode` cannot be probed live at all, and the run says so instead\nof dressing a probe of something else as evidence: both are implemented and registered for no tool","note":""} +{"candidate_id":"v4-fd7263067698db44","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a subrole allowlist","quoted_reason":"because measured on\nLogic 12.3 the Go To Position window is `AXFloatingWindow` with `AXModal == true` and no allowlist\ncould classify it.","note":""} +{"candidate_id":"v4-0d7c38f6a60e8b36","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"in a table\nelsewhere","quoted_reason":"Prose kept apart from code drifts: this\nrepository's README spent a day calling a closed issue an open blocker.","note":""} +{"candidate_id":"v4-0ef57b3438b7d16b","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The CEO and grok were asked\nindependently on #628 and both rejected raising","quoted_reason":"a CEO turn is an unbounded\ntool loop so no value fits it","note":""} +{"candidate_id":"v4-0ef8cafdf0d11499","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-120b48f40e73f330","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"when it\nwas shown the author's account first","quoted_reason":"Blind review — the reviewer sees the diff and the original issue only, never the\nauthor's report or prior verdicts — found BLOCKERs in code that the same reviewer had passed","note":""} +{"candidate_id":"v4-1a18ceae8a4645cf","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"writing a row for it\nhere","quoted_reason":"would assert a state this migration cannot observe.","note":""} +{"candidate_id":"v4-23f26b69f816664d","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"removing the line","quoted_reason":"would hide that the mechanism was licensed by this\ndocument rather than adopted against it.","note":""} +{"candidate_id":"v4-3ba6d8b1fa31e10f","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"the summary was written from this invocation's in-memory results","quoted_reason":"A partial\nre-run knows only about the areas it just ran, so it rewrote the whole file and recorded\nevery untouched area as errored","note":""} +{"candidate_id":"v4-4001fa0211128649","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"`advisoryState` derived `EXHAUSTED` from `lowest === null`","quoted_reason":"The buckets array is empty because nothing was read. grok itself was\nworking the whole time — its billing token expires every six hours, and\nusing the CLI is what renews it. No reset was ever going to arrive.","note":""} +{"candidate_id":"v4-431dceed9013cb2b","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"fixing only the\nfirst","quoted_reason":"left the gate still closing.","note":""} +{"candidate_id":"v4-45caf6be5b46889d","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"in a table\nelsewhere","quoted_reason":"Prose kept apart from code drifts: this\nrepository's README spent a day calling a closed issue an open blocker.","note":""} +{"candidate_id":"v4-50d2354c5c9210d1","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"local test counts","quoted_reason":"because CI is the only\nsignal this repository trusts.","note":""} +{"candidate_id":"v4-56a540b834736c43","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"the CLI payload was cast","quoted_reason":"a row that matched by name while\nomitting channel_id produced an undefined address that available() called usable.","note":""} +{"candidate_id":"v4-5b3c19da588ec1d0","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The first version\nproved only that the proxy answered: it checked an allowlisted host returned 200, a *.invalid name\nreturned 403, and a direct socket was EPERM.","quoted_reason":"A .invalid name is refused by any resolver, so an open\nproxy that allowed every real host passed all three and the run stored a PASS carrying an isolation\nclaim nobody had measured.","note":""} +{"candidate_id":"v4-6ace14eeff8e0235","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Making a\ndisposable tree claimable would have made \"two runs, same tree\" a claim conflict rather than\nsomething the guard infers","quoted_reason":"but it also widens what a claim means for every other caller, and the\nguard can already answer that question from the two facts it now has.","note":""} +{"candidate_id":"v4-6fa12e79e96b6cc1","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-77018bc628e62482","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-83c6c0a5f5542b97","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The boundary file's own P1-14 cases are\ndeleted rather than ported","quoted_reason":"they constructed `GhCliClient`, the gh-subprocess client the App\ncredential store replaced, and a test that builds a class nobody ships proves nothing.","note":""} +{"candidate_id":"v4-8826ee094751e0ef","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Passing it as `pnpm test -- --reporter=…`","quoted_reason":"forwarded `--` to vitest, which then has to decide whether what follows is a flag or a test\nfilter — an ambiguity worth removing from a command whose output is the release evidence.","note":""} +{"candidate_id":"v4-8dbd6ece65df6bf7","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"running the whole suite a second time","quoted_reason":"That\ndoubled a suite which starts real sandboxed children under RLIMIT_NPROC and memory caps, and\non the runner the second run produced no output file while the first passed","note":""} +{"candidate_id":"v4-a0bf288e0dd97d24","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"\"a new message on this chat is held rather than run\"","quoted_reason":"the gate that\nwould hold it does not exist yet. That sentence states a false fact about\nthe system","note":""} +{"candidate_id":"v4-a6950ee840587dbc","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a word ban","quoted_reason":"would have produced\nthousands of hits and been switched off inside a week","note":""} +{"candidate_id":"v4-ac85b82316ac5980","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A second turn is refused rather than queued.","quoted_reason":"A queue would hold the caller\nfor the length of a turn, which is the stall the port is being taken out of\nthe poll loop to remove; and the ordering a queue imposes belongs to #631,\nwhere the update is durable.","note":""} +{"candidate_id":"v4-b4647e5b48ad0f67","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a refusal for an observation older than the newest stored reading","quoted_reason":"It rejected the input docs/capacity-source.md instructs the operator to send — the\nprovider-reported observedAt, necessarily in the past, against collectors that stamp an\nERROR every four minutes — and rejected it with the reason code #424 was filed under. New\ncode that refuses the documented path is the thing that is wrong.","note":""} +{"candidate_id":"v4-b48724ec04025b41","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a word ban","quoted_reason":"would have produced\nthousands of hits and been switched off inside a week","note":""} +{"candidate_id":"v4-bd395d87b2865263","reviewer":"reviewer-2","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-c25228afc16748b3","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"rebuilding the lanes with `git diff HEAD`","quoted_reason":"silently dropped every untracked file, which produced a confident and wrong conclusion that\na cited test file had never existed","note":""} +{"candidate_id":"v4-c8feb84e83c19266","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"requiring it earlier","quoted_reason":"blocks every merge that is not a completed ACP run, including the merge\nthat would fix whatever stopped the daemon publishing","note":""} +{"candidate_id":"v4-cb7c81aa3e7a1d8c","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A reason code would not do","quoted_reason":"it is a label the caller attaches, and adding a refusal that reused an\nexisting code would move it to the wrong side of the boundary silently","note":""} +{"candidate_id":"v4-cf7752a9fa65978e","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a refusal for an observation older than the newest stored reading","quoted_reason":"It rejected the input docs/capacity-source.md instructs the operator to send — the\nprovider-reported observedAt, necessarily in the past, against collectors that stamp an\nERROR every four minutes — and rejected it with the reason code #424 was filed under. New\ncode that refuses the documented path is the thing that is wrong.","note":""} +{"candidate_id":"v4-d3094729cb02a074","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Recording them\nseparately","quoted_reason":"would leave a window where a crash produces a row that is claimed\nbut says nothing about what it claimed — a fourth state, and one nothing can\nresolve, added to the three this file already distinguishes","note":""} +{"candidate_id":"v4-d3c77723a8e09894","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"a stored conversation id","quoted_reason":"A second column would be a second definition, free to\ndisagree with the first.","note":""} +{"candidate_id":"v4-d61d9c73e11754bc","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A second turn is refused rather than queued.","quoted_reason":"A queue would hold the caller\nfor the length of a turn, which is the stall the port is being taken out of\nthe poll loop to remove; and the ordering a queue imposes belongs to #631,\nwhere the update is durable.","note":""} +{"candidate_id":"v4-db58634970ebbdf7","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"A first draft compared against `result_json IS NULL`","quoted_reason":"`TelegramIngress.admit` writes `phase: \"ADMITTED\"` immediately, so\nthe column is never null on that path.","note":""} +{"candidate_id":"v4-ded1bcf6f444c76d","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"Reverted before landing: a refusal for an observation older than the newest stored reading.","quoted_reason":"It rejected the input docs/capacity-source.md instructs the operator to send — the\nprovider-reported observedAt, necessarily in the past, against collectors that stamp an\nERROR every four minutes — and rejected it with the reason code #424 was filed under. New\ncode that refuses the documented path is the thing that is wrong.","note":""} +{"candidate_id":"v4-e5b4843efae58483","reviewer":"reviewer-2","states_rejected_alternative":true,"quoted_alternative":"The dying-proxy\ntest slept a fixed 150ms and then asserted the death had been observed;","quoted_reason":"on a loaded runner\nthat window closes early, the assertion throws, and because it throws before `finalise` the\nlease's proxy is never released.","note":""} +{"candidate_id":"v4-3258ac6e08349a04","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"read through their CommitLore\ntrailers rather than their subject lines, and cross-checked against the real\nGitHub issue tracker (gh issue view/timeline)","quoted_reason":"so every entry cites the issue\nits closing PR actually closed, not the issue a commit's own branch name\nsuggested.","note":""} +{"candidate_id":"v4-4042654555ac20e4","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"the radar table sorts on the deterministic\nmetadata score while the approval queue sorts on Reviewed.score\n(grade.idea + grade.skill) -- two independent orderings from the same run","quoted_reason":"with nothing enforcing agreement between them.","note":""} +{"candidate_id":"v4-8fc3d2ec14b1c078","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"Sleeping for up to an hour inside a library call","quoted_reason":"is\nthe caller's decision","note":""} +{"candidate_id":"v4-badec4c4ee9efb2a","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"the brief that requested the file\nlisted them in that order, and the writer followed the brief rather than the\nconvention.","quoted_reason":"A reader opening a changelog expects the release they are about to\ninstall at the top; putting the older stub first makes the newest section look\nlike an appendix to it.","note":""} +{"candidate_id":"v4-d5b3514664089aef","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"the typosquatting dependency list — named in the ticket, not built","quoted_reason":"because its source and refresh cadence are undecided","note":""} +{"candidate_id":"v4-0f8cd38c8ba43cfe","reviewer":"reviewer-3","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-50c24e701b7ba2ef","reviewer":"reviewer-3","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-575de52ba54d6758","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"never requesting the next page","quoted_reason":"Every ticket in the backlog resolved to blocked, and online-strict reported\nreadySet=none with no head.","note":""} +{"candidate_id":"v4-60e3f694ae5ca2d5","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"rather than reading a declared\nresult","quoted_reason":"so a document cannot declare a score\nits own inputs do not produce.","note":""} +{"candidate_id":"v4-89d86d3677fb18ef","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"The legacy-identifier probe wrote that file into the live repository root and\ndeleted it again","quoted_reason":"while sibling tests copy that same root; a\ncopy that enumerated the file before the delete and read it after fails.","note":""} +{"candidate_id":"v4-d47951eaaa562775","reviewer":"reviewer-3","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-d4b46b8cf85b5425","reviewer":"reviewer-3","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-dd4a74ba2b628991","reviewer":"reviewer-3","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-e238e7785a6466b5","reviewer":"reviewer-3","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-e3aa102492b031b1","reviewer":"reviewer-3","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-e7587b2b65750306","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"Encoding the contract correctly","quoted_reason":"The frozen artifact also contradicted itself: 15 metrics declared the grader output their contract row names, while their vectors carried an invented {key,total} shape, and the validator enforced the invented side.","note":""} +{"candidate_id":"v4-f83f6dbc19155e50","reviewer":"reviewer-3","states_rejected_alternative":true,"quoted_alternative":"Encoding the contract correctly","quoted_reason":"The frozen artifact also contradicted itself: 15 metrics declared the grader output their contract row names, while their vectors carried an invented {key,total} shape, and the validator enforced the invented side.","note":""} +{"candidate_id":"v4-25eb689fdb9ad98b","reviewer":"reviewer-3","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} +{"candidate_id":"v4-f149c003cc5dae5d","reviewer":"reviewer-3","states_rejected_alternative":false,"quoted_alternative":"","quoted_reason":"","note":""} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/review-stage-b.jsonl b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/review-stage-b.jsonl new file mode 100644 index 00000000..d7559171 --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/review-stage-b.jsonl @@ -0,0 +1,487 @@ +{"candidate_id":"v4-00efc0041ed3118a","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Capping the reset accessor can preserve retry behavior while falsely reporting the server's stated reset, and a cap inside that named accessor is statically checkable."} +{"candidate_id":"v4-03dd551058ce7aaf","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Mocking TTY state can make the approval cycle pass while bypassing its shipped terminal behavior, and such mocks or fake streams are concrete test constructs."} +{"candidate_id":"v4-0f4dfe2618796b54","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Whether a known bug should be fixed in a documentation-only commit is scope and review-evidence judgment that final file state cannot attribute to a particular change."} +{"candidate_id":"v4-122f5e996ed8f300","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Updating a prior run can produce a correct current view but violates immutable correction lineage, with UPDATE or DELETE of run rows providing a checkable trace."} +{"candidate_id":"v4-1f1cba75144b609f","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"A low-volume automation limit can still function while retaining the external policy violation, but evasion intent is not determinable from a final code state alone."} +{"candidate_id":"v4-2115a033e1fb37d0","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The absent .json extension makes the precise scan gap evident in code, while the README can be mechanically checked for the rejected hedge versus the stated limitation."} +{"candidate_id":"v4-2493fd41b194d8f4","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The quoted marker causes measured field bleed in the target model rather than merely a policy violation, and its literal appearance in the prompt is directly checkable."} +{"candidate_id":"v4-2616d7ae1c85fea4","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Alternative search rankings work technically but add unsupported collection policy, and their sort parameters or multi-query structure are concrete final-state traces."} +{"candidate_id":"v4-2c70b58d7ce1117a","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A single probe can pass while leaving a probabilistic model failure undetected, and a one-iteration sample count is statically identifiable."} +{"candidate_id":"v4-30517866b1626071","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Silencing a failed observation append leaves the approved action functional but hides an audit gap, and the exception handler's warning or silent discard is checkable."} +{"candidate_id":"v4-31ea939e4478ded3","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Bundling implementation with a documentation correction can work but violates the separately reviewed issue scope, which final files alone cannot establish."} +{"candidate_id":"v4-3258ac6e08349a04","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Synchronizing a source __version__ would be functionally viable but exceeds the stated changelog-only scope, and that source-version change is a concrete trace."} +{"candidate_id":"v4-377f04276465b59d","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Coverage gates or a badge can be statically detected yet do not establish the stated truthfulness and audience judgment."} +{"candidate_id":"v4-4042654555ac20e4","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Using idea plus skill for the approval queue is a checkable ranking-source choice, while its lack of validation and ADR authority is not apparent from code."} +{"candidate_id":"v4-468e579f86e22f91","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"An injected 403 fixture can pass ordinary tests, but final files cannot prove that a closure relied on a live GitHub response with quota remaining."} +{"candidate_id":"v4-4d2c072dffcb56ba","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Reusing the seed could function while violating licensing and architecture judgment, neither of which can be established from the resulting files alone."} +{"candidate_id":"v4-545d1c9c0d2b969e","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A three-state enum would function but conflates distinct reviewer actions, and the presence of a separate INSUFFICIENT_EVIDENCE status is directly checkable."} +{"candidate_id":"v4-572e09dba076a5a3","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Unsupported quality, growth, or undervaluation claims would not break functionality, but judging equivalent evidentiary overclaiming is semantic rather than mechanical."} +{"candidate_id":"v4-5f0d8829fcc6f198","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Keeping stale handoff items with notes leaves usable documentation, but whether they obscure the next action depends on human reading context rather than a fixed trace."} +{"candidate_id":"v4-63e1ec17f2bdadfe","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The conflict is the directly observable Git behavior of --no-ff producing a merge commit instead of the required squash, and the flag is mechanically detectable."} +{"candidate_id":"v4-66695090e5949ea6","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A non-interactive execution path could pass functional tests while enabling prohibited CI writes, and its flag and dry-run guard are concrete code traces."} +{"candidate_id":"v4-6a3b0b51071ec292","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The artifact data model makes clear that stored port responses cannot reconstruct absent prior pipeline code, while an embedded-code field would be statically observable."} +{"candidate_id":"v4-6aed03472a14ffc6","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Fixing the known collection gaps could work and pass tests, but it violates the documented evidence-and-scope separation and would add checkable handling of the named response fields."} +{"candidate_id":"v4-6d2eec862ac0f22c","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Fixing the screening gaps could work and pass tests, but it violates the documented evidence-and-scope separation and would leave concrete selector or cap-handling changes."} +{"candidate_id":"v4-7078a162153bab38","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"HTTP header normalization and lower-case-header tests make a case-sensitive lookup a directly testable defect."} +{"candidate_id":"v4-77e1745655a235ce","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The producer-derived set exposes the single-source-of-truth rationale, while a literal allowlist can work until producers change."} +{"candidate_id":"v4-79e5fcfd3fd49649","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"PyPI ownership is external availability context, but adopting the exact alternative name leaves a checkable project-name trace."} +{"candidate_id":"v4-7b84423ed8fa9f34","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Whether a retrospective ticket falsely presents itself as a contemporaneous plan is historical intent rather than a mechanically decidable file property."} +{"candidate_id":"v4-7c0b5ea14295d54c","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Per-action star and follow outcomes make the granularity rationale evident, though one conservative session-wide value can still run functionally."} +{"candidate_id":"v4-7c3c09fcebd01801","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Computed completeness claims visibly derive from their counts, while supplied booleans can initially agree and only later drift."} +{"candidate_id":"v4-7f42c3f1f7876679","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The cited signal and severity model makes the lossiness of a boolean apparent, but a boolean screen can still produce functional pass/fail output."} +{"candidate_id":"v4-81773950b2e67c02","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The code cannot itself show why no additional missing-evidence distinction is currently needed, while enum cardinality is directly checkable."} +{"candidate_id":"v4-81aa6660ab83f1dc","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The prior maintenance failure is repository history, and whether one handoff substantively covers two repositories requires human judgment."} +{"candidate_id":"v4-849425816b8050cc","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The repeated-listing storage cost is apparent from the data shape, while duplicated full snapshots leave a countable trailer trace."} +{"candidate_id":"v4-8ab61d73c22d675b","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The downstream inability to distinguish fabricated from model-produced grades is not visible locally, but a fallback branch or literal is checkable."} +{"candidate_id":"v4-8e59d287bd2f9248","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Priority selection before the file cap makes the starvation risk apparent, and broad extension matching still fails that functional guarantee."} +{"candidate_id":"v4-8fc3d2ec14b1c078","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The current rate-limit classifier explicitly explains header-based 403 separation, and a bare-status retry misclassifies a permission failure that functional tests catch."} +{"candidate_id":"v4-9387c3b68473bda9","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"ADR-0004 records both the rationale and the rejected name, while keeping a product name is functionally harmless but a prose-branding choice lacks a robust revival oracle."} +{"candidate_id":"v4-9c974f0a8436c03e","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Continuing with a flagged partial result rather than rejecting it is a hidden product-scope choice, and an incomplete-search fixture can deterministically distinguish an early refusal from propagation."} +{"candidate_id":"v4-9cc0a659cfa12205","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A boolean plus separate coverage value can implement the visible behavior but undermines the single status contract, and those fields provide a checkable structural trace."} +{"candidate_id":"v4-9f9eb817a08ae4c9","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The lack of a GitHub rollback-capable transaction is not established by the local code, and a transaction cannot satisfy failure-path honesty even though its wrapper or call is checkable."} +{"candidate_id":"v4-a2ad4b77ea6a9a3b","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"ADR-0012 directly explains why stars are not an expected-attention baseline, while a division by current stars is a functionally executable and statically detectable formula."} +{"candidate_id":"v4-a2dbaee9c683ea83","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"ADR-0004 explicitly says repotriage was the proposal but the owner chose gitseed, so the remaining disagreement is a non-oracleable naming-authority judgment."} +{"candidate_id":"v4-a5b9e9e48752467e","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The historical mutability and rebuild-cost rationale is not exposed by the present artifact boundary, while a tuple-typed CollectResult candidate collection is a concrete and functionally workable trace."} +{"candidate_id":"v4-a7b04c5208e493e4","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The scoring module identifies its three M0-measured weights as non-invented values, while extra feature registrations or weights would be functionally runnable and mechanically detectable."} +{"candidate_id":"v4-a9ec5cd512c7c2c7","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ranked() docstring states that omitted ungraded entries conceal a broken grader, while a filtered table can still function and is deterministically observable from fixture output."} +{"candidate_id":"v4-a9edac0b4d0f80a8","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The decision to defer RecommendationStatus is an issue-scope and dependency boundary absent from SourceCoverage, but adding its enum leaves a direct structural trace and can pass functional behavior."} +{"candidate_id":"v4-ada5ec890a36e5b2","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The README itself states that phase-gate.py is absent from the checkout and history, while an unsupported documentation claim is functionally inert and needs semantic prose judgment to detect."} +{"candidate_id":"v4-aec71c78e9675ad3","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"ADR-0011 itself states the backtest gate and implicit-claim risk, while recognizing an implicit product claim requires semantic judgment rather than a fixed trace."} +{"candidate_id":"v4-b0282a5d21a52335","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The retained ADR and Phase 1 evidence explicitly identify automated stars and follows as AUP-prohibited, and unattended writes have observable call-path behavior."} +{"candidate_id":"v4-b3568fcfe78e5aab","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A validator test can be skipped with a successful test run, whereas a skip condition and its reported reason are concrete, checkable behavior."} +{"candidate_id":"v4-b9bba3d1416828fa","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The F4 ticket explains the Approval-as-argument boundary; an approved bool preserves happy paths but is directly visible in the write-function signature."} +{"candidate_id":"v4-badec4c4ee9efb2a","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Newest-first changelog order is apparent from the release headings, and version heading order can be checked mechanically even though reversed order still renders."} +{"candidate_id":"v4-bef9b4e179c50fe8","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Phase evidence and smoke code explicitly distinguish installation from contract capability; omitting the smoke gate would still allow valid-looking but unreliable grading."} +{"candidate_id":"v4-c08dac879bbde6a4","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A section-level as-of date or commit is a checkable heading trace, but the current README does not state the staleness rationale for avoiding one."} +{"candidate_id":"v4-c27e59f236ed7496","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Regular-file tree order remains explicit in source, but the reason not to add a general risk heuristic is a scoped judgment that a selection-order fixture can still detect."} +{"candidate_id":"v4-c38d520fe83cb7d5","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The undo docstring explicitly records the intentional approval asymmetry; requiring an approval would be a concrete signature or prompt-path change that still performs undo."} +{"candidate_id":"v4-c8e57b42ac2635de","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"ADR-0010 explicitly explains that four statuses distinguish absent evidence, while a renamed boolean remains a mechanically identifiable but inadequate implementation."} +{"candidate_id":"v4-c976dc2332d4adab","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"collect_approval documents its non-TTY refusal as the automation boundary; a non-interactive CI flag would be explicit and would otherwise work."} +{"candidate_id":"v4-cadfb63755c3f504","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"run records grader exceptions per candidate and pipeline tests preserve prior survivors, so ending the run is an ordinary functional defect with a checkable result trace."} +{"candidate_id":"v4-d56e88f5ef1b62cb","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"A full rewrite could leave an equally current handoff, but the final prose cannot reveal whether the proven structure was needlessly replaced."} +{"candidate_id":"v4-d5b3514664089aef","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The clean fixtures and threshold rules make the short-token false positives visible, and a changed threshold is directly testable."} +{"candidate_id":"v4-d9887355b9eff3e9","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Returning an empty result recreates observable truncation behavior that rate-limit tests can deterministically distinguish from an incomplete partial result."} +{"candidate_id":"v4-dc67b4d3b699b947","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Full cloning would still collect repository data but violates an externally motivated resource and safety constraint, with a clone invocation providing a checkable trace."} +{"candidate_id":"v4-df6bfd03300910e2","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A digest can support change detection but cannot reconstruct a historical pack, and embedded definitions versus a digest-only artifact is schema-checkable."} +{"candidate_id":"v4-e25462e19110c9eb","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The distinction depends on GitHub's header semantics, while a status-only 403 branch is an observable incorrect classification that tests can catch."} +{"candidate_id":"v4-e5a87ee0d8e99a1e","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Unsourced benchmark or adoption prose can read normally but its evidentiary provenance cannot be decided from the final README alone."} +{"candidate_id":"v4-e82c306ec9e425b2","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The misleading trust promise is a product-positioning judgment, but reintroducing the literal repotrust name leaves a deterministic text trace."} +{"candidate_id":"v4-ea459217291aa8a3","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The priority-before-cap selection and coverage tests expose the padding failure, and applying the count cap to priority files is directly testable."} +{"candidate_id":"v4-f4404e6e27e534e5","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A filtered ranking can appear to work while concealing pipeline failures, and retained versus dropped blocked or ungraded entries is behaviorally checkable."} +{"candidate_id":"v4-f75d4b634c14b66c","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A numeric sentinel can satisfy the current range and tests yet silently collide after a range change, while its numeric representation is checkable."} +{"candidate_id":"v4-002ffd1e428c572a","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The focused-lane guard makes the redundant deletion protection visible, while a literal owned-path list would still work and has a concrete schema trace."} +{"candidate_id":"v4-00b9b5b83c4ddf87","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Deleting the six periods would make the present corpus pass while preserving a parser that rejects future ordinary punctuation, and parser support for terminal punctuation is statically checkable."} +{"candidate_id":"v4-04c1de5e41d66868","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The current v0 domain makes the sort tiebreaker unreachable, a historical mutation-coverage constraint not apparent from a routine sort edit, while the extra comparator key is directly detectable."} +{"candidate_id":"v4-09c4183e165a4da4","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Whether capture prose has reliable classification keywords is not encoded in the frozen table, but a keyword-based derivation versus literal source-class data is mechanically distinguishable."} +{"candidate_id":"v4-0bc581744204a282","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Key custody, rotation, and fixture amendability are architectural context absent from trace validation code, while signature verification necessarily introduces a checkable cryptographic dependency or call."} +{"candidate_id":"v4-0f8cd38c8ba43cfe","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Removing the per-completion commit lookup eliminates the evidence required by the completion-effect check, an observable validation defect whose missing fetch is concrete."} +{"candidate_id":"v4-12b0486cd77dd3a9","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The need to keep factor-opportunity and scored-observation gates independently testable is contract context, and deriving one from the other is a concrete data-flow change that loses valid gate distinctions."} +{"candidate_id":"v4-14a911a7f4c96afb","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Keeping a redundant test beside an effective direct case would pass behavior tests, but whether the older assertion is misleading rather than worthwhile is a human test-quality judgment."} +{"candidate_id":"v4-163c7d58d0692423","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The planning tests directly require the census to move from 37 to 40, so retaining 37 is a checkable failing literal rather than a viable alternative."} +{"candidate_id":"v4-1a5dea10137de7da","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The Node 20 TypeScript-test discovery gap depends on runtime behavior not visible in the workflow alone, yet keeping 20 can report a green but vacuous suite and is explicit in the CI matrix."} +{"candidate_id":"v4-1bc2a34840360fd0","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Trusting a shape-valid declared issuance result plainly permits it to contradict the evidence-derived coverage gate, and the declared-versus-derived data flow is mechanically inspectable."} +{"candidate_id":"v4-23ba99c6da04e46f","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The order-insensitive event contract makes an array-order shape failure directly contrary to normal valid inputs, and an EVENT_ORDER_BROKEN check is a concrete trace."} +{"candidate_id":"v4-261cdc76929d85cc","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A wildcard census can remain green after owned-file deletion whereas a literal census cannot, and wildcard versus literal assertion logic is statically checkable."} +{"candidate_id":"v4-2cadeedf7d7f2251","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The conditional M18/M20 requirement and its issuance effect are concrete behavior that a test can expose."} +{"candidate_id":"v4-32281c33a0cd1d51","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A wrapper actor label is a concrete but forgeable field, so treating it as attestation can work mechanically while overstating evidence."} +{"candidate_id":"v4-34aef026d81c2f6b","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A broad scan with projection exclusions works today but leaves a checkable exclusion-list pattern that fails to protect future projections."} +{"candidate_id":"v4-3a462c35336b7325","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Including INVALID observations changes the eligibility calculation in a directly testable way even though the fairness rationale is not implicit in code."} +{"candidate_id":"v4-4b7ef509f0403505","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A compile-before-test path can run successfully on Node 20 but leaves concrete build and dependency artifacts contrary to the minimal workspace constraint."} +{"candidate_id":"v4-50c24e701b7ba2ef","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A near-current timeout works at the present receipt count but a small timeout constant is a concrete trace of the growth-sensitive alternative."} +{"candidate_id":"v4-575de52ba54d6758","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A single 100-item request works below the cap, while missing pagination is a directly checkable request-flow trace."} +{"candidate_id":"v4-5eb2760a3fa148f3","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Parsing declared ownership can demand known-forbidden paths, and the choice between prose parsing and Git-derived paths is mechanically observable."} +{"candidate_id":"v4-5f6e3fcc52a2df1d","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Treating absent or duplicate contracts as drift produces a concrete successful-render path where the contract-derived renderer must reject."} +{"candidate_id":"v4-60e3f694ae5ca2d5","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Replacing NOT_OBSERVED with zero visibly changes the scoring denominator and score, so ordinary outcome tests catch it."} +{"candidate_id":"v4-7362d21baaf5d618","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Adding the derivable conjunct preserves behavior but leaves a concrete redundant guard despite the required core already implying it."} +{"candidate_id":"v4-8001a8835a9351e3","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Defaulting an unproven cell to declared status is a concrete fallback that directly violates the observable UNAVAILABLE result."} +{"candidate_id":"v4-82ae5492d09483d9","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The census literals and the failing test make leaving them at 33 an explicit, mechanically detectable test failure."} +{"candidate_id":"v4-841244a354bd70c7","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Extra output pins would pass because they are derivable, but their mutation-equivalence rationale is not apparent from ordinary code reading and their assertions are inspectable."} +{"candidate_id":"v4-843485d931913281","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A dead required-observed filter would preserve behavior and pass tests, while its reintroduction is a concrete source-level filtering operation."} +{"candidate_id":"v4-88299d9c1503bc7b","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Commit-message matching would miss an effect removed by an ordinary deletion, a functional case the resolver must handle, and such matching is directly detectable."} +{"candidate_id":"v4-89d86d3677fb18ef","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Excluding the transient name from the current cpSync calls could hide the observed race while retaining the unsafe live-tree write, and the exclusions are concrete calls."} +{"candidate_id":"v4-8c7fdf80ae6c6f2e","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Adding the package test script would make the command work but violates an external Exact-ownership boundary and leaves a checkable manifest entry."} +{"candidate_id":"v4-8f24735524874167","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Embedding the reports would have passed existing gates but conflicts with the ticket-owned fixture path, and the report location is directly checkable."} +{"candidate_id":"v4-915f4e606299276c","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The final artifacts make M19's presentation-and-safety role versus M20's scoring role explicit, while homogenizing those memberships could still leave ordinary behavior passing and changes concrete fields."} +{"candidate_id":"v4-975a69717305d00f","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"A normal-vector clamp test can pass without reaching the clamp because valid vectors never leave the interval, but whether it meaningfully asserts that unreachable behavior is intent-dependent."} +{"candidate_id":"v4-9b42b1951da730e1","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Allowlisting the two paths would admit working code but conceal product surface as control-plane code, with the forbidden entries mechanically inspectable."} +{"candidate_id":"v4-a0489f4a19bc3969","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A refusal returning derived zero is visibly indistinguishable from success to a caller and is a concrete exit-code branch that functional tests can catch."} +{"candidate_id":"v4-a2acb02e41d42051","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Disregarding a recorded block can leave implementation behavior working but defeats governance and auditability, while the private instruction itself has no final-state code trace."} +{"candidate_id":"v4-a3705f2f819df548","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The literal census pin is directly testable, and leaving it stale makes the declared verification fail."} +{"candidate_id":"v4-a3d2b14112b034a4","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Accepting only the first search page plainly drops later receipts, and the missing pagination or exact-total check is statically observable."} +{"candidate_id":"v4-ad1efe720ca11f3c","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"An empirical seeded p50 is plausible output but the exact-symmetry versus sampling-noise rationale is non-obvious, while the median computation route is checkable."} +{"candidate_id":"v4-b525ee2c84544b9e","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Adding the package test script would make the focused command work, but exact file ownership is external judgment and the script entry is concrete."} +{"candidate_id":"v4-bed5fc386048e412","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Removing the currently absent offline check can pass present-state behavior but violates a future sequencing requirement, with the named check directly inspectable."} +{"candidate_id":"v4-c15e92a3b1a755d4","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A YAML parser would support the assertions but violates ticket scope, and a dependency/import is a concrete detectable trace."} +{"candidate_id":"v4-c20a082f262f21c8","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A second literal fixture-directory branch works for two directories, but the anticipated third-directory need is hidden context and the hardcoded path is observable."} +{"candidate_id":"v4-c61d7c943edd8cff","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Floor counts can leave ordinary tests green despite removed coverage, while the distinction between a floor and exact count is mechanically checkable."} +{"candidate_id":"v4-cc76268ad4bb9a3e","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The incorrect ticket-owned census would make the stated RED contract fail, and the before-and-after numeric constants are directly checkable."} +{"candidate_id":"v4-ce2adee3c134ab03","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The demonstrated wildcard permits unreviewed growth while tests remain green, and wildcard versus literal census logic is statically decidable."} +{"candidate_id":"v4-d47951eaaa562775","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Treating a bad catalog as empty plainly turns write mode into an instruction to erase generated records, with the fallback behavior inspectable."} +{"candidate_id":"v4-d4b46b8cf85b5425","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"General POST permission can appear to work but weakens the visibly narrow mutation boundary, and its endpoint allowance is mechanically checkable."} +{"candidate_id":"v4-dd4a74ba2b628991","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A duplicated ticket-by-ticket allowlist could work while creating the otherwise invisible recurring drift and coordination burden."} +{"candidate_id":"v4-e0d8d11b190e4e26","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"An unused documented resolver can still render views normally, whereas use of the declared-input guard is a concrete load-bearing call path."} +{"candidate_id":"v4-e238e7785a6466b5","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Validating caller-supplied regret or distance can pass ordinary scoring cases but still leaves the self-serving denominator under caller control."} +{"candidate_id":"v4-e2c33042f79e2776","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Trusting a declared verdict instead of deriving it is a direct validation defect exposed by a coverage-only input whose declared result disagrees with its evidence."} +{"candidate_id":"v4-e3aa102492b031b1","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Whether a guard is unkillable is mutation-sweep history rather than a uniquely identifiable final-state pattern, although retaining it need not change functionality."} +{"candidate_id":"v4-e7587b2b65750306","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Literal prose digests would be visible hash checks and can function, but they impose hidden editorial-maintenance false failures."} +{"candidate_id":"v4-ece19dc4cef7c803","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Leaving the literal census expectation at 14 is an ordinary test failure after two owned source files are added."} +{"candidate_id":"v4-f691593763c944c4","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A literal ticket-owned path array is a checkable reintroduction that can work while restoring the hidden per-ticket maintenance bottleneck."} +{"candidate_id":"v4-f83f6dbc19155e50","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The invented key/total shape is a concrete schema trace and can operate if the specs are changed, but that conflicts with the frozen contract's authority."} +{"candidate_id":"v4-02764fbf10ceedc1","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The exact-match policy and longer-label negative case make the locale collision visible, and containment directly permits the wrong control."} +{"candidate_id":"v4-0d2959b1d2bbcec0","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The existing shared picker classifier and its localized titles make the duplication rationale code-visible, while an inline match could still function."} +{"candidate_id":"v4-0e840c8816f442f7","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Relaxing the real-document precondition permits an ambiguous creation state that a direct precondition test catches, and the retained predicate is checkable."} +{"candidate_id":"v4-129a3640dab8b53d","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Removing the explicit AXEnabled actuation guard is a concrete, behaviorally testable regression, while the guard's presence is statically checkable."} +{"candidate_id":"v4-132048855f4d7a5d","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Only the live-panel measurement reveals that both proposed classifier changes still find zero fields, and either leaves a recognizable traversal or ancestor-filter trace."} +{"candidate_id":"v4-218954b5ef6d08d7","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The separate legacy decoder branch makes the lower-layer coverage claim visible in code, yet a default-only change can pass ordinary tests while legacy arrays still fail open."} +{"candidate_id":"v4-25eb689fdb9ad98b","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Whether to remove implemented region routes depends on the external #302 scope decision, although their seven concrete routing-table entries can be checked mechanically."} +{"candidate_id":"v4-2714c211175c4737","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The bus-number and send-edge insufficiency depends on measured product data and ADR semantics, while constructing the named graph surface would leave a concrete code path."} +{"candidate_id":"v4-2756fbb39f4afc15","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The operation itself changes startBar, so using it as identity is visibly unsound and breaks ordinary verified-move tests, with the comparison expression directly inspectable."} +{"candidate_id":"v4-277e883c8a9d3eec","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The inadequacy of a widened subrole list rests on observed unfamiliar modal windows, but an allowlist or AXSubrole fallback is a concrete static trace."} +{"candidate_id":"v4-2853e493f4781414","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The oracle-independence rationale is not apparent from a passing harness, whereas hard-coded Korean expected labels rather than policy-derived ones are mechanically detectable."} +{"candidate_id":"v4-29c6beda0309a747","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Code can reveal that sends are never read before an empty default is serialized, but the empty-array alternative can still pass tests while asserting an unobserved absence."} +{"candidate_id":"v4-29c79faa31cc4fe2","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The zero-header guard is an explicit code-level completeness condition whose removal creates a directly testable unreadable-as-complete bug."} +{"candidate_id":"v4-2aee6afaad42b119","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Why the plugin path must remain coordinate-free is branch intent not inferable from final code alone, while restoring its coordinate branch or parameter is statically checkable."} +{"candidate_id":"v4-304262d2dae79858","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The late, Logic-assigned stem names make the dry-run contract issue depend on product behavior, while wiring stems through the fixed known-path planner is concretely inspectable."} +{"candidate_id":"v4-30b8d25980ce48a3","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A region-less track makes an observed-region trackIndex range undercount a complete viewport, a behavior a fixture can deterministically expose."} +{"candidate_id":"v4-5a1a7e7a347c6cc0","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The same-strip Input Monitoring control is an external UI ambiguity, while a bare input matcher versus the input-slot phrase is directly testable."} +{"candidate_id":"v4-632dec3f10f1e65b","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The code's lack of a file-selection observation makes the diagnostic inference visible, and the obsolete literal failure reason is a checkable trace."} +{"candidate_id":"v4-67ab88f48731b3f1","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A text-only guard cannot distinguish the live Optional comparisons from the broken Optional case, and an added == nil scanner rule is inspectable."} +{"candidate_id":"v4-710b1008c427461f","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The helper's reader call sites make its best-effort role visible, while a strict helper would still fix the ordinal write but broaden the read contract."} +{"candidate_id":"v4-748bedfbbe5fe417","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The path-entry failure depends on measured export-panel behavior, and a path-typing action in the destination flow is mechanically detectable."} +{"candidate_id":"v4-865d5bb5450bc905","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Whether Logic exposes a scope checkbox is UI evidence outside the code, while retaining a scope filter ID is a concrete source-level trace."} +{"candidate_id":"v4-8ea4400a37180162","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The workflow token scope is external to the file and the release flag is a one-file, directly inspectable change that can otherwise pass CI."} +{"candidate_id":"v4-8f7493456cee37a3","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Accessibility returning success without moving the disclosure arrow requires live behavior knowledge, and an AXPress write path is a concrete trace."} +{"candidate_id":"v4-959435801c3ef505","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The asynchronous progress-dialog completion signal is application behavior outside code, while returning immediately instead of waiting is testable in the export flow."} +{"candidate_id":"v4-97dfb7f923f08d18","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The retained tests visibly exercise the AXEnabled guard, and their deletion is a named, checkable loss of coverage without changing runtime behavior."} +{"candidate_id":"v4-a0550761c1997566","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The historical meaning of phase B4 is not derivable from current registration code, while inserting the operation ID into its named set is deterministic to inspect."} +{"candidate_id":"v4-a2ab2ce0394ace90","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The duplicate-name hazard came from a live project where all twenty regions shared a name, while a name-only identity check is a concrete comparison that targeted tests can expose."} +{"candidate_id":"v4-ae1693443c4f039f","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The language-specific sample strings and regex branches make the opposing number placement visible in code, and a shared pattern returns the wrong Korean bar."} +{"candidate_id":"v4-aea1ebe08b663d1c","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The structural AXDocument guard and look-alike-window test reveal that even an exact chooser title can belong to a real document, so title-only classification is directly testable as wrong."} +{"candidate_id":"v4-b62d3f38467138a5","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A static command list can work on English Logic while silently losing its safety guard after localization, and its presence instead of live menu-derived names is mechanically detectable."} +{"candidate_id":"v4-cccd3e7fae599767","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Only the external timing measurement shows that the panel appeared in 0.75 seconds, while increasing the concrete timeout value would leave the classifier failure unfixed."} +{"candidate_id":"v4-d171f3ea2a7f7362","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The code alone does not explain the repository requirement for separate registry, dispatcher, and live-proof work, although exposing the implemented operations could pass ordinary tests and would leave explicit registry traces."} +{"candidate_id":"v4-d7d1121164366d9c","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The stale-running-application observation explains why defaults can agree with the script without reflecting Logic, while a defaults read can still pass a normal successful locale run and is easy to detect in the harness."} +{"candidate_id":"v4-dd97491c4d227316","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Leaving analogous sibling stubs untouched is a review-scope judgment not inferable from behavior, and removing their named routing rows would remain functional yet leave a deterministic diff."} +{"candidate_id":"v4-de1096e077fa22d6","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The existing per-artifact executor contract supplies the answer an engineer can inspect, but whether documentation reinvents the question is an intent-level judgment without a stable final-state trace."} +{"candidate_id":"v4-de409d80b116c6ee","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The decisive 13-point live region measurement is absent from ordinary code context, and registering select_last would concretely expose an operation that fails on the measured project."} +{"candidate_id":"v4-eef995b442c7a008","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The completeness flag and conditional State C branch directly encode why exhaustive absence is stronger evidence, and making State B unconditional produces a testable contract error."} +{"candidate_id":"v4-f05b91620a25eee7","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The numericNear predicate and tolerance fixtures expose the one-bar contract in code, while requested-equals-observed would reject a permitted result and is mechanically recognizable."} +{"candidate_id":"v4-f0ea9a2a5b68115b","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"A standalone AX stem driver can work while remaining unreachable, but the public-surface and retired-row rationale is historical and the proposed implementation order leaves no final-state trace."} +{"candidate_id":"v4-f149c003cc5dae5d","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A valid call to a master-volume setter plainly mutates project state, while an invalid-parameter probe is a small, statically checkable harness choice."} +{"candidate_id":"v4-f51f8964286329bb","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The routing table and channel cases directly show that these operations work on MCU or key commands, so deleting their rows would break reachable behavior and is detectable as absent entries."} +{"candidate_id":"v4-fd7263067698db44","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Whether an unsupported AXModal attribute is an unknown observation rather than false depends on API semantics not local behavior, yet the bad error branch is directly testable."} +{"candidate_id":"v4-0d7c38f6a60e8b36","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A separate ADR inventory would leave trigger behavior unchanged while repeating the observed documentation-drift risk, and schema-adjacent annotations plus runtime trigger checks are mechanically verifiable."} +{"candidate_id":"v4-0ef57b3438b7d16b","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Choosing a larger timeout can preserve ordinary reply behavior, but the sequential polling and approval-stall consequence requires system context and the rejected choice is visible as raised timeout constants."} +{"candidate_id":"v4-0ef8cafdf0d11499","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The runner-specific sampling race is not inferable from ordinary code paths, while a test that accepts the cleanup refusal as an alternative accepted outcome is a concrete checkable relaxation."} +{"candidate_id":"v4-120b48f40e73f330","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The need to preserve session-only blockers and credentials is absent from code, and final files cannot reveal whether work was finished before a handoff was written."} +{"candidate_id":"v4-1a18ceae8a4645cf","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Preserving fields can pass message-level tests but retains a target-conversation lease in a source-message lifecycle, and the separate canonical_turns schema is deterministically inspectable."} +{"candidate_id":"v4-23f26b69f816664d","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Why the superseded ADR sentence must remain as a struck historical license is not executable behavior, but its required struck text versus deletion is a precise document-state check."} +{"candidate_id":"v4-3ba6d8b1fa31e10f","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A merge based on in-memory partial-run results can appear correct in ordinary runs but violates the on-disk source of truth, which a partial-run fixture can deterministically expose."} +{"candidate_id":"v4-4001fa0211128649","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Filtering only the doctor leaves a false EXHAUSTED value for other consumers, a cross-consumer judgment not apparent locally, and the null-reading advisory branch is directly testable."} +{"candidate_id":"v4-431dceed9013cb2b","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The durable-consumption code comments explicitly distinguish replay-cache admission from retained authority, while a longer TTL can pass ordinary retention behavior and its TTL or renewed cache lookup is concrete and bounded."} +{"candidate_id":"v4-45caf6be5b46889d","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The schema and coverage test expressly explain why documentation alone is insufficient, but leaving an existing trigger out of the required inventory preserves present functional behavior and is mechanically detectable in this small scope."} +{"candidate_id":"v4-50d2354c5c9210d1","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":false,"note":"The handoff states that the SURVIVAL judgment and refusal are correct, so the proposed exception is a functional safety defect in out-of-scope run-engine code rather than a checkable task over this documentation-only change."} +{"candidate_id":"v4-56a540b834736c43","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A segment matcher can work in ordinary single-project channel tests yet cross-route colliding role names, and exact purpose resolution is deterministically testable with two scoped purposes in the bounded adapter surface."} +{"candidate_id":"v4-5b3c19da588ec1d0","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The egress documentation and direct-socket probes make HTTPS_PROXY's advisory nature explicit, although proxy-compliant calls still work and removal of the kernel socket denial leaves a concrete bounded trace."} +{"candidate_id":"v4-6ace14eeff8e0235","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The guard comments and regressions explicitly require separate checkout and disposable-tree identities, and collapsing them necessarily creates a concurrency or containment failure that has a concrete bounded oracle."} +{"candidate_id":"v4-6fa12e79e96b6cc1","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The test itself documents the complementary static and behavioral blind spots, so removing the text assertion can leave ordinary process behavior green while its absence is an exact, bounded source-level trace."} +{"candidate_id":"v4-77018bc628e62482","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The daemon-owned App path and same-name provenance refusals make the authorization requirement visible, and caller credentials or neutral-check acceptance cannot satisfy the protected merge and are concretely checkable."} +{"candidate_id":"v4-83c6c0a5f5542b97","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The historical need to retain a response-size bound is not explained by ordinary successful requests, while a wholesale credential-store replacement can pass them and an absent finite response cap is mechanically testable in bounded code."} +{"candidate_id":"v4-8826ee094751e0ef","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The exit-139 crash history is not recoverable from the final CI configuration, while retrying can make an intermittent crash appear green and leaves a concrete retry rule in a small configuration task."} +{"candidate_id":"v4-8dbd6ece65df6bf7","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The workflow and trace helper explicitly document reuse of the gate's single result set, while retrying a duplicate execution can still yield a report and is detectable as an extra invocation or retry path."} +{"candidate_id":"v4-a0bf288e0dd97d24","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The message-site comments explicitly say the resend gate does not yet exist, but a false promise changes no runtime behavior and semantically equivalent unsupported wording cannot be decided by a stable programmatic oracle."} +{"candidate_id":"v4-a6950ee840587dbc","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The committed terminology checker explicitly explains the 20-hit staged baseline, so no hidden rationale remains, and its count makes an early bulk rename detectable."} +{"candidate_id":"v4-ac85b82316ac5980","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The in-flight guard comment states why it refuses instead of queues; queueing still serializes turns but is detectably different from an immediate BUSY refusal."} +{"candidate_id":"v4-b4647e5b48ad0f67","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The dispatch-refresh comment gives the rationale, and skipping a current probe lets a live exhaustion reading fail to refuse a run, which is directly testable."} +{"candidate_id":"v4-b48724ec04025b41","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The checker explicitly documents collocation matching, and an outright word ban would fail immediately on the repository's legitimate uses through a statically checkable regex change."} +{"candidate_id":"v4-bd395d87b2865263","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Only the ignored artifact path remains, leaving the per-run merge-conflict rationale hidden; retaining evidence/junit.xml is harmless to tests and concretely checkable."} +{"candidate_id":"v4-c25228afc16748b3","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The handoff records the umask, CI, and review failures, but final files cannot determine whether green local lanes were merged before those concerns were resolved."} +{"candidate_id":"v4-c8feb84e83c19266","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The runbook states the required ordering, but the eventual required-check configuration has no file-state trace of whether the production gate was enabled prematurely."} +{"candidate_id":"v4-cb7c81aa3e7a1d8c","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The typed executor boundary is documented in code, and a reason-code mapping can work for current cases while remaining distinguishable from the createMessage contact marker."} +{"candidate_id":"v4-cf7752a9fa65978e","reviewer":"reviewer-1","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Capacity ordering alone does not reveal the stale-continuity diagnosis, and a recovered provider requires the concrete mode-age re-evaluation rather than a sort change."} +{"candidate_id":"v4-d3094729cb02a074","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The fresh UUID requirement is documented, and an update-derived ID can pass current claim persistence while a same-update retry test deterministically exposes reuse."} +{"candidate_id":"v4-d3c77723a8e09894","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The code documents why sessionDigest is the sole definition, and an extra conversation column would work now but leaves a concrete duplicate storage or query trace."} +{"candidate_id":"v4-d61d9c73e11754bc","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The explicit STALE sentence and sentence-uniqueness test make reverting to the default branch a direct, deterministic test failure."} +{"candidate_id":"v4-db58634970ebbdf7","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The landed guard and ingress tests explicitly explain the irreversible duplicate CEO turn and require TURN_CLAIMED to block recovery, so rerunning is test-detectable and structurally checkable."} +{"candidate_id":"v4-ded1bcf6f444c76d","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The visible five-minute mode-age guard explicitly matches completion freshness and avoids an extra continuity evaluation on every dispatch, while call-count or structural checks can distinguish that viable but probe-heavy alternative."} +{"candidate_id":"v4-e5b4843efae58483","reviewer":"reviewer-1","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The fixture itself states that production correctly refuses CI's 0644 state files, core hardening tests that refusal, and PRIVATE_FILE_MODE at 0o600 provides a concrete oracle for this bounded test repair."} +{"candidate_id":"v4-00efc0041ed3118a","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Capping the accessor would still bound sleeps, but its corruption of the durable raw reset observation depends on a policy-versus-observation distinction not evident from the mechanism alone."} +{"candidate_id":"v4-03dd551058ce7aaf","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A monkeypatched TTY test can pass while bypassing the real terminal boundary, and the use of a fake stream or isatty patch is directly inspectable in the test harness."} +{"candidate_id":"v4-0f4dfe2618796b54","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Implementing the fix could work, but the requirement to keep a documentation correction separate is historical review discipline that cannot be recovered from the final documentation state."} +{"candidate_id":"v4-122f5e996ed8f300","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The insert-only storage flow and corrects_run_id lineage make the immutable correction model visible, while an UPDATE or DELETE is a concrete and testable violation."} +{"candidate_id":"v4-1f1cba75144b609f","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The no-threshold policy and behavior-based detection rationale are external to the implementation, while automated star or follow behavior coupled to a daily limit would leave checkable calls or configuration."} +{"candidate_id":"v4-2115a033e1fb37d0","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"A vague limitation statement passes functional checks, but deciding whether arbitrary README wording has been softened into a hedge is a semantic judgment rather than a stable programmatic trace."} +{"candidate_id":"v4-2493fd41b194d8f4","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The small-model field bleed is an empirical reason not inferable from the prompt, while quoting the marker literal is an exact inspectable prompt change."} +{"candidate_id":"v4-2616d7ae1c85fea4","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The lack of an observable outcome for tuning alternative collection policies is not apparent from search code, but sort keys, star thresholds, and bucket merges are concrete traces."} +{"candidate_id":"v4-2c70b58d7ce1117a","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A single clean sample can pass ordinary deterministic tests despite the measured false-pass probability, and the sample count is directly checkable in code."} +{"candidate_id":"v4-30517866b1626071","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The failure-handling branch makes the need to surface a lost history write reasonably evident, and a forced append failure can deterministically assert that a warning is emitted."} +{"candidate_id":"v4-31ea939e4478ded3","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Fixing the listed gaps could be functionally correct, but whether they were intentionally deferred to separately reviewed issues is commit-boundary intent absent from final file contents."} +{"candidate_id":"v4-3258ac6e08349a04","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Bumping the duplicate source version would work and likely improve consistency, but the forbidden-scope rationale is historical while the extra file and version assignment are mechanically detectable."} +{"candidate_id":"v4-377f04276465b59d","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Coverage gates or a badge could coexist with a passing workflow and leave explicit configuration or markup, while the preference for truthful baseline CI is not inferable from those files alone."} +{"candidate_id":"v4-4042654555ac20e4","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ADR records why the validated deterministic score outranks idea-plus-skill, although choosing the latter would still run and would leave a checkable ranking formula."} +{"candidate_id":"v4-468e579f86e22f91","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The live-evidence requirement is documented and fixture-based tests could pass, but final documentation alone cannot prove whether a claimed 403 came from GitHub with quota remaining."} +{"candidate_id":"v4-4d2c072dffcb56ba","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The external seed's missing license and architectural mismatch are historical facts, and copied or adapted code could pass tests without leaving a uniquely decidable provenance trace."} +{"candidate_id":"v4-545d1c9c0d2b969e","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ADR explicitly distinguishes malicious findings from absent evidence, while a three-state model could operate normally and is mechanically detectable in the status set and mappings."} +{"candidate_id":"v4-572e09dba076a5a3","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The README's stated scoring boundary exposes the lack of support for outcome claims, but deciding whether prose implicitly markets the score as quality or growth is semantic rather than deterministic."} +{"candidate_id":"v4-5f0d8829fcc6f198","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"An open-issues handoff plainly prioritizes live work, and re-listing the known closed issue numbers ahead of the live item would be a concrete, testable document change."} +{"candidate_id":"v4-63e1ec17f2bdadfe","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The documented squash policy and ordinary Git semantics reveal the conflict, while a no-ff workflow can otherwise work and leaves the literal flag or merge topology as an oracle."} +{"candidate_id":"v4-66695090e5949ea6","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A non-interactive write mode could pass pipeline tests, but its external AUP risk is not inherent in the implementation and the flag and dry-run guard are directly inspectable."} +{"candidate_id":"v4-6a3b0b51071ec292","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The separation between stored port responses and pipeline implementation is visible in the replay architecture, so embedding only prior engine code cannot guarantee old behavior and would leave an artifact-schema or code-payload trace."} +{"candidate_id":"v4-6aed03472a14ffc6","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The choice to separate documentation correction from independently evidenced fixes is historical process judgment, and a correct combined fix could pass tests without final files revealing that it occurred in the same commit."} +{"candidate_id":"v4-6d2eec862ac0f22c","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Separating the three screening fixes into reviewed issues is commit-scoping judgment rather than runtime behavior, so the fixes could work but their same-commit provenance is not decidable from final files."} +{"candidate_id":"v4-7078a162153bab38","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Case-insensitive HTTP header handling is a visible protocol invariant, and a case-sensitive lookup is a concrete defect that lowercase-header tests can catch."} +{"candidate_id":"v4-77e1745655a235ce","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Deriving kinds from producer methods visibly prevents drift, while a currently synchronized literal allowlist would work and is statically detectable."} +{"candidate_id":"v4-79e5fcfd3fd49649","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ADR records the measured PyPI conflict, although using the literal name touchstone could pass local tests and is mechanically detectable."} +{"candidate_id":"v4-7b84423ed8fa9f34","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The ticket's explicit retroactive disclosure exposes the honesty constraint, but whether rewritten prose falsely implies prior planning is a semantic judgment rather than a stable programmatic trace."} +{"candidate_id":"v4-7c0b5ea14295d54c","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Per-action Undo derivation makes the mixed-effect invariant apparent, while a session-level trailer could still execute successfully and leaves a checkable serialization trace."} +{"candidate_id":"v4-7c3c09fcebd01801","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Computed completeness properties visibly enforce consistency, whereas constructor booleans can work when supplied correctly and are directly identifiable in the data model."} +{"candidate_id":"v4-7f42c3f1f7876679","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The structured Signal API makes the need for severity and citations evident, but a boolean scanner remains operational and would leave an unmistakable type and return-value trace."} +{"candidate_id":"v4-81773950b2e67c02","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ADR explicitly explains why four states suffice, while additional states could function and can be detected by enumerating the declared status values."} +{"candidate_id":"v4-81aa6660ab83f1dc","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A repository-local handoff does not itself reveal the prior cross-repository maintenance failure, while adding the other repository's sections would still work and is concretely detectable."} +{"candidate_id":"v4-849425816b8050cc","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The shared capped snapshot and hash visibly avoid quadratic duplication, while repeating full listings remains functionally correct and can be detected in trailer construction."} +{"candidate_id":"v4-8ab61d73c22d675b","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Validation code alone need not reveal the downstream provenance objection to invented grades, while a numeric fallback would keep the pipeline running and leave a concrete assignment branch."} +{"candidate_id":"v4-8e59d287bd2f9248","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The budget-competition rationale is not evident from an ordinary extension edit, while broad extensions can pass manifest tests and are exactly detectable in SOURCE_EXTENSIONS."} +{"candidate_id":"v4-8fc3d2ec14b1c078","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The header-sensitive 403 branches make the permission-versus-rate-limit distinction inferable, while a status-only retry is a concrete but functionally incorrect condition."} +{"candidate_id":"v4-9387c3b68473bda9","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The naming ADR exposes why gradelore was displaced, although retaining that name would still work and would leave directly searchable identifiers."} +{"candidate_id":"v4-9c974f0a8436c03e","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Nothing inherent in carrying truncation metadata explains the ticket-scope decision to continue, while refusal is viable and detectable as a branch on incomplete results."} +{"candidate_id":"v4-9cc0a659cfa12205","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The concern that callers would ignore an advisory coverage flag is historical judgment, while a boolean-plus-flag design can work and has a concrete type and branching shape."} +{"candidate_id":"v4-9f9eb817a08ae4c9","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The external GitHub calls and compensation path expose the lack of true rollback, and a transaction promise would be incorrect despite leaving checkable call-order or wrapper traces."} +{"candidate_id":"v4-a2ad4b77ea6a9a3b","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"ADR-0012 records the missing expected-attention baseline, while dividing by stars still computes a usable number and is mechanically detectable in a scoring expression."} +{"candidate_id":"v4-a2dbaee9c683ea83","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The naming ADR preserves the owner-choice context, while repotriage is a functionally viable name whose reappearance is detectable as a literal identifier."} +{"candidate_id":"v4-a5b9e9e48752467e","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Upstream collection mutation makes the need for a mutable CollectResult visible, and changing its field to a tuple would break ordinary collection tests while leaving a precise type trace."} +{"candidate_id":"v4-a7b04c5208e493e4","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":false,"note":"The backtest boundary is external to the scoring implementation and extra components could calculate successfully with identifiable feature names, but implementing the thirty-seven-component remainder is sprawling."} +{"candidate_id":"v4-a9ec5cd512c7c2c7","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The table code does not itself convey the quiet-day-versus-broken-screener rationale, while filtering withheld rows remains viable and is deterministically observable in fixture output."} +{"candidate_id":"v4-a9edac0b4d0f80a8","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The decision to defer RecommendationStatus belongs to ticket sequencing rather than code semantics, while adding the enum would work and leave concrete definitions and status values."} +{"candidate_id":"v4-ada5ec890a36e5b2","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The repository's lack of any phase-gate implementation makes the unsupported claim apparent and harmless to functional tests, but whether arbitrary README prose makes that claim requires semantic human judgment."} +{"candidate_id":"v4-aec71c78e9675ad3","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The ADR itself explains the evidence gate, and although the ungated roadmap can work, recognizing an unlicensed behavioral claim is semantic rather than a stable code trace in this bounded one-file task."} +{"candidate_id":"v4-b0282a5d21a52335","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The policy documents explicitly cite GitHub's AUP, while unattended star or follow calls would still work, are mechanically detectable, and concern a finite documentation set."} +{"candidate_id":"v4-b3568fcfe78e5aab","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A reason-bearing skip is visible in the test behavior and standard reporting, while a quiet conditional skip would leave a detectable branch without breaking product functionality in this bounded test change."} +{"candidate_id":"v4-b9bba3d1416828fa","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The Approval capability and its construction path expose the provenance rationale, while an approved boolean would behave in cooperative tests and leave a deterministic signature change across six bounded files."} +{"candidate_id":"v4-badec4c4ee9efb2a","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Newest-first ordering and the inadequacy of a PR-only note are conventional and evident, while the old order remains harmless to tests and mechanically checkable in one file."} +{"candidate_id":"v4-bef9b4e179c50fe8","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The smoke-gate code makes installation-versus-contract validity apparent, while an install-only check can pass cooperative model tests, is detectable by the missing probe, and is local to five files."} +{"candidate_id":"v4-c08dac879bbde6a4","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Nothing in an undated heading explains the prior whole-section staleness failure, while a fresh global date works initially and is a regex-checkable two-file regression."} +{"candidate_id":"v4-c27e59f236ed7496","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The reason for deferring general heuristic sorting lives in issue scope rather than the selection code, while such sorting can work and leaves a detectable pre-cap ordering operation within a bounded module set."} +{"candidate_id":"v4-c38d520fe83cb7d5","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The add-versus-undo AUP asymmetry is not inherent in the action signatures, while approval-gating undo still works and is detectable as an Approval parameter or prompt in six files."} +{"candidate_id":"v4-c8e57b42ac2635de","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ADR directly explains why two states collapse zero and full coverage, and a rename-only implementation would fail a basic zero-coverage behavior test while remaining structurally easy to detect in one file."} +{"candidate_id":"v4-c976dc2332d4adab","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The TTY guard, Approval type, and review ticket expose the ban on CI bypasses, while a noninteractive flag would function and leave an explicit option or branch across a bounded change."} +{"candidate_id":"v4-cadfb63755c3f504","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The result and error model makes preservation of prior candidates apparent, and terminating on a grader exception is an ordinary failure-handling bug that a focused test detects through a concrete early-exit path within three files."} +{"candidate_id":"v4-d56e88f5ef1b62cb","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The document cannot reveal that its structure survived eleven intervening PRs; a full rewrite could still produce a usable one-file handoff, but rewriting wholesale has no stable final-state marker."} +{"candidate_id":"v4-d5b3514664089aef","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The scanner tests explicitly identify short base64 and a real SHA-256 as clean traps, so lowering concrete length thresholds would be directly detectable and fail ordinary clean-corpus tests within a bounded module."} +{"candidate_id":"v4-d9887355b9eff3e9","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"CollectResult.complete and the collection module's truncation comments expose the rationale, while returning an empty list at rate-limit branches is a concrete loss of state that focused tests catch in four files."} +{"candidate_id":"v4-dc67b4d3b699b947","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The API-only requirement does not expose the historical disk, time, and untrusted-code rationale, while clone-and-digest can produce the same analysis and leaves observable clone operations in a finite task."} +{"candidate_id":"v4-df6bfd03300910e2","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"RunArtifact.rederive_categories consumes serialized CategoryPack definitions, making the self-contained replay reason inferable; a digest-only artifact could still record and load current results, and its schema is mechanically distinguishable in a bounded change."} +{"candidate_id":"v4-e25462e19110c9eb","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The shared classifier and paired exhausted-quota versus budget-remaining 403 tests make the remedy distinction explicit, so a status-only forbidden branch is a concrete functional regression in four files."} +{"candidate_id":"v4-e5a87ee0d8e99a1e","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The README cannot reveal the historical lack of evidence or the sibling project's withdrawn numbers; adding benchmark, adoption, or comparison prose would not break functionality, but adequate sourcing requires semantic judgment in this two-file task."} +{"candidate_id":"v4-e82c306ec9e425b2","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"ADR-0004 explicitly says repotrust overclaims trust, while choosing that otherwise usable name would leave concrete product-name literals in a one-file bounded decision."} +{"candidate_id":"v4-ea459217291aa8a3","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The selector comments, README, and padding regression test explicitly require priority files before the count cap, so capping them is a concrete security bug the ordinary test suite catches within the listed modules."} +{"candidate_id":"v4-f4404e6e27e534e5","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ranked function states the quiet-day-versus-broken-grader rationale verbatim; filtering ungraded entries still yields a usable ranking but leaves a deterministic missing-entry trace in a small pipeline task."} +{"candidate_id":"v4-f75d4b634c14b66c","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ranking code and test docstring explicitly explain why None avoids range-coupled sentinels; a numeric sentinel currently works, and its score value and type leave a precise trace in three files."} +{"candidate_id":"v4-002ffd1e428c572a","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The dynamic census assertion does not reveal that a separate focused-lane count already covers deletion, while a literal path list works, is mechanically detectable, and is maintainable within the six-file scope."} +{"candidate_id":"v4-00b9b5b83c4ddf87","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Editing the six current tickets would satisfy the present corpus while leaving a concretely testable parser failure for the next period-terminated declaration."} +{"candidate_id":"v4-04c1de5e41d66868","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The secondary comparator is behaviorally inert for the current reason-code domain, yet its retained presence is mechanically detectable and its unreachability depends on non-obvious matrix facts."} +{"candidate_id":"v4-09c4183e165a4da4","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A keyword classifier could fit the present prose and tests, but the corpus does not expose the historical finding that its wording is too irregular to be a trustworthy derivation."} +{"candidate_id":"v4-0bc581744204a282","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Signature verification is implementable and readily detectable through fields, keys, and crypto calls, while the missing custody and rotation rationale is not recoverable from the unsigned classifier alone."} +{"candidate_id":"v4-0f8cd38c8ba43cfe","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The commit fetch is visibly the evidence source for the completion-effect check, so removing that call directly breaks the check rather than preserving function under a subtler policy violation."} +{"candidate_id":"v4-12b0486cd77dd3a9","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The separate opportunity and scored-metric gates make the required distinction inspectable, and deriving both from scored observations creates a concrete contract bug that an isolation case catches."} +{"candidate_id":"v4-14a911a7f4c96afb","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Inspection shows that the old guard exercises only the frozen matrix, but retaining that redundant test beside an effective subset case would still leave the suite functionally green and is easy to detect."} +{"candidate_id":"v4-163c7d58d0692423","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The stale literal 37 is an obvious numeric trace and immediately fails four planning tests, making this a straightforward broken-update path rather than hidden judgment."} +{"candidate_id":"v4-1a5dea10137de7da","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A Node 20 CI leg can report success while silently omitting TypeScript tests, and the version entry is deterministic even though the vacuous-discovery reason is not evident from ordinary configuration."} +{"candidate_id":"v4-1bc2a34840360fd0","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A validator that reads the verdict it is meant to validate is visibly circular, and an inconsistent declared verdict supplies a direct functional test of the concrete field access."} +{"candidate_id":"v4-23ba99c6da04e46f","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The order-independent event contract makes an array-order invariant unjustified on inspection, and a permuted valid trace deterministically exposes the resulting functional rejection."} +{"candidate_id":"v4-261cdc76929d85cc","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A wildcard census visibly fails to pin membership yet can leave the ordinary suite green, and its wildcard assertion is a concrete bounded trace for an oracle."} +{"candidate_id":"v4-2cadeedf7d7f2251","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The conditional M18/M20 requirement is encoded and independently guarded in the capability artifacts, while making it unconditional has a directly testable issuance-blocking effect and leaves a concrete required-set trace."} +{"candidate_id":"v4-32281c33a0cd1d51","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The module expressly distinguishes a claim from proof, but trusting the actor string would preserve normal classification behavior while reintroducing a deterministically detectable wrapper-evidence predicate."} +{"candidate_id":"v4-34aef026d81c2f6b","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A filtered broad scan works for today's projections but hides the future-readmission rationale, and a fixture containing a newly named projection can deterministically distinguish it from the bounded positive input set."} +{"candidate_id":"v4-3a462c35336b7325","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The code can show that INVALID is excluded without preserving the denominator-inflation rationale, but counting value-less observations changes issuance eligibility in an ordinary edge case and is directly testable."} +{"candidate_id":"v4-4b7ef509f0403505","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The current Node matrix does not itself explain why transpilation was rejected, while a compile-first Node 20 lane would run the tests and leave concrete build-script, dependency, or emitted-artifact traces."} +{"candidate_id":"v4-50c24e701b7ba2ef","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The backlog-growth rationale is recorded beside the timeout constant, while a value just over 89.5 seconds works at the current size and is deterministically recognizable as the undersized budget."} +{"candidate_id":"v4-575de52ba54d6758","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The pagination loop and exact-total checks make the truncation reason visible, and a single 100-result request is a reproducible correctness failure once a bounded fixture exceeds that limit."} +{"candidate_id":"v4-5eb2760a3fa148f3","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Git-derived introduced paths do not reveal the historical negative-ownership trap, but ownership-based derivation falsely requires expressly absent files and can be rejected by a finite fixture."} +{"candidate_id":"v4-5f6e3fcc52a2df1d","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The fatal guards do not fully expose the catalog-authority rationale, but treating missing or duplicate contracts as drift produces broken or ambiguous output in bounded deterministic cases."} +{"candidate_id":"v4-60e3f694ae5ca2d5","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The scoring contract and its formula fixtures expose that NOT_OBSERVED is outside the denominator, and zero substitution produces a directly testable incorrect score rather than a merely judgment-violating implementation."} +{"candidate_id":"v4-7362d21baaf5d618","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The final single guard does not reveal that the removed derivability check was logically implied, while restoring the redundant conjunct preserves all behavior and leaves a concrete AST-level trace."} +{"candidate_id":"v4-8001a8835a9351e3","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The fail-closed derivation and source-presence tests make the no-proof rule apparent, while falling back to a declaration admits an unsupported capability in a deterministic missing-source case."} +{"candidate_id":"v4-82ae5492d09483d9","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Leaving the census values at 33 is directly exposed by pinned-count tests and fails npm test, while the literal pin makes the revival mechanically detectable."} +{"candidate_id":"v4-841244a354bd70c7","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Extra pins are behaviorally redundant and would pass, while their mutant-equivalence rationale is not apparent from normal behavior and the added assertions are mechanically detectable."} +{"candidate_id":"v4-843485d931913281","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The filter's deadness follows from the disjoint sets already proved by the code, so retaining the concrete filter would still pass but is structurally detectable."} +{"candidate_id":"v4-88299d9c1503bc7b","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Commit-message matching is visibly narrower than effect presence and fails the plain-deletion case, although message inspection is a concrete bounded implementation trace."} +{"candidate_id":"v4-89d86d3677fb18ef","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Filename exclusions could make the present race tests pass, but the preference for eliminating all live-tree writes is historical maintainability judgment and filter callbacks are inspectable."} +{"candidate_id":"v4-8c7fdf80ae6c6f2e","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A package test script would work and is trivially detectable, while the Exact-ownership boundary is not evident from the affected implementation and fixtures."} +{"candidate_id":"v4-8f24735524874167","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The checked-in ticket explicitly grants fixtures/doctor/*.json, so the path priority is visible; embedding reports could still work and is mechanically distinguishable."} +{"candidate_id":"v4-915f4e606299276c","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The artifacts already distinguish F6's presentation grouping from its scoring inputs and safety routing, so reconciliation changes the contract and equality of membership sets is mechanically checkable."} +{"candidate_id":"v4-975a69717305d00f","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The valid-input constraints make an out-of-range clamp fixture unreachable and therefore functionally invalid, though such a fixture would be a concrete bounded test artifact."} +{"candidate_id":"v4-9b42b1951da730e1","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Allowlisting the two product paths would satisfy admission tests and leave exact entries, while the policy against disguising product code as control-plane surface is not recoverable from ordinary functionality."} +{"candidate_id":"v4-a0489f4a19bc3969","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A refusal returning zero is an ordinary observable bug already pinned by exit-code tests, and the refusal branch's exit value is directly oracleable."} +{"candidate_id":"v4-a2acb02e41d42051","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Unrecorded per-agent instructions could let implementation proceed and pass tests, but the governance rationale is historical and the instructions themselves leave no deterministic final-file trace."} +{"candidate_id":"v4-a3705f2f819df548","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The literal census mismatch is exposed by the existing test failure, and the numeric pin provides a concrete oracle in one bounded file."} +{"candidate_id":"v4-a3d2b14112b034a4","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The pagination and total-count checks make first-page truncation an evident data-loss bug that boundary tests can catch through concrete request parameters and results."} +{"candidate_id":"v4-ad1efe720ca11f3c","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The analytic median derivation and 40-minute assertions expose the sampling-noise problem, while an empirical-percentile calculation is directly detectable and fails the named valid cases."} +{"candidate_id":"v4-b525ee2c84544b9e","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Exact ticket ownership is not apparent from the focused test file, and adding a working package test script would pass functionally while leaving a checkable manifest entry."} +{"candidate_id":"v4-bed5fc386048e412","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The future-workflow sequencing rationale is not recoverable from the synchronized authority files, and removing the named check could work today while leaving a deterministic textual omission."} +{"candidate_id":"v4-c15e92a3b1a755d4","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ticket-specific ban on a runtime dependency is external engineering judgment, while a YAML parser would work and be deterministically visible as a dependency or import in this bounded change."} +{"candidate_id":"v4-c20a082f262f21c8","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The imminent need for a third fixture directory is hidden historical context, whereas a second hardcoded path works for the current fixtures and is straightforward to detect."} +{"candidate_id":"v4-c61d7c943edd8cff","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"An exact count assertion itself reveals that slack is forbidden, but a floor still passes the current suite and leaves a deterministic comparison-operator trace."} +{"candidate_id":"v4-cc76268ad4bb9a3e","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The batch-ordering hard stop is historical context not evident from the corrected ticket, although stale literal census values produce a concrete contract failure that ordinary validation catches."} +{"candidate_id":"v4-ce2adee3c134ab03","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The literal census and focused-lane guard make the missing growth protection inferable, yet the wildcard was demonstrated to pass the suite and is a concrete detectable pattern."} +{"candidate_id":"v4-d47951eaaa562775","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The nonempty catalog validation and destructive-write tests directly expose this as a functional data-loss bug, with fallback-to-empty behavior providing a deterministic oracle."} +{"candidate_id":"v4-d4b46b8cf85b5425","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The exact check-run endpoint and explicit forbidden mutation targets make the security rationale visible, while a generic POST allowance can pass normal behavior and is mechanically detectable."} +{"candidate_id":"v4-dd4a74ba2b628991","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A manually maintained allowlist could enforce the census and pass tests, but its coordination burden and drift risk are historical context while the literal list would be statically detectable."} +{"candidate_id":"v4-e0d8d11b190e4e26","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The prior disconnected declaration passed the full suite despite enforcing nothing, and an oracle can check whether renderer reads are routed through readDeclaredInput."} +{"candidate_id":"v4-e238e7785a6466b5","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Accepting well-formed caller-derived M10 or M20 values can satisfy happy-path tests while preserving caller control, and acceptance or use of the named derived fields is concretely testable."} +{"candidate_id":"v4-e2c33042f79e2776","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Shape-checking a truthful declared verdict works on normal fixtures but misses adversarial coverage-only claims, which a deterministic forged-verdict fixture can expose."} +{"candidate_id":"v4-e3aa102492b031b1","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Redundant or unreachable guards preserve ordinary behavior and their removal rationale is absent from the resulting code, while their reappearance can be checked against the consolidated overflow choke point."} +{"candidate_id":"v4-e7587b2b65750306","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A full prose digest would validate the current artifact yet create false failures on editorial changes, and the hashing or literal digest machinery would leave an unambiguous trace."} +{"candidate_id":"v4-ece19dc4cef7c803","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Leaving the census count at 14 is an ordinary stale-count defect directly exposed by npm test, and the pinned numeric value is trivial to inspect."} +{"candidate_id":"v4-f691593763c944c4","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A correctly updated literal path list would pass and enforce the same present set, but the future per-ticket bottleneck is historical and a literal list is mechanically detectable."} +{"candidate_id":"v4-f83f6dbc19155e50","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The invented key-total representation could work if contract rows were changed with it, but the authority ordering is not inherent in code and the schema keys provide a deterministic oracle."} +{"candidate_id":"v4-02764fbf10ceedc1","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The strict matcher and negative longer-label test make the collision reason visible and catch containment, while the matching mode is a concrete inspectable choice."} +{"candidate_id":"v4-0d2959b1d2bbcec0","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The existing localized isProjectPickerWindow helper makes the reuse rationale visible, although equivalent inline title checks could pass behavior tests and are statically identifiable."} +{"candidate_id":"v4-0e840c8816f442f7","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The window-identity ambiguity motivating the precondition is not evident from the final filter alone, but relaxing it breaks the real-open-document case and leaves a checkable control-flow change."} +{"candidate_id":"v4-129a3640dab8b53d","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The AXEnabled guard's purpose is evident and dropping it is a testable disabled-item bug, while the guard call is mechanically checkable and the popup change is bounded."} +{"candidate_id":"v4-132048855f4d7a5d","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The live-only zero counts are not inferable from source, but either search rule fails the actual filename-field behavior and leaves checkable search or filter code within two files."} +{"candidate_id":"v4-218954b5ef6d08d7","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The distinct legacy decoder path makes the incomplete fix visible, and retaining a complete claim there is a concrete bounded defect that a legacy-payload test can catch."} +{"candidate_id":"v4-25eb689fdb9ad98b","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The #302 ownership rationale is absent from route-table maintenance, while deleting the seven implemented but unadvertised rows can leave ordinary behavior green and is deterministically detectable in four bounded files."} +{"candidate_id":"v4-2714c211175c4737","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The measured display-name versus node-identity mismatch is not recoverable from types alone, while populating the graph can satisfy shallow output tests and leaves concrete graph-construction code in a six-file task."} +{"candidate_id":"v4-2756fbb39f4afc15","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Because move_to_playhead necessarily changes startBar, using it as identity is an obvious functional bug caught by success or drift tests, and the comparison is mechanically detectable in a bounded handler."} +{"candidate_id":"v4-277e883c8a9d3eec","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The prior AXFloatingWindow failure and future-subrole rationale are historical, while a widened allowlist handles known fixtures yet remains concretely detectable in a bounded seven-file change."} +{"candidate_id":"v4-2853e493f4781414","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The single-source-of-truth testing rationale is not evident from the live harness alone, and matching hard-coded Korean literals can pass current behavior while remaining directly detectable in one file."} +{"candidate_id":"v4-29c6beda0309a747","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The unobserved-versus-empty contract is not obvious from an ordinary model edit, while a nonoptional empty array serializes and tests normally yet is directly checkable in the bounded state model."} +{"candidate_id":"v4-29c79faa31cc4fe2","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The nonempty guard and focused test expose the zero-header fallacy, which is a concrete functional fail-open rather than a viable alternative and is bounded to the inventory logic."} +{"candidate_id":"v4-2aee6afaad42b119","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The coordinate-free branch objective is historical rather than evident from current implementation, while restoring main's coordinate path can still work and leaves deterministic parameter and branch traces in a bounded merge area."} +{"candidate_id":"v4-304262d2dae79858","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The current ticket documents the dry-run contract mismatch directly, treating it as incidental breaks plan semantics, and the rejected intent has no single implementation trace even though the two-file documentation task is bounded."} +{"candidate_id":"v4-30b8d25980ce48a3","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The need to count all track headers comes from live evidence about region-less tracks, while a range-based completeness calculation is concretely detectable but incorrect on that case."} +{"candidate_id":"v4-5a1a7e7a347c6cc0","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The monitoring-first fixture makes the collision with a bare input keyword visible in the tests, and that match would select the wrong control."} +{"candidate_id":"v4-632dec3f10f1e65b","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The unsupported inference behind the old error text is not apparent from normal control flow, although retaining the literal message would leave the import behavior functional and be easy to detect."} +{"candidate_id":"v4-67ab88f48731b3f1","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The type-erasure limitation of a textual nil-comparison scan is not evident from the affected Swift tests, and adding the pattern would immediately flag the repository's many valid non-Bool optional comparisons."} +{"candidate_id":"v4-710b1008c427461f","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Making the shared enumerator strict would still work on complete mixer trees but silently change the best-effort contract relied on by multiple read callers, a cross-caller rationale not evident locally."} +{"candidate_id":"v4-748bedfbbe5fe417","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ticket documentation directly records that typing the path dismisses the panel without output, so the reason is visible and the alternative is a testable functional failure."} +{"candidate_id":"v4-865d5bb5450bc905","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Only the live UI inventory establishes that no scope checkbox exists, and restoring its control ID would leave a concrete but fabricated dependency that assessment tests can reject."} +{"candidate_id":"v4-8ea4400a37180162","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The omitted compiler flag is technically valid and would pass release behavior checks, while the external token-scope and sequencing reason is absent from the final workflow and the flag is statically detectable."} +{"candidate_id":"v4-8f7493456cee37a3","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Accessibility returning success without moving the disclosure arrow is live-only evidence, but exposing a write would be observably nonfunctional and would leave concrete registry or handler traces."} +{"candidate_id":"v4-959435801c3ef505","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The current ticket explicitly identifies progress-window disappearance as the completion signal, and returning on the click would violate completion semantics in a directly testable way."} +{"candidate_id":"v4-97dfb7f923f08d18","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The two tests visibly exercise the retained AXEnabled guard, yet deleting them leaves product behavior unchanged and is deterministically detectable from the test file."} +{"candidate_id":"v4-a0550761c1997566","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Putting the operation in the B4 set would satisfy ordinary registry coverage while falsifying the set's historical meaning, and membership in that named set is a bounded deterministic trace."} +{"candidate_id":"v4-a2ab2ce0394ace90","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The duplicate-name hazard came from a live project where all twenty regions shared a name, while a name-only identity check is a concrete comparison that targeted tests can expose."} +{"candidate_id":"v4-ae1693443c4f039f","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The language-specific sample strings and regex branches make the opposing number placement visible in code, and a shared pattern returns the wrong Korean bar."} +{"candidate_id":"v4-aea1ebe08b663d1c","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The structural AXDocument guard and look-alike-window test reveal that even an exact chooser title can belong to a real document, so title-only classification is directly testable as wrong."} +{"candidate_id":"v4-b62d3f38467138a5","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A static command list can work on English Logic while silently losing its safety guard after localization, and its presence instead of live menu-derived names is mechanically detectable."} +{"candidate_id":"v4-cccd3e7fae599767","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Only the external timing measurement shows that the panel appeared in 0.75 seconds, while increasing the concrete timeout value would leave the classifier failure unfixed."} +{"candidate_id":"v4-d171f3ea2a7f7362","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The code alone does not explain the repository requirement for separate registry, dispatcher, and live-proof work, although exposing the implemented operations could pass ordinary tests and would leave explicit registry traces."} +{"candidate_id":"v4-d7d1121164366d9c","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The stale-running-application observation explains why defaults can agree with the script without reflecting Logic, while a defaults read can still pass a normal successful locale run and is easy to detect in the harness."} +{"candidate_id":"v4-dd97491c4d227316","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Leaving analogous sibling stubs untouched is a review-scope judgment not inferable from behavior, and removing their named routing rows would remain functional yet leave a deterministic diff."} +{"candidate_id":"v4-de1096e077fa22d6","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The existing per-artifact executor contract supplies the answer an engineer can inspect, but whether documentation reinvents the question is an intent-level judgment without a stable final-state trace."} +{"candidate_id":"v4-de409d80b116c6ee","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The decisive 13-point live region measurement is absent from ordinary code context, and registering select_last would concretely expose an operation that fails on the measured project."} +{"candidate_id":"v4-eef995b442c7a008","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The completeness flag and conditional State C branch directly encode why exhaustive absence is stronger evidence, and making State B unconditional produces a testable contract error."} +{"candidate_id":"v4-f05b91620a25eee7","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The numericNear predicate and tolerance fixtures expose the one-bar contract in code, while requested-equals-observed would reject a permitted result and is mechanically recognizable."} +{"candidate_id":"v4-f0ea9a2a5b68115b","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A standalone stem drive can compile and pass mechanism tests while remaining unrouted, and the ticket dependency text gives an oracle even though the repository's prior unreachable-row history is not evident from the implementation."} +{"candidate_id":"v4-f149c003cc5dae5d","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The set-master-volume operation and live harness make the mutation risk apparent, while a valid-parameter probe would work and is mechanically distinguishable from the deliberately rejected-parameter call."} +{"candidate_id":"v4-f51f8964286329bb","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The routing table and channel cases expose the surviving implementations, so deleting the two exact rows is detectable and would break working routes rather than merely violate a hidden convention."} +{"candidate_id":"v4-fd7263067698db44","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The semantic difference between absent AXSheets contents and an unreadable AXModal attribute depends on external AX behavior, but mapping the two named error codes to clean absence is a concrete branch that the modal regression tests can catch."} +{"candidate_id":"v4-0d7c38f6a60e8b36","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"An ADR trigger inventory would not change runtime behavior, yet the prior documentation-drift rationale is historical and an oracle can check whether invariant prose remains adjacent to every schema trigger instead of living in ADR-0002."} +{"candidate_id":"v4-0ef57b3438b7d16b","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Larger timeout constants would ordinarily keep turns functioning and pass relationship checks, while the owner-message and approval latency rationale spans runtime ordering not obvious from the constants and any budget increase is directly inspectable."} +{"candidate_id":"v4-0ef8cafdf0d11499","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Allowing either refusal would make the flaky CI test pass while abandoning its measurement guarantee, and the broadened assertion is an exact source-level trace even though the sampling race is not explained by the handoff file alone."} +{"candidate_id":"v4-120b48f40e73f330","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":false,"note":"Finishing unspecified in-flight P0 work could produce valid code but is an open-ended sequencing choice whose occurrence and lost session context cannot be determined from the eventual handoff file."} +{"candidate_id":"v4-1a18ceae8a4645cf","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Carefully preserving turn fields in every current inbound-message rewrite could pass functional tests, but the source-versus-target lifecycle boundary is architectural judgment and the schema location of canonical turn state is mechanically checkable."} +{"candidate_id":"v4-23f26b69f816664d","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Deleting the obsolete ADR sentence leaves the current architecture functional but erases provenance not inferable from code, and an oracle can distinguish absent text from a retained struck-through decision."} +{"candidate_id":"v4-3ba6d8b1fa31e10f","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Merging fresh in-memory results with an old summary works when representations agree, but the historical disagreement rationale is hidden and the script's choice between report-file derivation and summary merging is concretely inspectable."} +{"candidate_id":"v4-4001fa0211128649","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Filtering only in doctor leaves a false EXHAUSTED value for another consumer, a nonlocal reason not visible in these changed files, while the null-to-UNKNOWN mapping is deterministic and its regression test catches the wrong behavior."} +{"candidate_id":"v4-431dceed9013cb2b","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A longer replay-cache TTL can satisfy ordinary approval-retention tests while preserving traffic-dependent expiry, and the concrete TTL or pruning interval is mechanically detectable even though that lifecycle rationale is not apparent locally."} +{"candidate_id":"v4-45caf6be5b46889d","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The required-trigger inventory and its schema reconciliation test directly reveal why comments alone are insufficient, fail a documented-but-unlisted trigger, and provide a deterministic bounded oracle."} +{"candidate_id":"v4-50d2354c5c9210d1","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":false,"note":"The handoff itself states that SURVIVAL and its dispatch refusal are correct, while the proposed exception is a functional safety bug in run-engine.ts, a file outside this documentation-only change scope."} +{"candidate_id":"v4-56a540b834736c43","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Segment matching can pass ordinary single-project channel tests yet cross-route identically named roles across projects, a production rationale not evident from the local lookup and a behavior an oracle can test with two purpose values."} +{"candidate_id":"v4-5b3c19da588ec1d0","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The composed sandbox profile and direct-socket probes make the advisory nature of HTTPS_PROXY evident, although proxy-compliant reviewer calls still work and kernel confinement is concretely testable in a bounded task."} +{"candidate_id":"v4-6ace14eeff8e0235","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The two request identities and explicit concurrency and containment regressions expose the reason in code, and collapsing them necessarily fails one of those behaviors while remaining straightforward to detect."} +{"candidate_id":"v4-6fa12e79e96b6cc1","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Removing the source-text assertions leaves production behavior and the behavioral test green, but the mutation-specific complementary coverage is historical judgment and the assertions' presence is an exact bounded trace."} +{"candidate_id":"v4-77018bc628e62482","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"GitHub's authorization consequence is external to the local finalizer structure, but caller-held credentials or acceptance of neutral and non-App checks cannot complete the protected merge and are deterministically observable in the credential and check-validation paths."} +{"candidate_id":"v4-83c6c0a5f5542b97","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Wholesale adoption can pass normal credential-store requests while silently losing the unattended response-size safeguard, whose historical necessity is hidden but whose finite cap can be checked with an oversized response in a bounded task."} +{"candidate_id":"v4-8826ee094751e0ef","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A CI retry can turn an intermittent exit-139 worker crash green while masking the native-addon isolation defect, and a retry stanza or wrapper is a concrete trace despite the crash history being absent from ordinary config maintenance."} +{"candidate_id":"v4-8dbd6ece65df6bf7","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The workflow's JSON result handoff and trace fallback visibly encode single-execution reuse, while retrying a duplicate run can still produce a report and leaves a deterministic extra test invocation or retry path."} +{"candidate_id":"v4-a0bf288e0dd97d24","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Promising a nonexistent resend hold does not affect runtime behavior and the missing mechanism is not obvious from the message site, but recognizing every semantically equivalent false promise in prose requires human interpretation rather than a stable final-state trace."} +{"candidate_id":"v4-a6950ee840587dbc","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The four-rebase cost depends on external unmerged lanes, while renaming the finite set of Buzz actor sites would remain functional and is mechanically countable within nine files."} +{"candidate_id":"v4-ac85b82316ac5980","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The durability and stall rationale is external to the guard, but queueing contradicts the explicit concurrent-turn refusal test and its behavior is deterministically testable in five bounded files."} +{"candidate_id":"v4-b4647e5b48ad0f67","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The refresh path and tests make it apparent that skipping the probe admits runs after live exhaustion, which is a directly testable functional defect in a bounded capacity slice."} +{"candidate_id":"v4-b48724ec04025b41","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Legitimate in-repository uses make an outright word ban visibly overbroad and unable to pass the existing terminology check unchanged, while the verifier rules are concrete and bounded."} +{"candidate_id":"v4-bd395d87b2865263","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ignored generated JUnit path makes the rationale visible, while tracking the artifact would not break functional tests and is decidable by file presence within a trivial scope."} +{"candidate_id":"v4-c25228afc16748b3","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The handoff itself documents why local green is insufficient, and merging four external lanes could evade local tests but cannot be deterministically inferred from the final state of this lone document."} +{"candidate_id":"v4-c8feb84e83c19266","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The runbook explicitly explains staged registration, while a one-step instruction could pass document checks yet is detectable from its concrete command ordering in one file."} +{"candidate_id":"v4-cb7c81aa3e7a1d8c","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Why label-derived contact becomes wrong for a future reused code is not inherent in the current branches, and such a mapping can pass present behavior tests but leaves a checkable replacement for the boundary flag in two files."} +{"candidate_id":"v4-cf7752a9fa65978e","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Current staleness re-evaluation and recovery tests expose that ordering cannot refresh a stale SURVIVAL verdict, so the wrong path is a deterministic functional failure within a bounded slice."} +{"candidate_id":"v4-d3094729cb02a074","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The need to distinguish repeated attempts after an unknown outcome is not evident before receipts exist, while an update-derived id can pass present tests and is deterministically distinguishable in four files."} +{"candidate_id":"v4-d3c77723a8e09894","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The future divergence risk of a duplicate conversation column is not implied by current lookup behavior, while denormalization would work today and leaves an exact schema trace in two files."} +{"candidate_id":"v4-d61d9c73e11754bc","reviewer":"reviewer-2","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The exhaustive sentence test and explicit STALE mapping make the special handling visible and make fallback reuse a directly detectable functional messaging failure in a bounded slice."} +{"candidate_id":"v4-db58634970ebbdf7","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ordinary ingress flow does not reveal that a replayed CEO turn irreversibly contaminates future context, yet replay-and-deduplicate can pass routine tests and is detectably reintroduced if TURN_CLAIMED messages become recoverable."} +{"candidate_id":"v4-ded1bcf6f444c76d","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The five-minute precedent and provider-probe cost are historical judgment rather than self-evident code facts, while probing every dispatch remains functional and can be detected from the dispatch refresh condition within the bounded change area."} +{"candidate_id":"v4-e5b4843efae58483","reviewer":"reviewer-2","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The CI umask mismatch is not evident from the fixtures alone, while weakening the 0600 guard would make routine tests pass and can be deterministically caught by asserting that permissive state files remain rejected in this small test scope."} +{"candidate_id":"v4-122f5e996ed8f300","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The insert-only store already exposes correction lineage and UPDATE/DELETE-rejecting immutability, while a mutation would leave a checkable SQL trace."} +{"candidate_id":"v4-1f1cba75144b609f","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A daily cap on automatic actions would still work functionally, but the policy and behavior-pattern rationale is external to the code and a quota would be a checkable configuration or action path."} +{"candidate_id":"v4-2115a033e1fb37d0","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The missing .json allow-list entry makes the exact live scanning gap evident, but whether prose is an impermissible hedge is a human wording judgment."} +{"candidate_id":"v4-2493fd41b194d8f4","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The prompt-field bleed was established experimentally rather than by code inspection, and reintroducing the quoted warning marker leaves a concrete prompt literal to detect."} +{"candidate_id":"v4-4042654555ac20e4","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"LLM ordering would still produce a usable queue, but its missing backtest is not inferable from the sort code and grade-based sort keys are statically checkable."} +{"candidate_id":"v4-468e579f86e22f91","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Injected 403 fixtures can pass normal tests, while final repository files alone cannot prove that the required response came from a real GitHub request."} +{"candidate_id":"v4-545d1c9c0d2b969e","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Collapsing absence of evidence into a blocking state can still function, but the distinct reviewer actions are domain judgment and the enum and mapping are concrete checks."} +{"candidate_id":"v4-572e09dba076a5a3","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Calling the ranking quality or undervaluation would not break functionality, but the absent outcome baseline is external evidence and the prohibited framing is semantic prose."} +{"candidate_id":"v4-5f0d8829fcc6f198","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The handoff plainly centers the lone live issue, while retaining closed items remains usable documentation whose clutter effect is not a fixed trace."} +{"candidate_id":"v4-6aed03472a14ffc6","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Separating a correction from independently evidenced fixes is historical commit-scope judgment, so a combined passing fix cannot be identified from the final files alone."} +{"candidate_id":"v4-6d2eec862ac0f22c","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The decision to defer three upstream screening fixes to separately reviewed issues is process context rather than a property of their eventual final code."} +{"candidate_id":"v4-79e5fcfd3fd49649","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ADR records the measured PyPI conflict, and selecting the literal alternative name would leave a parseable accepted-name value."} +{"candidate_id":"v4-7b84423ed8fa9f34","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The ticket explicitly discloses its retrospective provenance, but whether prose falsely claims to have guided implementation requires historical human judgment."} +{"candidate_id":"v4-81773950b2e67c02","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ADR expressly gives the evidence-granularity rationale for four states, while any additional declared status is mechanically countable."} +{"candidate_id":"v4-81aa6660ab83f1dc","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The prior cross-repository handoff's maintenance failure is historical context, and whether one document substantively covers two repositories is semantic rather than mechanically decidable."} +{"candidate_id":"v4-8e59d287bd2f9248","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The source comments state why priority filenames stay separate from broad extensions, which could still function but would leave concrete extension-list entries."} +{"candidate_id":"v4-9387c3b68473bda9","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Keeping the old project name would not alter behavior, while the early-renaming rationale is historical and a forbidden `gradelore` name is directly searchable."} +{"candidate_id":"v4-9f9eb817a08ae4c9","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A local transaction wrapper could satisfy normal happy-path tests, but it cannot make GitHub calls atomic and would add a concrete transaction boundary to the review flow."} +{"candidate_id":"v4-a2dbaee9c683ea83","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The owner's naming choice is not derivable from implementation behavior, whereas a `repotriage` project name is a concrete text-level trace in a one-document task."} +{"candidate_id":"v4-a5b9e9e48752467e","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The collection code visibly appends candidates while `ArtifactFiles` freezes them at the artifact boundary, so rebuilding tuples per candidate could work but its placement is statically checkable."} +{"candidate_id":"v4-a7b04c5208e493e4","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The three-feature weight set does not reveal the backtest that excluded the PRD remainder, while adding those components would be visible in `Feature` and `WEIGHTS`."} +{"candidate_id":"v4-a9ec5cd512c7c2c7","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Filtering withheld entries would still render a usable ranking but hide screener failure, and fixture output can deterministically assert that withheld rows remain present."} +{"candidate_id":"v4-b3568fcfe78e5aab","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The validator test explicitly uses a `skipif` with a reporting reason, so a quiet pass would preserve ordinary behavior but is checkable by running without the validator."} +{"candidate_id":"v4-c38d520fe83cb7d5","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"`undo(client, performed)` and its docstring explicitly make reversal approval-free; adding an approval parameter could function but would leave a signature-level trace."} +{"candidate_id":"v4-c8e57b42ac2635de","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The status implementation visibly distinguishes insufficient evidence from clean review status, while a renamed boolean would still function but conflate those cases."} +{"candidate_id":"v4-e25462e19110c9eb","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The response classifier and 403 fixtures explicitly distinguish exhausted quota from authorization, so status-only handling loses a tested operator remedy."} +{"candidate_id":"v4-e82c306ec9e425b2","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Whether a product name promises unwarranted trust is not inferable from implementation behavior, but reintroducing repotrust is an exact, checkable name value."} +{"candidate_id":"v4-f4404e6e27e534e5","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"ranked documents and implements retaining ungraded entries after scored ones, so filtering them would work as a ranking but leave a directly testable omission."} +{"candidate_id":"v4-f75d4b634c14b66c","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Reviewed.score and its tests explicitly require None rather than a numeric sentinel, whose reintroduction leaves a concrete type and literal-value trace."} +{"candidate_id":"v4-002ffd1e428c572a","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The dynamic ticket-owned-path census makes the avoided per-ticket list maintenance and its separate focused-lane protection non-obvious, while a literal path list is mechanically detectable."} +{"candidate_id":"v4-0f8cd38c8ba43cfe","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The resolver's completion-effect check requires introduced paths from each commit and tests the reverted-completion false green, so omitting that fetch is a functional regression with an inspectable missing call."} +{"candidate_id":"v4-12b0486cd77dd3a9","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The issuance evaluator and isolation tests explicitly keep scored-factor coverage separate from all observed opportunities, so scored-only opportunities are a deterministically detectable contract bug."} +{"candidate_id":"v4-14a911a7f4c96afb","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The current source documents that the former frozen-matrix assertion never exercised subsets, so retaining that concrete obsolete test beside the direct case would still pass behavior tests."} +{"candidate_id":"v4-575de52ba54d6758","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The page loop and exact-total validation expose the reason, while a single 100-item request demonstrably loses results at the next ordinary page boundary."} +{"candidate_id":"v4-843485d931913281","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The projection and its canary explicitly prove required groups cannot be unavailable, so restoring the now-dead filtering operation changes no behavior and is source-detectable."} +{"candidate_id":"v4-88299d9c1503bc7b","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The completion-effect tests compare introduced paths against the live tree, making message-only revert detection visibly too narrow and statically identifiable."} +{"candidate_id":"v4-8f24735524874167","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The checked-in ticket explicitly grants fixtures/doctor/*.json, while embedding reports would preserve report behavior but leaves a mechanically checkable location and duplication trace."} +{"candidate_id":"v4-915f4e606299276c","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The artifacts explicitly keep M19 as F6 presentation and safety-only while scoring F6 from M20, so reconciliation changes frozen functional fields that an oracle can compare."} +{"candidate_id":"v4-975a69717305d00f","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The clamp test states that valid vectors never leave the interval and uses an out-of-range raw value, whereas a normal fixture would stay green without testing the clamp and is mechanically distinguishable."} +{"candidate_id":"v4-ad1efe720ca11f3c","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The simulator documents the analytic median versus sampled p90 and the valid-pack tests require median_minutes <= 40, so seeded empirical p50 is both detectable and test-failing."} +{"candidate_id":"v4-c61d7c943edd8cff","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Exact lane totals leave the historical two-case slack rationale unstated, while a floor comparison would still pass after coverage-removing test deletions and is mechanically identifiable."} +{"candidate_id":"v4-cc76268ad4bb9a3e","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The corrected 13-to-14 census is a checkable literal, but the hard-stop reason is not evident from the ticket and stale figures make its stated RED contract fail."} +{"candidate_id":"v4-ce2adee3c134ab03","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The literal count-and-path census makes the growth admitted by a wildcard apparent, and restoring wildcard regexes would leave a concrete trace while ordinary tests can still pass."} +{"candidate_id":"v4-e2c33042f79e2776","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The validator visibly derives gates from observations and unconditionally compares issuability, so shape-only trust is a testable forged-verdict bug."} +{"candidate_id":"v4-e3aa102492b031b1","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Whether the six removed guards were unreachable or mutation-proof is historical sweep evidence, so redundant guards can preserve behavior without a uniquely decidable final-state signature."} +{"candidate_id":"v4-218954b5ef6d08d7","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The legacy array branch visibly supplies coverage state, and restoring its complete-project claim is a bounded fail-open caught by a deterministic payload test."} +{"candidate_id":"v4-29c6beda0309a747","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The model comments distinguish unread sends from an observed empty list, while an empty-array default remains functionally plausible and has a concrete serialized-state trace."} +{"candidate_id":"v4-304262d2dae79858","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The ticket directly explains that late-assigned stem names break the known-path dry run, making the alternative a plan-semantics defect without a single deterministic revival trace."} +{"candidate_id":"v4-5a1a7e7a347c6cc0","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The locale-policy comments and monitoring-first fixture expose the collision, and a bare input matcher selects the wrong control."} +{"candidate_id":"v4-632dec3f10f1e65b","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The timeout branches visibly record panel and button observations, while retaining the unsupported file-selection claim leaves normal import behavior intact and is a literal trace."} +{"candidate_id":"v4-710b1008c427461f","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The distinct strict accessor and ordinal-write guard make the read-versus-write boundary visible, while globally tightening enumeration can pass complete-tree behavior and is statically detectable."} +{"candidate_id":"v4-748bedfbbe5fe417","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ticket directly records that typed paths dismiss the panel without output, and a keystroke-based destination flow is a concrete, functionally failing trace."} +{"candidate_id":"v4-959435801c3ef505","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The ticket explicitly requires waiting for progress-window disappearance, so treating the click as completion is a directly testable export-completion bug."} +{"candidate_id":"v4-f0ea9a2a5b68115b","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The retired unreachable-route history is not derivable from the mechanism, while an implemented drive lacking an export-run route is concretely checkable."} +{"candidate_id":"v4-fd7263067698db44","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The meaning of missing AXModal requires external accessibility semantics, and mapping the named statuses to clean absence is a concrete regression caught by the modal tests."} +{"candidate_id":"v4-120b48f40e73f330","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":false,"note":"Finishing unspecified P0 work can yield valid code, but the session-context loss and sequencing choice leave no final-state oracle and span an open-ended closeout."} +{"candidate_id":"v4-4001fa0211128649","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The explicit UNKNOWN branch and doctor guard expose that no consumer should mint EXHAUSTED from unread buckets, while doctor-only filtering remains behaviorally viable and structurally detectable."} +{"candidate_id":"v4-431dceed9013cb2b","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The durable-consumption code explicitly distinguishes 24-hour replay-cache admission from retained authorization, while a longer TTL is a concrete viable lifecycle change in bounded scope."} +{"candidate_id":"v4-45caf6be5b46889d","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The schema reconciliation test visibly explains why documentation alone is insufficient, while an existing trigger can remain unlisted without changing ordinary behavior and that omission is mechanically detectable."} +{"candidate_id":"v4-6fa12e79e96b6cc1","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The paired test comments explicitly describe the complementary static and behavioral blind spots, so removing the text assertion can leave normal behavior green but has an exact bounded trace."} +{"candidate_id":"v4-77018bc628e62482","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The daemon-owned GitHub App path and creator-provenance checks make the protected merge authorization requirement explicit, and forbidden credential or check validation paths are concrete and bounded."} +{"candidate_id":"v4-a0bf288e0dd97d24","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"The timeout-message code and unit test directly state that no resend-hold gate exists, while unsupported wording is behaviorally inert and its semantic equivalents lack a stable programmatic oracle."} +{"candidate_id":"v4-a6950ee840587dbc","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The terminology verifier explicitly records the 20-hit staged baseline and four-rebase rationale, while an early bulk rename remains behaviorally viable and mechanically countable."} +{"candidate_id":"v4-ac85b82316ac5980","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The in-flight guard directly explains why queueing violates the stall and durability constraints, while a queue remains distinguishable from immediate BUSY refusal in a five-file task."} +{"candidate_id":"v4-bd395d87b2865263","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Keeping the generated JUnit XML would still serve CI, but its tracked path and ignore rule make that choice mechanically detectable while merge-conflict pressure is not apparent from code."} +{"candidate_id":"v4-c8feb84e83c19266","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Requiring the gate early works while the daemon is healthy, but the self-repair merge deadlock is an operational contingency and a staged versus simultaneous rollout has no unique final-file trace."} +{"candidate_id":"v4-cb7c81aa3e7a1d8c","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Reason-code inference can agree with every current refusal and pass routine tests, yet it is detectably the wrong boundary when contact is derived from a reason instead of the executor's typed contact fact."} +{"candidate_id":"v4-cf7752a9fa65978e","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":false,"g7_bounded_task_feasible":true,"note":"Changing observation order does not refresh the stale SURVIVAL verdict after provider recovery, so the ordinary recovery-dispatch behavior would still fail and the alternative is not a uniquely recognizable final-state pattern."} +{"candidate_id":"v4-d3094729cb02a074","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"A deterministic update-derived id can appear to work, but distinct attempts for the same update require distinct stored ids, which gives an executable oracle for the rejected derivation."} +{"candidate_id":"v4-d3c77723a8e09894","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The existing session digest already represents the conversation identity, so a second conversation-id column is visibly duplicative, functionally workable, and checkable as a concrete stored field."} +{"candidate_id":"v4-db58634970ebbdf7","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":false,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Re-running a claimed handler duplicates an irreversible CEO-conversation write, which ordinary recovery tests can observe, and a recovery-path handler call after a claim is a concrete trace of the wrong design."} +{"candidate_id":"v4-ded1bcf6f444c76d","reviewer":"reviewer-3","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"Refreshing on every dispatch preserves correctness but adds an unnecessary provider probe, and an unconditional refresh in dispatch rather than the five-minute boundary is mechanically checkable."} +{"candidate_id":"v4-e5b4843efae58483","reviewer":"reviewer-3","g3_reason_hidden_from_code":false,"g4_wrong_path_functionally_viable":true,"g5_oracle_deterministic":true,"g7_bounded_task_feasible":true,"note":"The fixture documents that production correctly rejects umask-derived 0644 files, while weakening that concrete 0600 permission gate could make normal tests pass and is deterministically detectable with a permissive-mode rejection check in this two-file repair."} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/robustness-diff-arm.json b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/robustness-diff-arm.json new file mode 100644 index 00000000..26dee52f --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/robustness-diff-arm.json @@ -0,0 +1,503 @@ +{ + "schema_version": 1, + "study_id": "cdeb-fresh-v4", + "deviation_id": "CDEB-V4-G2-DIFF-ROBUSTNESS-ARM", + "question": "Does showing the reviewer the commit's diff, as well as its message, recover the rejected alternative that the message alone did not?", + "sample": { + "size": 60, + "per_repository": 15, + "selection": "the first 15 candidates by candidate_id within each repository; candidate_id derives from the decision audit anchor, so the order is independent of content, date and author" + }, + "result": { + "paired": 60, + "both_found_a_rejection": 55, + "diff_arm_pass": 8, + "primary_arm_pass": 6, + "diff_arm_rate": 0.133, + "primary_arm_rate": 0.1 + }, + "reading": "Adding the diff moves the pass rate by three points on the same candidates. The narrow packet is not why G2 fails; the rejected alternative is not written outside the record.", + "status": "robustness only; this arm does not feed the Stage 0 verdict", + "rows": [ + { + "candidate_id": "v4-002ffd1e428c572a", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.333, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-00b9b5b83c4ddf87", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.5, + "diff_arm_pass": true, + "primary_arm_pass": true + }, + { + "candidate_id": "v4-00efc0041ed3118a", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.2, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-02764fbf10ceedc1", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.25, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-03dd551058ce7aaf", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-04c1de5e41d66868", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-09c4183e165a4da4", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-0bc581744204a282", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.25, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-0d2959b1d2bbcec0", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-0d7c38f6a60e8b36", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.5, + "diff_arm_pass": true, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-0e840c8816f442f7", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": true + }, + { + "candidate_id": "v4-0ef57b3438b7d16b", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.5, + "diff_arm_pass": true, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-0ef8cafdf0d11499", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.667, + "diff_arm_pass": true, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-0f4dfe2618796b54", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-0f8cd38c8ba43cfe", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-120b48f40e73f330", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-122f5e996ed8f300", + "repository_id": "gitseed", + "both_found_a_rejection": false, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-129a3640dab8b53d", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-12b0486cd77dd3a9", + "repository_id": "agent-operator-score", + "both_found_a_rejection": false, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-132048855f4d7a5d", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.143, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-14a911a7f4c96afb", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.286, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-163c7d58d0692423", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-1a18ceae8a4645cf", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-1a5dea10137de7da", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-1bc2a34840360fd0", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.143, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-1f1cba75144b609f", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-2115a033e1fb37d0", + "repository_id": "gitseed", + "both_found_a_rejection": false, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-218954b5ef6d08d7", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.25, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-23ba99c6da04e46f", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-23f26b69f816664d", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-2493fd41b194d8f4", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.167, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-25eb689fdb9ad98b", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-2616d7ae1c85fea4", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-261cdc76929d85cc", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-2714c211175c4737", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.4, + "diff_arm_pass": true, + "primary_arm_pass": true + }, + { + "candidate_id": "v4-2756fbb39f4afc15", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-277e883c8a9d3eec", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.4, + "diff_arm_pass": true, + "primary_arm_pass": true + }, + { + "candidate_id": "v4-2853e493f4781414", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-29c6beda0309a747", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-29c79faa31cc4fe2", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-2aee6afaad42b119", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-2c70b58d7ce1117a", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.75, + "diff_arm_pass": true, + "primary_arm_pass": true + }, + { + "candidate_id": "v4-2cadeedf7d7f2251", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-304262d2dae79858", + "repository_id": "logic-pro-mcp", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.2, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-30517866b1626071", + "repository_id": "gitseed", + "both_found_a_rejection": false, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-31ea939e4478ded3", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-32281c33a0cd1d51", + "repository_id": "agent-operator-score", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-3258ac6e08349a04", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-377f04276465b59d", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-3ba6d8b1fa31e10f", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.333, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-4001fa0211128649", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-4042654555ac20e4", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.7, + "diff_arm_pass": true, + "primary_arm_pass": true + }, + { + "candidate_id": "v4-431dceed9013cb2b", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-45caf6be5b46889d", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-468e579f86e22f91", + "repository_id": "gitseed", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-50d2354c5c9210d1", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-56a540b834736c43", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-5b3c19da588ec1d0", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.25, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-6ace14eeff8e0235", + "repository_id": "agent-control-plane", + "both_found_a_rejection": true, + "quote_overlap_with_diff": 0.286, + "diff_arm_pass": false, + "primary_arm_pass": false + }, + { + "candidate_id": "v4-6fa12e79e96b6cc1", + "repository_id": "agent-control-plane", + "both_found_a_rejection": false, + "quote_overlap_with_diff": 0, + "diff_arm_pass": false, + "primary_arm_pass": false + } + ] +} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/feasibility/rulings.jsonl b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/rulings.jsonl new file mode 100644 index 00000000..02744444 --- /dev/null +++ b/bench/cdeb/studies/cdeb-fresh-v4/feasibility/rulings.jsonl @@ -0,0 +1,241 @@ +{"candidate_id":"v4-badec4c4ee9efb2a","repository_id":"gitseed","ruling":"leaving the order and noting it in the release PR","reason":"the file outlives the PR"} +{"candidate_id":"v4-c08dac879bbde6a4","repository_id":"gitseed","ruling":"re-pinning the rewritten section to today's commit or date","reason":"that is the exact staleness failure mode being fixed; per-item citations age individually instead of the whole section aging together"} +{"candidate_id":"v4-3258ac6e08349a04","repository_id":"gitseed","ruling":"also bumping __version__ in gitseed/__init__.py","reason":"this task's forbidden scope excludes gitseed/ (source); the prior 0.2.0 release bumped both files in one commit (7d52ec1) but this branch's remit does not extend there"} +{"candidate_id":"v4-5f0d8829fcc6f198","repository_id":"gitseed","ruling":"leaving the closed issues listed with a note","reason":"a handoff is read for what to do next, and three closed items ahead of the one live item buries it"} +{"candidate_id":"v4-2616d7ae1c85fea4","repository_id":"gitseed","ruling":"low-star, creation-date, or multi-bucket targeting","reason":"their thresholds and merge rules would add policy choices without a visible outcome to tune against"} +{"candidate_id":"v4-572e09dba076a5a3","repository_id":"gitseed","ruling":"describing the ranking as quality, growth, or undervaluation","reason":"the current activity signal has no expected-attention baseline or outcome data"} +{"candidate_id":"v4-77e1745655a235ce","repository_id":"gitseed","ruling":"a separate evidence-kind allowlist","reason":"a literal detached from the producer methods can silently accept evidence no collector emits"} +{"candidate_id":"v4-d56e88f5ef1b62cb","repository_id":"gitseed","ruling":"rewriting the whole document","reason":"its structure held up across a day of heavy change, and the parts that went stale were the counts and the issue list, which is what a handoff is expected to lose first"} +{"candidate_id":"v4-df6bfd03300910e2","repository_id":"gitseed","ruling":"a pack digest without embedded definitions","reason":"a digest detects change but cannot re-derive a past categorization from its artifact alone"} +{"candidate_id":"v4-7c0b5ea14295d54c","repository_id":"gitseed","ruling":"a session-wide Undo value","reason":"a mixed star and follow session contains actions with different irreversible effects"} +{"candidate_id":"v4-849425816b8050cc","repository_id":"gitseed","ruling":"storing the complete bulk listing in every target trailer","reason":"a 1,000-target approval repeated the same 1,000-row snapshot 1,000 times"} +{"candidate_id":"v4-81aa6660ab83f1dc","repository_id":"gitseed","ruling":"a single handoff covering both repositories","reason":"the previous one did that and each repository's reader had to filter out the other's context, which is how it went unmaintained"} +{"candidate_id":"v4-a2ad4b77ea6a9a3b","repository_id":"gitseed","ruling":"dividing the activity score by current stars","reason":"a popularity denominator is not an expected-attention baseline or a validated growth signal"} +{"candidate_id":"v4-b6075c378778faff","repository_id":"gitseed","ruling":"adding a growth or momentum signal","reason":"issue #63 owns new signals; this change only preserves observations"} +{"candidate_id":"v4-30517866b1626071","repository_id":"gitseed","ruling":"silently dropping an observation write failure","reason":"a history gap needs an explicit warning when the run completes"} +{"candidate_id":"v4-f65ddc0c062c4a33","repository_id":"gitseed","ruling":"storing star deltas","reason":"raw timestamp and count observations remain correct as later rows arrive"} +{"candidate_id":"v4-122f5e996ed8f300","repository_id":"gitseed","ruling":"updating or deleting a prior run to correct it","reason":"corrections remain new immutable rows linked by corrects_run_id"} +{"candidate_id":"v4-6a3b0b51071ec292","repository_id":"gitseed","ruling":"embedding prior engine code in an artifact to reproduce old behavior","reason":"stored port responses can be recomputed, but they cannot supply the prior pipeline implementation"} +{"candidate_id":"v4-e25462e19110c9eb","repository_id":"gitseed","ruling":"treating every metadata 403 as forbidden","reason":"a quota-exhausted 403 needs the rate-limit remedy, which that status-only check discarded"} +{"candidate_id":"v4-8ab61d73c22d675b","repository_id":"gitseed","ruling":"falling back to a zero or midpoint grade when the model misbehaves","reason":"the number would rank a repository on evidence that does not exist, and nothing downstream could tell it from a real grade"} +{"candidate_id":"v4-00efc0041ed3118a","repository_id":"gitseed","ruling":"keeping one accessor and capping inside it","reason":"it cannot distinguish an observation from a policy, and the version that tried recorded a reset time the server never stated"} +{"candidate_id":"v4-9c974f0a8436c03e","repository_id":"gitseed","ruling":"refusing a run whose search was truncated","reason":"that is a product decision outside this ticket, and a silent behaviour change smuggled in with an observability fix is harder to find than the missing field was"} +{"candidate_id":"v4-9cc0a659cfa12205","repository_id":"gitseed","ruling":"keeping a boolean and adding a separate coverage flag","reason":"callers would keep branching on the boolean and the flag would be advisory, which is how the old docstring's promise went unkept"} +{"candidate_id":"v4-9f9eb817a08ae4c9","repository_id":"gitseed","ruling":"wrapping the actions in a transaction","reason":"GitHub has no rollback to enroll in, and an interface promising atomicity over calls that cannot provide it would hide exactly the partial states this records"} +{"candidate_id":"v4-a5b9e9e48752467e","repository_id":"gitseed","ruling":"converting CollectResult.candidates to a tuple at its own definition","reason":"the pipeline mutates it while collecting, and freezing there would force a rebuild per candidate"} +{"candidate_id":"v4-8e59d287bd2f9248","repository_id":"gitseed","ruling":"broadening SOURCE_EXTENSIONS with .json/.yaml/.lock/.toml entries instead of a separate priority-filename list","reason":"would let arbitrary non-manifest data files compete for the same 20-file/500KB budget as real source, not just the handful of build-time inputs a supply-chain attack targets"} +{"candidate_id":"v4-ea459217291aa8a3","repository_id":"gitseed","ruling":"applying the 20-file count cap to priority filenames too","reason":"the issue asks for priority selection before the count budget, not merely early within it; capping them would leave the padding attack this fixes unfixed"} +{"candidate_id":"v4-a9edac0b4d0f80a8","repository_id":"gitseed","ruling":"implementing GS-P0-006's RecommendationStatus enum (BLOCKED/INSUFFICIENT_EVIDENCE/REVIEW/NOT_PRIORITY, ADR-0010) in this change","reason":"that ADR scopes the enum to GS-P0-006, only cross-referenced (not required) from #48's own issue text; this change lands the SourceCoverage.complete_for_policy signal the ADR says it depends on, and stops there"} +{"candidate_id":"v4-c27e59f236ed7496","repository_id":"gitseed","ruling":"sorting all eligible non-priority files by a general risk heuristic ahead of the count cap","reason":"that is GS-P1-018 (#49)'s explicit scope; this change only exempts the named priority-filename allow-list, tree order is unchanged for everything else"} +{"candidate_id":"v4-7c3c09fcebd01801","repository_id":"gitseed","ruling":"complete_for_policy/complete_for_repository as constructor-supplied booleans, as the issue's own illustrative dataclass sketches them","reason":"computed properties derived from the counts they describe cannot drift out of sync with them"} +{"candidate_id":"v4-2115a033e1fb37d0","repository_id":"gitseed","ruling":"softening this to \"may not scan all files\"","reason":"GS-P0-001 confirmed by grep -c: SOURCE_EXTENSIONS has zero .json entries. Say what does and does not get scanned, not a hedge"} +{"candidate_id":"v4-aec71c78e9675ad3","repository_id":"gitseed","ruling":"gate only the README/marketing claim, build the roadmap as designed","reason":"a shipped share card or search-ordering bias embeds the claim in its default behavior regardless of what the README says; gating only the words leaves the unlicensed claim shipped in the product"} +{"candidate_id":"v4-c8e57b42ac2635de","repository_id":"gitseed","ruling":"a rename only (recommended -> reviewable/not_blocked)","reason":"fixes the overclaiming problem but leaves a zero-coverage candidate indistinguishable from a fully-scanned clean one under any two-valued type"} +{"candidate_id":"v4-545d1c9c0d2b969e","repository_id":"gitseed","ruling":"three states, folding INSUFFICIENT_EVIDENCE into BLOCKED","reason":"\"found a malicious pattern\" and \"couldn't examine enough to have an opinion\" call for different reviewer actions and must not share one status"} +{"candidate_id":"v4-81773950b2e67c02","repository_id":"gitseed","ruling":"more than four states today","reason":"no failure in this review turns on distinguishing which evidence is missing at the status level; coverage detail (issue #48) already carries that at a finer grain"} +{"candidate_id":"v4-4042654555ac20e4","repository_id":"gitseed","ruling":"anchoring the approval queue on the LLM idea+skill score and reconciling radar to match","reason":"idea/skill have no backtest of their own; the deterministic score is what M0 measured and ADR-0007 licensed. Promoting the unvalidated number to the higher-stakes position -- it decides what gets proposed for external write -- inverts what the evidence supports"} +{"candidate_id":"v4-31ea939e4478ded3","repository_id":"gitseed","ruling":"fixing these gaps in this commit","reason":"this is a documentation correction; each finding is its own issue, reviewed and merged on its own evidence"} +{"candidate_id":"v4-0f4dfe2618796b54","repository_id":"gitseed","ruling":"fixing this gap in this commit","reason":"this is a documentation correction; the fix belongs to issue #50, reviewed and merged on its own evidence"} +{"candidate_id":"v4-6d2eec862ac0f22c","repository_id":"gitseed","ruling":"fixing these gaps in this commit","reason":"this is a documentation correction; the fix belongs to issues #45, #48, #49, reviewed and merged on their own evidence"} +{"candidate_id":"v4-6aed03472a14ffc6","repository_id":"gitseed","ruling":"fixing these gaps in this commit","reason":"this is a documentation correction recording the finding; the fix belongs to issues #47 and #51, reviewed and merged on their own evidence"} +{"candidate_id":"v4-e60230e53cceff5a","repository_id":"gitseed","ruling":"git commit --allow-empty","reason":"it commits whatever else the working tree has staged, not only the decision record; --allow-empty waives the empty-commit refusal, it does not skip the index. commit-tree plus update-ref never read the index at all"} +{"candidate_id":"v4-bdf15182275d02b8","repository_id":"gitseed","ruling":"model-tag caching for the smoke result","reason":"no measured problem sits behind it; nothing in this project ships on an unmeasured performance argument (ADR-0007)"} +{"candidate_id":"v4-091571a7d13f7f36","repository_id":"gitseed","ruling":"dep dependency-safety signal","reason":"F11 established that a security claim resting only on model output is never a finding; a dependency-safety assertion is either a narrow deterministic lockfile fact, which is not what this PRD describes, or an inference F11's discipline forbids from becoming a finding. The PRD predates that discipline."} +{"candidate_id":"v4-e05f3639fb4909ba","repository_id":"gitseed","ruling":"RateLimitExhausted exception type","reason":"CollectResult already carries incompleteness explicitly (complete, stopped_because) and the run artifact records which port failed; a second way to say it invites drift between the two"} +{"candidate_id":"v4-b291655fbfd2003b","repository_id":"gitseed","ruling":"model-assigned categories","reason":"a model opinion cannot manufacture a category assignment"} +{"candidate_id":"v4-1d24e887944f0434","repository_id":"gitseed","ruling":"treating a missing model as a complete zero-grade run","reason":"it would make deterministic-only output indistinguishable from a verified run"} +{"candidate_id":"v4-48e8b1b021e6999b","repository_id":"gitseed","ruling":"model security findings","reason":"a model opinion cannot manufacture a security finding"} +{"candidate_id":"v4-48c6427556993157","repository_id":"gitseed","ruling":"a second export serializer","reason":"canonical RunArtifact already preserves schema and replay contract"} +{"candidate_id":"v4-1438614686129e44","repository_id":"gitseed","ruling":"JSON files on disk","reason":"SQLite keeps a single durable, constrained run history"} +{"candidate_id":"v4-ed878960135ff45a","repository_id":"gitseed","ruling":"storage replay as deserialization","reason":"replay must recompute output from recorded port responses"} +{"candidate_id":"v4-f901052615fa3aee","repository_id":"gitseed","ruling":"JSON files on disk","reason":"SQLite keeps each artifact atomically constrained with its correction lineage"} +{"candidate_id":"v4-84cd6d391ac2fa6d","repository_id":"gitseed","ruling":"normalized per-port tables","reason":"canonical artifact bytes already preserve the replay contract without duplicating serializers"} +{"candidate_id":"v4-7bdc1c42597e48a6","repository_id":"gitseed","ruling":"JSON files on disk","reason":"SQLite provides atomic constraints, version gating, and immutable correction lineage"} +{"candidate_id":"v4-dfafe1ae814a5dfe","repository_id":"gitseed","ruling":"dist/cli.js","reason":"requires development node_modules and is not the distributed artifact"} +{"candidate_id":"v4-93aa115431f06a91","repository_id":"gitseed","ruling":"external-write port","reason":"replay and backtest must remain unable to star or follow, while live writes still require Approval"} +{"candidate_id":"v4-c9391d155d7a3fd6","repository_id":"gitseed","ruling":"artifact persistence port","reason":"pathlib writes the one requested JSON file and no second storage shape exists"} +{"candidate_id":"v4-af8446560274248d","repository_id":"gitseed","ruling":"separate replay pipeline","reason":"replaying recorded responses through execute prevents live and offline behavior from drifting"} +{"candidate_id":"v4-3ae6c2555769891a","repository_id":"gitseed","ruling":"replacement model adapter","reason":"OllamaGrader already satisfies the domain GradeClient port"} +{"candidate_id":"v4-13d2137b8a6296ea","repository_id":"gitseed","ruling":"replacement GitHub file client","reason":"GitHubClient already owns capped source reads and CallableFileReader adapts it without duplication"} +{"candidate_id":"v4-59f1a2b56b710495","repository_id":"gitseed","ruling":"external-write port","reason":"writes remain reachable only through review actions that require Approval"} +{"candidate_id":"v4-f3c960a48273132c","repository_id":"gitseed","ruling":"scoring and screening ports","reason":"both are pure deterministic domain functions with no outside capability to supply"} +{"candidate_id":"v4-0ecd7426eebc1cab","repository_id":"gitseed","ruling":"artifact storage port","reason":"pathlib is the only current storage shape and replay does not need another"} +{"candidate_id":"v4-a7b04c5208e493e4","repository_id":"gitseed","ruling":"every PRD §14 scoring component except commit_cadence_30d, contributor_count, and has_license (the thirty-seven-component remainder across Quality, Momentum, Risk, Novelty, Awareness, Potential, bonuses, penalties, Relevance, and RadarRank)","reason":"M0 measured material contribution only for these three features, so building the remainder would discard the backtest"} +{"candidate_id":"v4-556562750dedffa7","repository_id":"gitseed","ruling":"designing issue #8's scoring port before issue #12 defines its contents","reason":"M0 reduced the real boundary from roughly forty components to three measured inputs"} +{"candidate_id":"v4-8d262bad0a14ca64","repository_id":"gitseed","ruling":"claiming live validation","reason":"the README must retain the recorded evidence boundary"} +{"candidate_id":"v4-3ebec50e1216f799","repository_id":"gitseed","ruling":"correcting the superseded Phase 0 decision","reason":"phase records must preserve the decision made before the policy finding"} +{"candidate_id":"v4-aeaeee659e7b653f","repository_id":"gitseed","ruling":"updating ticket requirements to match code","reason":"tickets are historical records and translation must preserve their original requirements"} +{"candidate_id":"v4-6d92a30ed95357d4","repository_id":"gitseed","ruling":"correcting outdated acceptance criteria","reason":"PRDs are historical records and translation must preserve their original requirements"} +{"candidate_id":"v4-dce89f8ad4b7064a","repository_id":"gitseed","ruling":"correcting current-record differences","reason":"ADRs preserve the decisions made at the time"} +{"candidate_id":"v4-0f5392e7e8d2cd63","repository_id":"gitseed","ruling":"Expose star predictions as a product feature","reason":"M0 is an evaluation, not a product decision"} +{"candidate_id":"v4-ed4039b8a411ee62","repository_id":"gitseed","ruling":"Add features to raise AUC","reason":"Interpretability of the 7 preregistered features comes first"} +{"candidate_id":"v4-1f24c7dbe202ecd8","repository_id":"gitseed","ruling":"Change the metric or sample after seeing results","reason":"Post-hoc selection to avoid null invalidates this experiment question"} +{"candidate_id":"v4-468e579f86e22f91","repository_id":"gitseed","ruling":"closing #6 from injected 403 fixtures","reason":"the ticket requires an actual GitHub response with quota remaining"} +{"candidate_id":"v4-63e1ec17f2bdadfe","repository_id":"gitseed","ruling":"combining --no-ff with the one-ticket/one-commit squash policy","reason":"--no-ff creates a merge commit instead of the required squash result"} +{"candidate_id":"v4-03dd551058ce7aaf","repository_id":"gitseed","ruling":"monkeypatching `isatty` or injecting a fake stream","reason":"it would test a different program than the one that ships, which is how this pair of projects has been burned repeatedly this week"} +{"candidate_id":"v4-b3568fcfe78e5aab","repository_id":"gitseed","ruling":"skipping quietly when the CommitLore validator is absent","reason":"a skip that reads as a pass is the defect this project keeps finding elsewhere. It reports the reason"} +{"candidate_id":"v4-e5a87ee0d8e99a1e","repository_id":"gitseed","ruling":"a benchmark section, adoption numbers, a comparison table","reason":"none could be sourced from a command, and the sibling project spent today withdrawing published numbers it could not prove"} +{"candidate_id":"v4-ada5ec890a36e5b2","repository_id":"gitseed","ruling":"claiming the factory's phase gate runs here","reason":"`phase-gate.py` lives in the operator's home directory and is in neither this checkout nor its history. The delegate noticed and cut the claim rather than writing something plausible"} +{"candidate_id":"v4-7b84423ed8fa9f34","repository_id":"gitseed","ruling":"writing F1 as the plan it would have been","reason":"it would read as though it guided the implementation, and nothing in the repository could contradict it"} +{"candidate_id":"v4-377f04276465b59d","repository_id":"gitseed","ruling":"adding coverage gates or a badge","reason":"one workflow that tells the truth is worth more than five nobody reads"} +{"candidate_id":"v4-66695090e5949ea6","repository_id":"gitseed","ruling":"a --non-interactive flag so this runs in CI","reason":"it would be switched on in CI, and a CI job that stars repositories is exactly the automation the AUP forbids. A non-interactive run without --dry-run exits 1, verified"} +{"candidate_id":"v4-a9ec5cd512c7c2c7","repository_id":"gitseed","ruling":"dropping withheld candidates from the table","reason":"a reviewer who sees only the gradeable ones cannot tell a quiet day from a broken screener"} +{"candidate_id":"v4-f75d4b634c14b66c","repository_id":"gitseed","ruling":"a numeric sentinel for \"not graded\"","reason":"-1 and 0 are both safe only while GradeResult enforces 1..10, and both stop being safe the moment that range opens downward — silently. A mutation swapping -1 for 0 survived the suite, which is what a sentinel chosen against a range looks like from the outside. `score` is now `int | None` and `ranked` states where None goes"} +{"candidate_id":"v4-f4404e6e27e534e5","repository_id":"gitseed","ruling":"dropping blocked or ungraded entries from the ranking","reason":"a reviewer who sees only the gradeable ones cannot tell a quiet day from a broken grader"} +{"candidate_id":"v4-cadfb63755c3f504","repository_id":"gitseed","ruling":"letting a grading failure end the run","reason":"it makes one flaky model call discard every candidate already screened"} +{"candidate_id":"v4-b9bba3d1416828fa","repository_id":"gitseed","ruling":"an `approved: bool` parameter","reason":"a boolean can be passed by a caller that never asked anybody, and the type system cannot tell the difference"} +{"candidate_id":"v4-c976dc2332d4adab","repository_id":"gitseed","ruling":"a --non-interactive flag for CI","reason":"it would be switched on in CI, and a CI that stars repositories is the automation the AUP forbids"} +{"candidate_id":"v4-c38d520fe83cb7d5","repository_id":"gitseed","ruling":"requiring approval to undo","reason":"the person who mis-clicked has to be able to take it back, and AUP constrains the direction that adds"} +{"candidate_id":"v4-8fc3d2ec14b1c078","repository_id":"gitseed","ruling":"retrying on a bare 403","reason":"half of them are permissions errors and no amount of waiting fixes those"} +{"candidate_id":"v4-d9887355b9eff3e9","repository_id":"gitseed","ruling":"returning an empty list on a rate limit","reason":"that is exactly the seed's silent truncation, one layer up"} +{"candidate_id":"v4-7078a162153bab38","repository_id":"gitseed","ruling":"reading X-RateLimit-Remaining case-sensitively","reason":"a proxy that lowercases headers would look like unlimited budget, and the mutation test for it breaks six cases"} +{"candidate_id":"v4-bef9b4e179c50fe8","repository_id":"gitseed","ruling":"trusting a model because it is installed","reason":"the seed's check, and it cannot distinguish a model that answers from one that answers correctly"} +{"candidate_id":"v4-2c70b58d7ce1117a","repository_id":"gitseed","ruling":"sampling the clean check once","reason":"the failure is probabilistic, and one sample turns a 64% failure into a 36% pass"} +{"candidate_id":"v4-2493fd41b194d8f4","repository_id":"gitseed","ruling":"putting the marker literal in gitseed's own prompt","reason":"measured cause of the field bleed; fields stay orthogonal and the marker is never quoted"} +{"candidate_id":"v4-7f42c3f1f7876679","repository_id":"gitseed","ruling":"a boolean verdict like the seed's `security_flag`","reason":"one bit cannot separate \"ships a payload\" from \"mentions an IP\", so acting on the strong case means accepting the weak one"} +{"candidate_id":"v4-d5b3514664089aef","repository_id":"gitseed","ruling":"flagging short base64 and hex","reason":"they are hashes, keys and test vectors; length is what distinguishes a checksum from a payload, and the clean corpus proves the threshold with a real sha256"} +{"candidate_id":"v4-9387c3b68473bda9","repository_id":"gitseed","ruling":"keeping `gradelore`","reason":"one commit in is the cheapest possible moment to change a name, which CommitLore demonstrated the expensive way"} +{"candidate_id":"v4-a2dbaee9c683ea83","repository_id":"gitseed","ruling":"`repotriage`","reason":"my proposal, and the metaphor fits better — triage means screening before acceptance, prioritising, and a human treating what comes out. Naming is the owner's decision"} +{"candidate_id":"v4-e82c306ec9e425b2","repository_id":"gitseed","ruling":"`repotrust`","reason":"promises the one thing this tool refuses to assert"} +{"candidate_id":"v4-79e5fcfd3fd49649","repository_id":"gitseed","ruling":"`touchstone`","reason":"best metaphor, PyPI taken (measured 200)"} +{"candidate_id":"v4-b0282a5d21a52335","repository_id":"gitseed","ruling":"무인 자동 스타·팔로우 유지","reason":"GitHub AUP \"rank abuse\" 위반이고 오너 계정 정지 위험이다. ToS 를 어기는 도구를 엔터프라이즈 레벨이라 부를 수 없다"} +{"candidate_id":"v4-1f1cba75144b609f","repository_id":"gitseed","ruling":"하루 N개로 제한해 탐지를 피하기","reason":"조문에 수량 기준이 없어 위반은 그대로고, ICSE 2026 StarScout 은 계정 행동 패턴으로 잡으므로 저volume 이 오히려 선명하다"} +{"candidate_id":"v4-4d2c072dffcb56ba","repository_id":"gitseed","ruling":"씨앗 코드 재사용","reason":"아이디어만 계승한다. 파이프라인 형태가 달라져 공유할 구조가 없고 씨앗에 라이선스도 없다"} +{"candidate_id":"v4-dc67b4d3b699b947","repository_id":"gitseed","ruling":"저장소 전체 clone 후 다이제스트","reason":"디스크·시간·악성코드 실행 위험을 내는데 API 메타데이터로 대부분의 신호를 얻는다"} +{"candidate_id":"v4-163c7d58d0692423","repository_id":"agent-operator-score","ruling":"leave census pins at 37","reason":"npm test then fails four planning cases and the ticket Verification forbids standing failures"} +{"candidate_id":"v4-b525ee2c84544b9e","repository_id":"agent-operator-score","ruling":"add a test script to packages/scorer/package.json to make the ticket's verbatim focused command run","reason":"the manifest is outside Exact ownership"} +{"candidate_id":"v4-ad1efe720ca11f3c","repository_id":"agent-operator-score","ruling":"take median_minutes as the empirical p50 of the seeded rows","reason":"it kills valid-pack, double-count and no-prescription on 0.87 standard errors of sampling noise against an exact analytic median of 40"} +{"candidate_id":"v4-82ae5492d09483d9","repository_id":"agent-operator-score","ruling":"leave census pins at 33","reason":"npm test fails and the ticket Verification forbids standing failures"} +{"candidate_id":"v4-8c7fdf80ae6c6f2e","repository_id":"agent-operator-score","ruling":"add a test script to packages/scorer/package.json to make the ticket's verbatim focused command run","reason":"the manifest is outside Exact ownership"} +{"candidate_id":"v4-a3705f2f819df548","repository_id":"agent-operator-score","ruling":"leave census pins at 27","reason":"npm test fails and the ticket Verification forbids standing failures"} +{"candidate_id":"v4-ece19dc4cef7c803","repository_id":"agent-operator-score","ruling":"leave census pins at 14","reason":"npm test fails and the ticket Verification forbids standing failures"} +{"candidate_id":"v4-cc76268ad4bb9a3e","repository_id":"agent-operator-score","ruling":"leaving the numbers and correcting them during the rebuild","reason":"RED would then fail differently from the ticket contract, which is a hard stop"} +{"candidate_id":"v4-3bde5fdd3fb4c13a","repository_id":"agent-operator-score","ruling":"amend #142 body","reason":"changes merged historical evidence"} +{"candidate_id":"v4-a2acb02e41d42051","repository_id":"agent-operator-score","ruling":"keep telling each implementation agent to disregard the recorded blocked state","reason":"the recorded state and the work would stay in disagreement, and no audit trail would show who approved what"} +{"candidate_id":"v4-00b9b5b83c4ddf87","repository_id":"agent-operator-score","ruling":"remove the trailing period from the six tickets instead","reason":"the pattern would stay unable to read ordinary prose and the next ticket written with a period would fail the same way"} +{"candidate_id":"v4-d47951eaaa562775","repository_id":"agent-operator-score","ruling":"treat an empty or unreadable catalog as a catalog with no records","reason":"write mode would then read it as instruction to empty every surface derived from it"} +{"candidate_id":"v4-5f6e3fcc52a2df1d","repository_id":"agent-operator-score","ruling":"repair a missing ticket contract or a duplicate declaration as ordinary drift","reason":"the catalog would then outrank the contract it is derived from, and an ambiguous contract would be approved as agreeing"} +{"candidate_id":"v4-14a911a7f4c96afb","repository_id":"agent-operator-score","ruling":"add a second case beside the ineffective inventory guard","reason":"the original proved a property of the frozen matrix rather than of the function, so leaving it in place would keep a test that looks like coverage and is not"} +{"candidate_id":"v4-8f24735524874167","repository_id":"agent-operator-score","ruling":"embed the canonical reports in specs/doctor-output.v0.json","reason":"the ticket grants fixtures/doctor/*.json, and sibling precedent does not override a path the ticket names"} +{"candidate_id":"v4-c20a082f262f21c8","repository_id":"agent-operator-score","ruling":"add a second hardcoded fixture directory beside fixtures/operational-state","reason":"the next ticket needs a third, and a derived rule costs the same once"} +{"candidate_id":"v4-04c1de5e41d66868","repository_id":"agent-operator-score","ruling":"keep the unreachable secondary sort key in reasonsOf","reason":"only two cells can reach UNAVAILABLE in v0 and they carry different reason codes, so the tiebreaker could not be reached and four mutants of it survived"} +{"candidate_id":"v4-843485d931913281","repository_id":"agent-operator-score","ruling":"keep the required-observed filter with a canary","reason":"it is dead by construction rather than constrained by a sibling, so deleting it is honest where the source-class survivor's canary is not"} +{"candidate_id":"v4-a0489f4a19bc3969","repository_id":"agent-operator-score","ruling":"let a refused report keep its derived exit code","reason":"exit codes are this ticket's minimum GREEN, and a caller cannot tell refusal from success if refusal exits zero"} +{"candidate_id":"v4-bed5fc386048e412","repository_id":"agent-operator-score","ruling":"remove operational-state-offline in the same edit","reason":"it is legitimately required once its workflow lands, and its absence is a sequencing fact rather than an error in the authority"} +{"candidate_id":"v4-50c24e701b7ba2ef","repository_id":"agent-operator-score","ruling":"raise the ceiling to just above today's 89.5s","reason":"the next few merges would breach it again and the failure reads as an outage rather than as growth"} +{"candidate_id":"v4-0f8cd38c8ba43cfe","repository_id":"agent-operator-score","ruling":"drop the per-completion commit fetch to save time","reason":"that is the evidence the completion-effect check exists to gather, and removing it restores the false green it was written to close"} +{"candidate_id":"v4-88299d9c1503bc7b","repository_id":"agent-operator-score","ruling":"detect revert pull requests by their commit message","reason":"a revert is only the commonest way an effect disappears, and matching prose would miss a plain deletion while claiming to cover it"} +{"candidate_id":"v4-5eb2760a3fa148f3","repository_id":"agent-operator-score","ruling":"derive the effect set from the ticket's declared ownership","reason":"that prose contains paths asserted to be absent, so the check would demand the existence of files the contract forbids"} +{"candidate_id":"v4-0bc581744204a282","repository_id":"agent-operator-score","ruling":"verify a wrapper attestation signature","reason":"the SSOT requires none, the signing key had no custody or rotation story, and freezing signatures over fixture content would have made every canonical session permanently unamendable"} +{"candidate_id":"v4-32281c33a0cd1d51","repository_id":"agent-operator-score","ruling":"treat actor \"wrapper\" as evidence","reason":"it is a string the record's author chose, so it shows only what the record says, and calling it attestation overstated what the contract can derive"} +{"candidate_id":"v4-23ba99c6da04e46f","repository_id":"agent-operator-score","ruling":"keep EVENT_ORDER_BROKEN as a shape-stage invariant","reason":"array order has no SSOT basis, and it masked a genuinely inverted bracket by failing all four gates instead of the one that was actually wrong"} +{"candidate_id":"v4-7362d21baaf5d618","repository_id":"agent-operator-score","ruling":"add the required-core check beside the existing derivable check","reason":"a complete core implies both indices derive, so the conjunction is unkillable and an unkillable guard is unreachable or duplicated"} +{"candidate_id":"v4-841244a354bd70c7","repository_id":"agent-operator-score","ruling":"pin display, status and issued alongside the worked example raw score","reason":"each follows from the raw score through guards that are already pinned, so the extra conjuncts swept as equivalent and were removed"} +{"candidate_id":"v4-60e3f694ae5ca2d5","repository_id":"agent-operator-score","ruling":"substitute zero for a NOT_OBSERVED outcome metric","reason":"6.2 excludes it from the denominator, and substituting zero converts absent evidence into operator failure, which is the one thing the metric contract forbids"} +{"candidate_id":"v4-e3aa102492b031b1","repository_id":"agent-operator-score","ruling":"keep six guards the mutation sweep could not kill","reason":"an unkillable guard is either unreachable or duplicated, so they were removed and overflow checking consolidated into one choke point that a mutant can actually break"} +{"candidate_id":"v4-915f4e606299276c","repository_id":"agent-operator-score","ruling":"reconcile the F6 membership difference across artifacts","reason":"there is nothing to reconcile: 4.3 groups M19 under F6 as a presentation label while 6.3 scores F6 as M20 alone, and M19 routes only to the safety gate in all three artifacts"} +{"candidate_id":"v4-ce2adee3c134ab03","repository_id":"agent-operator-score","ruling":"keep the wildcard census and rely on the focused-lane guard","reason":"the guard catches deletion only, and the review demonstrated growth passing 230/230 with an unreviewed product file present"} +{"candidate_id":"v4-c61d7c943edd8cff","repository_id":"agent-operator-score","ruling":"keep the lane counts as a floor","reason":"two cases of slack let whole test cases and five allowlists be removed without a failure"} +{"candidate_id":"v4-09c4183e165a4da4","repository_id":"agent-operator-score","ruling":"derive PRIMARY versus SECONDARY from the capture prose by keyword","reason":"the phrasing is not systematic enough to classify reliably, and a wrong derivation would be worse than a frozen table because it would look derived"} +{"candidate_id":"v4-002ffd1e428c572a","repository_id":"agent-operator-score","ruling":"pin the census ticket-owned path list literally","reason":"every remaining product ticket then needs a census edit, and the deletion it was meant to catch is already caught by the focused-lane count guard"} +{"candidate_id":"v4-2cadeedf7d7f2251","repository_id":"agent-operator-score","ruling":"treat human active time as unconditionally REQUIRED","reason":"it would enter the issuance contract's required event set and block issuance for runs that never exercised M18 or M20"} +{"candidate_id":"v4-8001a8835a9351e3","repository_id":"agent-operator-score","ruling":"default a derived cell with no proof to its declared status","reason":"SSOT 9.2 requires it to fall to UNAVAILABLE, and defaulting would let a runtime claim a capability it never demonstrated"} +{"candidate_id":"v4-e2c33042f79e2776","repository_id":"agent-operator-score","ruling":"trust the declared expected verdict and check only its shape","reason":"a frozen document could then declare a coverage-only candidate issuable and the contract would agree, which is the failure this ticket exists to prevent"} +{"candidate_id":"v4-12b0486cd77dd3a9","repository_id":"agent-operator-score","ruling":"derive factor opportunities from scored observations only","reason":"gate 4 and gate 5 would collapse into each other, since a factor with no scored metric would also have no opportunities, and neither could be tested in isolation"} +{"candidate_id":"v4-261cdc76929d85cc","repository_id":"agent-operator-score","ruling":"keep the census assertion as a wildcard","reason":"a review reproduced the loss: deleting both owned product files still passed, so the assertion constrained nothing"} +{"candidate_id":"v4-1bc2a34840360fd0","repository_id":"agent-operator-score","ruling":"trust the declared expected verdict and only check its shape","reason":"a frozen document could then declare a coverage-only candidate issuable and the contract would agree with it, which is the exact failure this ticket exists to prevent"} +{"candidate_id":"v4-3a462c35336b7325","repository_id":"agent-operator-score","ruling":"count INVALID observations toward pack eligibility","reason":"eligibility would rise on observations that produced no usable value, which inflates the denominator in the direction that favours issuance"} +{"candidate_id":"v4-f691593763c944c4","repository_id":"agent-operator-score","ruling":"keep pinning the census ticket-owned path list literally","reason":"every one of the remaining product tickets would need a census amendment, reintroducing the per-ticket bottleneck E0A-001 removed"} +{"candidate_id":"v4-575de52ba54d6758","repository_id":"agent-operator-score","ruling":"raise the single-page size to 100 without paging","reason":"moves the same cliff from 30 to 100 and fails closed again later, with no warning until it blocks the whole backlog"} +{"candidate_id":"v4-a3d2b14112b034a4","repository_id":"agent-operator-score","ruling":"drop the truncation rejection and accept the first page","reason":"silently loses completion receipts, which turns a merged ticket into an unverified one and is the failure mode the fail-closed rule exists to prevent"} +{"candidate_id":"v4-89d86d3677fb18ef","repository_id":"agent-operator-score","ruling":"filter the transient filename out of every cpSync call","reason":"treats the symptom at three call sites and leaves the next live-tree write to reintroduce it"} +{"candidate_id":"v4-4b7ef509f0403505","repository_id":"agent-operator-score","ruling":"compile TypeScript to JavaScript before testing so Node 20 can run it","reason":"adds a build step, a devDependency and an emitted-artifact surface to a workspace whose manifest is pinned to name, version and private"} +{"candidate_id":"v4-1a5dea10137de7da","repository_id":"agent-operator-score","ruling":"keep Node 20 and accept the .ts files being skipped there","reason":"that is exactly the vacuous-evidence failure the focused-lane guard exists to prevent"} +{"candidate_id":"v4-e7587b2b65750306","repository_id":"agent-operator-score","ruling":"pin every prose field by literal digest","reason":"freezing the full text duplicates the contract into the validator and makes any editorial fix a false failure, so only fields the contract derives or fixes numerically are pinned"} +{"candidate_id":"v4-f83f6dbc19155e50","repository_id":"agent-operator-score","ruling":"keep the invented {key,total} grader shape and amend the contract rows","reason":"the contract is the authority the ticket freezes, so the encoding is what was wrong"} +{"candidate_id":"v4-975a69717305d00f","repository_id":"agent-operator-score","ruling":"assert the clamp with a normal fixture","reason":"no valid vector leaves the unit interval, so the clamp is only reachable through a raw value that is itself refused"} +{"candidate_id":"v4-9b42b1951da730e1","repository_id":"agent-operator-score","ruling":"add the two paths to controlPlaneAllowlist","reason":"mislabels product code as control plane and drives control_plane_code_files up as a disguise for a growing product surface"} +{"candidate_id":"v4-e238e7785a6466b5","repository_id":"agent-operator-score","ruling":"validate caller-supplied M10 and M20 derived values against the frozen table","reason":"a well-formed but self-serving denominator still passes, so the caller still picks its own score"} +{"candidate_id":"v4-dd4a74ba2b628991","repository_id":"agent-operator-score","ruling":"hand-maintained product-code allowlist per ticket","reason":"each of the 60 remaining tickets would need a coordinated census amendment, and the list drifts from the tickets it mirrors"} +{"candidate_id":"v4-e0d8d11b190e4e26","repository_id":"agent-operator-score","ruling":"keeping resolveViewInputs as documentation and trusting callers","reason":"the first version did exactly that and the tests passed while the guarantee was absent"} +{"candidate_id":"v4-d4b46b8cf85b5425","repository_id":"agent-operator-score","ruling":"relaxing workflow-performs-no-write-token-action to allow POST generally","reason":"that would readmit issue and ref mutation, so the check counts mutations and pins the one permitted target instead"} +{"candidate_id":"v4-34aef026d81c2f6b","repository_id":"agent-operator-score","ruling":"filtering the roadmap and Board out of a broad input scan","reason":"an exclusion list silently readmits any projection added later, so the input set is declared positively and closed"} +{"candidate_id":"v4-c15e92a3b1a755d4","repository_id":"agent-operator-score","ruling":"adding a YAML parser to assert workflow shape","reason":"a runtime dependency is forbidden scope for this ticket, so the workflow assertions read the declared shape with anchored matches"} +{"candidate_id":"v4-cccd3e7fae599767","repository_id":"logic-pro-mcp","ruling":"raise the 3-second budget","reason":"timed at 0.75s to appear; the budget was never the failure and raising it would have shipped a fix for a cause that was not there"} +{"candidate_id":"v4-132048855f4d7a5d","repository_id":"logic-pro-mcp","ruling":"search the filename field shallowly, or exclude browser ancestors","reason":"both were driven against the live panel and both still counted zero"} +{"candidate_id":"v4-5a1a7e7a347c6cc0","repository_id":"logic-pro-mcp","ruling":"match the slot on the word 'input'","reason":"the Input Monitoring button on the same strip begins with it, and a bare-word match publishes that toggle as a signal source"} +{"candidate_id":"v4-710b1008c427461f","repository_id":"logic-pro-mcp","ruling":"make mixerChannelStrips itself strict","reason":"many read callers depend on best-effort enumeration, and turning a read into a refusal is a different change from stopping a write"} +{"candidate_id":"v4-2714c211175c4737","repository_id":"logic-pro-mcp","ruling":"assemble the ADR-008 graph type from this reader","reason":"it would carry display strings where the model wants bus numbers, and no send edges at all — the ADR surface without the ADR"} +{"candidate_id":"v4-29c6beda0309a747","repository_id":"logic-pro-mcp","ruling":"keep sends as a non-optional empty array","reason":"every strip then claims it has no sends, which is an absence published as a reading"} +{"candidate_id":"v4-f0ea9a2a5b68115b","repository_id":"logic-pro-mcp","ruling":"build T1 standalone and route it later","reason":"that is the routed-but-unreachable shape #587 and #592 retired eleven rows for"} +{"candidate_id":"v4-304262d2dae79858","repository_id":"logic-pro-mcp","ruling":"treat the file-naming difference as an implementation detail","reason":"it changes what the published dry run can promise"} +{"candidate_id":"v4-de1096e077fa22d6","repository_id":"logic-pro-mcp","ruling":"treat partial success as a new contract question","reason":"ProjectExportExecutor already runs Honest Contract per artifact and walks a list of them"} +{"candidate_id":"v4-748bedfbbe5fe417","repository_id":"logic-pro-mcp","ruling":"set the export destination by typing a path","reason":"measured twice, it dismisses the panel and writes nothing"} +{"candidate_id":"v4-959435801c3ef505","repository_id":"logic-pro-mcp","ruling":"treat the Export click returning as completion","reason":"the progress window is what says the run finished, by disappearing"} +{"candidate_id":"v4-632dec3f10f1e65b","repository_id":"logic-pro-mcp","ruling":"keep '(file not selected)' as the failure reason","reason":"the code never checks whether a file was selected; it infers it from the button, and states the inference as an observation"} +{"candidate_id":"v4-f51f8964286329bb","repository_id":"logic-pro-mcp","ruling":"delete the rows for mixer.set_send and automation.set_mode along with their arms","reason":"both operations work on other channels; removing the rows would cut the paths that carry them"} +{"candidate_id":"v4-d7d1121164366d9c","repository_id":"logic-pro-mcp","ruling":"decide the locale from defaults read","reason":"that reads back what the run itself wrote; the menu bar is what Logic actually did"} +{"candidate_id":"v4-2853e493f4781414","repository_id":"logic-pro-mcp","ruling":"hard-code the expected Korean labels here","reason":"it would prove this file agrees with Logic, not that the product's label sets are right"} +{"candidate_id":"v4-aea1ebe08b663d1c","repository_id":"logic-pro-mcp","ruling":"match the chooser title exactly instead of by containment","reason":"still a name, and a user can still name a project exactly that; the structural signal does not depend on naming at all"} +{"candidate_id":"v4-ae1693443c4f039f","repository_id":"logic-pro-mcp","ruling":"one pattern for both languages","reason":"Logic puts the number before the verb in Korean and after it in English, so no single 'digits near the verb' rule can be right for both"} +{"candidate_id":"v4-0e840c8816f442f7","repository_id":"logic-pro-mcp","ruling":"relax the open-document precondition itself","reason":"it is right — with a real document open a newly created project cannot be told apart from the windows already on screen"} +{"candidate_id":"v4-0d2959b1d2bbcec0","repository_id":"logic-pro-mcp","ruling":"match the chooser by title inline","reason":"the classifier already exists, is already used for this purpose, and already carries the localized titles"} +{"candidate_id":"v4-de409d80b116c6ee","repository_id":"logic-pro-mcp","ruling":"register region.select_last alongside it","reason":"it selects by screen geometry, and its h>20 filter excludes every region at this vertical zoom — measured, it reports no region on a project with twenty"} +{"candidate_id":"v4-a0550761c1997566","repository_id":"logic-pro-mcp","ruling":"add the new operation to phaseB4MutatingOperationIDs","reason":"those sets record what was pinned when, and back-dating a later operation into one would falsify that record"} +{"candidate_id":"v4-f05b91620a25eee7","repository_id":"logic-pro-mcp","ruling":"pin requested==observed in the oracle","reason":"State A allows one bar of snap tolerance, so an equality would describe a contract the handler never made"} +{"candidate_id":"v4-2756fbb39f4afc15","repository_id":"logic-pro-mcp","ruling":"compare startBar to decide the two reads are the same region","reason":"it is the property the operation changes, so it can never be the identity that survives it"} +{"candidate_id":"v4-a2ab2ce0394ace90","repository_id":"logic-pro-mcp","ruling":"compare the region name alone","reason":"measured on the probe project, all twenty regions are named 'MIDI Region'"} +{"candidate_id":"v4-dd97491c4d227316","repository_id":"logic-pro-mcp","ruling":"retire the eight sibling stub rows in mixer/plugin/automation at the same time","reason":"same shape, different issue; widening a removal past its motivating issue is how a scoped fix becomes an unreviewed one"} +{"candidate_id":"v4-d171f3ea2a7f7362","repository_id":"logic-pro-mcp","ruling":"expose region.select_last and region.move_to_playhead here","reason":"both are implemented and both need their own live proof through a registry and dispatcher change"} +{"candidate_id":"v4-b62d3f38467138a5","repository_id":"logic-pro-mcp","ruling":"list Logic's structural stack commands in the script","reason":"the list would be English-only and would silently stop protecting anything on a localized Logic"} +{"candidate_id":"v4-8f7493456cee37a3","repository_id":"logic-pro-mcp","ruling":"expose the arrow as a write","reason":"it cannot be driven through Accessibility at all, so there is nothing to expose; this change reads only"} +{"candidate_id":"v4-67ab88f48731b3f1","repository_id":"logic-pro-mcp","ruling":"add an '== nil' pattern to the dead-expect guard","reason":"a textual scanner cannot separate Optional from Optional, and the suite has hundreds of the latter where the comparison is live"} +{"candidate_id":"v4-25eb689fdb9ad98b","repository_id":"logic-pro-mcp","ruling":"sweep the seven region entries in the same pass","reason":"those are implemented surfaces whose exposure overlaps #302, so removing them would decide that by accident"} +{"candidate_id":"v4-f149c003cc5dae5d","repository_id":"logic-pro-mcp","ruling":"prove a prefix neighbour survives by driving it with valid parameters","reason":"that writes the user's master volume to demonstrate a table property, and the rejected-parameter hint proves the same thing without touching the project"} +{"candidate_id":"v4-218954b5ef6d08d7","repository_id":"logic-pro-mcp","ruling":"flip only the isComplete default","reason":"decodeInventoryPayload hardcodes complete:true for the legacy array shape, so the fail-open survives one layer down"} +{"candidate_id":"v4-eef995b442c7a008","repository_id":"logic-pro-mcp","ruling":"keep the branch unconditional State B now that completeness is measured","reason":"it would discard the sharper verdict in the case where the readback demonstrably covered everything, which is the case a caller most needs told apart"} +{"candidate_id":"v4-30b8d25980ce48a3","repository_id":"logic-pro-mcp","ruling":"derive completeness from the observed trackIndex range","reason":"a project with a region-less track reports short of the truth and never reaches complete, measured live at 21 headers in view with 20 regions"} +{"candidate_id":"v4-29c79faa31cc4fe2","repository_id":"logic-pro-mcp","ruling":"treat zero headers as complete because 0 == 0","reason":"an unreadable arrangement would report as exhaustively read, which is the absence-as-proof this issue exists to remove"} +{"candidate_id":"v4-277e883c8a9d3eec","repository_id":"logic-pro-mcp","ruling":"widen the subrole allowlist alongside AXModal","reason":"a list of known subroles is the guess that let a modal AXFloatingWindow through, and widening it only defers the next unfamiliar one"} +{"candidate_id":"v4-fd7263067698db44","repository_id":"logic-pro-mcp","ruling":"treat -25205/-25212 on AXModal as structural absence the way AXSheets does","reason":"sheet absence describes a container's contents, modal absence is a window declining to describe itself"} +{"candidate_id":"v4-8ea4400a37180162","repository_id":"logic-pro-mcp","ruling":"merge this branch with the workflow change","reason":"the token cannot, and widening scope to land four lines is not the right order"} +{"candidate_id":"v4-02764fbf10ceedc1","repository_id":"logic-pro-mcp","ruling":"switch metronome matching to containment","reason":"it would let 再生 inside another label be taken for Play"} +{"candidate_id":"v4-865d5bb5450bc905","repository_id":"logic-pro-mcp","ruling":"keep scope as a filter checkbox","reason":"it does not exist, and region identity already carries the concern"} +{"candidate_id":"v4-97dfb7f923f08d18","repository_id":"logic-pro-mcp","ruling":"drop the two #474 tests","reason":"they exercise the strict AXEnabled guard this branch keeps"} +{"candidate_id":"v4-2aee6afaad42b119","repository_id":"logic-pro-mcp","ruling":"take main's clickPopupPluginLeaf whole","reason":"reinstates the coordinate branch this branch exists to remove"} +{"candidate_id":"v4-129a3640dab8b53d","repository_id":"logic-pro-mcp","ruling":"take this branch's clickPopupPluginLeaf whole","reason":"drops the AXEnabled guard, so a disabled entry could be picked"} +{"candidate_id":"v4-cb7c81aa3e7a1d8c","repository_id":"agent-control-plane","ruling":"deriving contact from the reason code","reason":"the codes are assigned by the refusing branch, so a new refusal reusing one would be classified by its label rather than by where it happened. The boundary has to be the place the request crosses, not a name for it."} +{"candidate_id":"v4-1a18ceae8a4645cf","repository_id":"agent-control-plane","ruling":"keeping the turn in inbound_messages and making the reply reservation preserve its fields","reason":"the two lifecycles would still share a row, so every later writer of that row has to know about turns. The reservation replacing the document is not the mistake; storing a target-scoped fact in a source-scoped row is."} +{"candidate_id":"v4-a0bf288e0dd97d24","repository_id":"agent-control-plane","ruling":"describing the resend gate before it exists","reason":"a sentence may only describe behaviour that is there. Promising the hold would have traded a false claim about the past for a false claim about the present."} +{"candidate_id":"v4-d3c77723a8e09894","repository_id":"agent-control-plane","ruling":"storing the conversation id in its own column","reason":"it is a second definition of the same fact, and the digest already in the claim is what a later receipt match will use. Two spellings of \"same conversation\" is how they come to disagree."} +{"candidate_id":"v4-d3094729cb02a074","repository_id":"agent-control-plane","ruling":"deriving the turn id from the update","reason":"two claims of the same message would share an id, and the question a receipt answers is which attempt reached the session. A second attempt after an unknown outcome must not be able to match the first one's receipt."} +{"candidate_id":"v4-23f26b69f816664d","repository_id":"agent-control-plane","ruling":"deleting the sentence","reason":"it would leave no trace that this ADR is where the forking path was licensed, and the next reader would look for the cause somewhere it is not."} +{"candidate_id":"v4-4001fa0211128649","repository_id":"agent-control-plane","ruling":"leaving the doctor to filter it","reason":"the false value would still be minted, and continuity already copies advisoryState into its coverage plan; a reader there would meet the same claim with no doctor in between."} +{"candidate_id":"v4-db58634970ebbdf7","repository_id":"agent-control-plane","ruling":"letting the recovery path re-run the handler and de-duplicating afterwards","reason":"the side effect is a write into the owner's conversation, so there is no afterwards — nothing downstream can remove a turn once the CEO has read it as context."} +{"candidate_id":"v4-d61d9c73e11754bc","repository_id":"agent-control-plane","ruling":"leaving STALE on the default sentence","reason":"it is the one refusal where the owner's next action depends on knowing nothing was asked — a message they believe was answered is a message they will not resend."} +{"candidate_id":"v4-0ef57b3438b7d16b","repository_id":"agent-control-plane","ruling":"raising the budget to fit a turn","reason":"pollOnce awaits each update in order and delivers owner-gate prompts after that loop, so the budget is also the ceiling on how long one owner message — and one approval a blocked run waits on — sits behind a thinking CEO. Asked independently on #628, the CEO and grok both rejected it."} +{"candidate_id":"v4-56a540b834736c43","repository_id":"agent-control-plane","ruling":"matching any segment of a purpose","reason":"a room named primary-cto would have captured every project's envelopes"} +{"candidate_id":"v4-ded1bcf6f444c76d","repository_id":"agent-control-plane","ruling":"re-evaluating on every dispatch","reason":"it turns each dispatch into a provider probe, and the completion path's existing boundary is the precedent to match."} +{"candidate_id":"v4-cf7752a9fa65978e","repository_id":"agent-control-plane","ruling":"reordering the capacity observations","reason":"the earlier diagnosis; the verdict was stale rather than misordered, and reordering leaves a recovered provider undispatchable."} +{"candidate_id":"v4-0d7c38f6a60e8b36","repository_id":"agent-control-plane","ruling":"adding the trigger table to ADR-0002","reason":"prose in a separate file drifts from the schema it describes, which is the failure mode already observed in README."} +{"candidate_id":"v4-45caf6be5b46889d","repository_id":"agent-control-plane","ruling":"documenting the 29 without extending the required list","reason":"the documentation gap was the visible half; a trigger that silently vanishes is the half that can hurt."} +{"candidate_id":"v4-6fa12e79e96b6cc1","repository_id":"agent-control-plane","ruling":"deleting the source-text assertions once a behavioural test existed","reason":"the mutation showed they catch a different class, so both stay"} +{"candidate_id":"v4-3ba6d8b1fa31e10f","repository_id":"agent-control-plane","ruling":"writing this run's results and merging with the previous summary","reason":"a merge would still trust an in-memory verdict over the file it was written from"} +{"candidate_id":"v4-50d2354c5c9210d1","repository_id":"agent-control-plane","ruling":"punching an exception through the SURVIVAL check at run-engine.ts:261","reason":"it would let a real SURVIVAL dispatch, and the judgement was never the thing that was wrong"} +{"candidate_id":"v4-0ef8cafdf0d11499","repository_id":"agent-control-plane","ruling":"letting the test accept either refusal reason","reason":"the test exists to prove the breach was observed, and accepting the unobserved case would make a measurement gap read as a pass"} +{"candidate_id":"v4-bd395d87b2865263","repository_id":"agent-control-plane","ruling":"keeping it for CI convenience","reason":"it changes on every run and would conflict on every merge"} +{"candidate_id":"v4-8826ee094751e0ef","repository_id":"agent-control-plane","ruling":"retrying the crashed run","reason":"exit 139 is a crash, and a retry would have made an intermittent crash look like flakiness"} +{"candidate_id":"v4-8dbd6ece65df6bf7","repository_id":"agent-control-plane","ruling":"retrying the second suite run on failure","reason":"it was a duplicate execution, and the fix is to not run it twice"} +{"candidate_id":"v4-c25228afc16748b3","repository_id":"agent-control-plane","ruling":"merging the lanes on their green local suites","reason":"every lane's implementation was broadly right and every lane's tests were weaker than the claims attached to them"} +{"candidate_id":"v4-c8feb84e83c19266","repository_id":"agent-control-plane","ruling":"registering acp-production-gate alongside verify in one step","reason":"it would block the merge that fixes a daemon that has stopped publishing gates"} +{"candidate_id":"v4-e5b4843efae58483","repository_id":"agent-control-plane","ruling":"relaxing the production 0600 state-file check so the fixtures pass","reason":"that check is the enforcement, and the fixture was what was wrong"} +{"candidate_id":"v4-120b48f40e73f330","repository_id":"agent-control-plane","ruling":"finishing the in-flight P0 work before handing off","reason":"context exhaustion would have lost the blockers, credential paths and protocol that only existed in session"} +{"candidate_id":"v4-77018bc628e62482","repository_id":"agent-control-plane","ruling":"caller-held credentials and neutral/non-App same-name checks","reason":"neither can authorize a merge"} +{"candidate_id":"v4-5b3c19da588ec1d0","repository_id":"agent-control-plane","ruling":"HTTPS_PROXY alone as the boundary","reason":"it is advisory, and a child that ignores it reaches the network unless the kernel refuses the direct socket"} +{"candidate_id":"v4-6ace14eeff8e0235","repository_id":"agent-control-plane","ruling":"one identity string for both checkout and disposable tree","reason":"yields either a concurrency collision or a containment hole, never both correct"} +{"candidate_id":"v4-431dceed9013cb2b","repository_id":"agent-control-plane","ruling":"extending the inbound_messages TTL","reason":"it is replay protection, and lengthening it would still make approval expiry a function of message traffic"} +{"candidate_id":"v4-83c6c0a5f5542b97","repository_id":"agent-control-plane","ruling":"taking main's newer credential store wholesale","reason":"it had dropped this lane's response-size bound, and an unattended finalizer must not buffer whatever an endpoint sends"} +{"candidate_id":"v4-b48724ec04025b41","repository_id":"agent-control-plane","ruling":"banning the words outright","reason":"every contested word has legitimate uses here, so it would fire thousands of times and be disabled rather than obeyed."} +{"candidate_id":"v4-a6950ee840587dbc","repository_id":"agent-control-plane","ruling":"renaming the 20 `Buzz actor` sites now","reason":"every file holding one is being edited by an unmerged lane, so it buys no safety today and costs four rebases; the rule ships staged with a baseline that fails if the count grows."} +{"candidate_id":"v4-ac85b82316ac5980","repository_id":"agent-control-plane","ruling":"queueing the second turn","reason":"it holds the caller for a whole turn, which is the stall being removed, and the ordering guarantee it implies cannot be honoured until the inbound update is durable — that is #631."} +{"candidate_id":"v4-b4647e5b48ad0f67","repository_id":"agent-control-plane","ruling":"skipping the collector probe while an observation is current","reason":"a live exhaustion reading could then never refuse a run"} diff --git a/bench/cdeb/studies/cdeb-fresh-v4/study.json b/bench/cdeb/studies/cdeb-fresh-v4/study.json index a8f0737e..3e40f69d 100644 --- a/bench/cdeb/studies/cdeb-fresh-v4/study.json +++ b/bench/cdeb/studies/cdeb-fresh-v4/study.json @@ -5,12 +5,15 @@ "measured_run_allowed": false, "estimand": "delivery of a prior repository decision, not delivery of a product Record-Id", "record_id_required": false, - "predecessors": ["cdeb-fresh-v3", "cdeb-fresh-v3r1"], + "predecessors": [ + "cdeb-fresh-v3", + "cdeb-fresh-v3r1" + ], "predecessor_status": "terminal-invalidated-no-measured-data", "predecessor_artifact_reuse": "none", "product_release_tag": "v1.2.0", "product_release_commit": "90a8b212e1db70cccf69fbf48415b9c036b2d854", - "product_dist_sha256": null, + "product_dist_sha256": "318e16612206ae0aa3732033127b2937276ce2f142872c33a91ec04a33133b91", "stage0_survey_repositories": [ "gitseed", "agent-operator-score", diff --git a/installer/canonical-artifact.json b/installer/canonical-artifact.json index 51a182b7..843c8fe6 100644 --- a/installer/canonical-artifact.json +++ b/installer/canonical-artifact.json @@ -15,7 +15,7 @@ "tsconfig.json", "src" ], - "sha256": "411a3dfb116a4908166463874cbf97a0206c7a29990c07ac69270bfbe95e03c1" + "sha256": "c8f3be62b886a12eb5c6e50c211210f0dce34f3559c6f7cafe22d999b83df4da" }, "artifact": { "sha256": "88f3da87de9b18c71875f5c1b1f3603ad8ba0785d80c1b75f1998d8d3fba8c88", diff --git a/package.json b/package.json index 0c17d577..fde906e2 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,11 @@ "bench:m5": "node --experimental-strip-types bench/m5-analysis.ts", "bench:cdeb:verify": "node bench/cdeb/verify.mjs && npm run bench:cdeb:evidence-matrix", "bench:cdeb:evidence-matrix": "node scripts/render-evidence-matrix.mjs --check --input bench/cdeb/studies/cdeb-fresh-v3r1/literature/evidence-matrix.json --output bench/cdeb/studies/cdeb-fresh-v3r1/literature/evidence-matrix.md", + "bench:cdeb:v4:census": "node --experimental-strip-types bench/cdeb/freeze/census-v4.ts --study-root bench/cdeb/studies/cdeb-fresh-v4", + "bench:cdeb:v4:rulings": "node --experimental-strip-types bench/cdeb/freeze/rulings-v4.ts --study-root bench/cdeb/studies/cdeb-fresh-v4", + "bench:cdeb:v4:provenance": "node --experimental-strip-types bench/cdeb/freeze/provenance-v4.ts --study-root bench/cdeb/studies/cdeb-fresh-v4", + "bench:cdeb:v4:qualify": "node --experimental-strip-types bench/cdeb/freeze/qualify-v4.ts --study-root bench/cdeb/studies/cdeb-fresh-v4", + "bench:cdeb:v4:result": "node scripts/render-stage0-result.mjs --check --study-root bench/cdeb/studies/cdeb-fresh-v4", "bench:cdeb:analyze": "node --experimental-strip-types bench/cdeb/analyze.ts", "bench:cdeb:registry": "node --experimental-strip-types bench/cdeb/freeze/candidate-registry.ts" }, diff --git a/scripts/render-stage0-result.mjs b/scripts/render-stage0-result.mjs new file mode 100644 index 00000000..aec77abc --- /dev/null +++ b/scripts/render-stage0-result.mjs @@ -0,0 +1,382 @@ +#!/usr/bin/env node +// Renders a CDEB Stage 0 RESULT.md from the study's own artifacts. +// +// Hand-maintaining the prose beside the JSON is how two copies of the same +// counts start disagreeing, and the disagreement is silent -- the evidence +// matrix in the predecessor study was generated for exactly that reason. So +// every number below is read from an artifact, and `--check` fails when the +// committed Markdown has drifted from them. + +import { existsSync, readFileSync, writeFileSync } from "node:fs"; +import { join, resolve } from "node:path"; + +const usage = "usage: render-stage0-result.mjs --study-root [--check]"; + +const parseArguments = (argv) => { + const options = { check: false }; + for (let index = 0; index < argv.length; index += 1) { + const flag = argv[index]; + if (flag === "--check") options.check = true; + else if (flag === "--study-root") { + const value = argv[index + 1]; + if (value === undefined || value.startsWith("--")) throw new Error(`${usage}\n--study-root requires a value`); + options.studyRoot = value; + index += 1; + } else throw new Error(`${usage}\nunknown flag ${flag}`); + } + if (options.studyRoot === undefined) throw new Error(usage); + return options; +}; + +const readJson = (path) => { + let text; + try { + text = readFileSync(path, "utf8"); + } catch (error) { + throw new Error(`cannot read ${path}: ${error.message}`); + } + try { + return JSON.parse(text); + } catch (error) { + throw new Error(`invalid JSON in ${path}: ${error.message}`); + } +}; + +const readJsonl = (path) => + readFileSync(path, "utf8") + .split("\n") + .filter((line) => line.trim() !== "") + .map((line) => JSON.parse(line)); + +const table = (header, rows) => { + const widths = header.map((cell, column) => + Math.max(cell.length, ...rows.map((row) => String(row[column]).length)), + ); + const line = (cells) => `| ${cells.map((cell, column) => String(cell).padEnd(widths[column])).join(" | ")} |`; + return [line(header), `|${widths.map((width) => "-".repeat(width + 2)).join("|")}|`, ...rows.map(line)].join("\n"); +}; + +const render = (studyRoot) => { + const feasibility = join(studyRoot, "feasibility"); + // The measured-run assertion comes before any other read: a study that claims + // a measured run must be refused whether or not its other artifacts exist. + const study = readJson(join(studyRoot, "study.json")); + const status = readJson(join(studyRoot, "STATUS.json")); + if (status.measured_run_allowed !== false || study.measured_run_allowed !== false) { + throw new Error("refusing to render: measured_run_allowed is not false"); + } + const census = readJson(join(feasibility, "census-summary.json")); + const repositories = readJson(join(feasibility, "repository-summary.json")); + const qualification = readJson(join(feasibility, "qualification-summary.json")); + const owner = readJson(join(studyRoot, "owner-estimand-decision.json")); + const delivery = readJsonl(join(feasibility, "delivery-feasibility.jsonl")); + const entries = readJsonl(join(feasibility, "qualification.jsonl")); + const deviations = readJsonl(join(studyRoot, "deviations.jsonl")); + const robustnessPath = join(feasibility, "robustness-diff-arm.json"); + const robustness = existsSync(robustnessPath) ? readJson(robustnessPath) : null; + + if (qualification.measured_product_effect_rows !== 0) { + throw new Error("refusing to render: measured product-effect rows is not zero"); + } + + const verdict = qualification.verdict; + const identity = qualification.identity_composition; + const deliveredWith = delivery.filter((row) => row.delivered && row.identity_present).length; + const deliveredWithout = delivery.filter((row) => row.delivered && !row.identity_present).length; + + const lines = []; + lines.push("# CDEB-Fresh v4 Stage 0 Result"); + lines.push(""); + lines.push("> Generated from this study's artifacts by `scripts/render-stage0-result.mjs`."); + lines.push("> Every number below is read from a committed file; none is typed by hand."); + lines.push(""); + lines.push("## Owner estimand decision"); + lines.push(""); + lines.push(`> **${owner.decision}**`); + lines.push(""); + lines.push(`Limit carried with it: ${owner.limit}`); + lines.push(""); + lines.push("## Study identity"); + lines.push(""); + lines.push("```text"); + lines.push(`study_id: ${study.study_id}`); + lines.push(`phase: ${study.phase}`); + lines.push(`measured_run_allowed: ${String(study.measured_run_allowed)}`); + lines.push(`predecessors: ${study.predecessors.join(", ")}`); + lines.push(`predecessor status: ${study.predecessor_status}`); + lines.push(`predecessor artifacts: ${study.predecessor_artifact_reuse}`); + lines.push(`product release: ${study.product_release_tag} (${study.product_release_commit.slice(0, 12)})`); + lines.push("```"); + lines.push(""); + lines.push("## Candidate universe"); + lines.push(""); + lines.push("These are potential source decisions, not qualified tasks and not benchmark cases."); + lines.push(""); + lines.push( + table( + ["repository", "records", "with a reason", "decisions", "identified", "id-less"], + census.repositories.map((row) => [ + row.repository_id, + row.records_examined, + row.records_with_explicit_reason, + row.decisions_enumerated, + row.identity_present, + row.identity_absent, + ]), + ), + ); + lines.push(""); + lines.push("```text"); + lines.push(`decisions enumerated: ${String(census.totals.decisions_enumerated)}`); + lines.push(`identified: ${String(census.totals.identity_present)}`); + lines.push(`legacy id-less: ${String(census.totals.identity_absent)}`); + lines.push(`benchmark-authored excluded: ${String(qualification.exclusion_reasons["benchmark-authored"] ?? 0)}`); + lines.push("```"); + lines.push(""); + lines.push("## Qualification by repository"); + lines.push(""); + lines.push( + table( + ["repository", "raw", "provenance", "hidden", "viable", "oracle", "delivery", "bounded", "qualified", "eligible"], + repositories.repositories.map((row) => [ + row.repository_id, + row.raw_decisions, + row.provenance_pass, + row.hidden_rationale_pass, + row.wrong_path_viable, + row.oracle_feasible, + row.shipping_delivery_feasible, + row.bounded, + row.final_qualified, + row.eligible ? "yes" : "no", + ]), + ), + ); + lines.push(""); + lines.push("## Repository eligibility"); + lines.push(""); + lines.push("```text"); + lines.push(`eligible repositories: ${String(verdict.eligible_repositories)} (threshold ${String(repositories.thresholds.minEligibleRepositories)})`); + lines.push(`qualified per repository floor: ${String(repositories.thresholds.minQualifiedPerRepository)}`); + lines.push(`total qualified: ${String(verdict.total_qualified)} (threshold ${String(repositories.thresholds.minTotalQualified)})`); + lines.push(`recommended fixed set: ${verdict.recommended_fixed_set.length === 0 ? "none" : verdict.recommended_fixed_set.join(", ")}`); + lines.push("```"); + lines.push(""); + lines.push("## Freshness audit"); + lines.push(""); + lines.push("```text"); + lines.push("old tasks reused: 0"); + lines.push("old trajectories reused: 0"); + lines.push("old result rows reused: 0"); + lines.push("synthetic Record-Ids: 0"); + lines.push("```"); + lines.push(""); + lines.push("## Instrument"); + lines.push(""); + lines.push("```text"); + lines.push("decision audit anchor implemented: yes"); + lines.push("Record-Id required: no"); + lines.push(`content delivery observable: ${deliveredWith > 0 && deliveredWithout > 0 ? "yes, for identified and id-less alike" : "not for both identity states"}`); + lines.push(` delivered carrying an identifier: ${String(deliveredWith)}`); + lines.push(` delivered carrying none: ${String(deliveredWithout)}`); + lines.push("```"); + lines.push(""); + lines.push("## Provenance tiers"); + lines.push(""); + const tiers = entries.reduce((counts, entry) => { + counts[entry.provenance_tier] = (counts[entry.provenance_tier] ?? 0) + 1; + return counts; + }, {}); + lines.push("```text"); + for (const tier of ["P1", "P2", "unsupported"]) lines.push(`${tier.padEnd(12)} ${String(tiers[tier] ?? 0)}`); + lines.push("```"); + lines.push(""); + lines.push("P2 is the owner-attested tier. No owner testimony was collected in Stage 0, so it"); + lines.push("is empty by construction rather than by a judgement about its admissibility. That"); + lines.push("decision belongs to a later preregistration, and nothing here mixes an attested"); + lines.push("candidate with an independently sourced one."); + lines.push(""); + lines.push("## How much work the correspondence floor does"); + lines.push(""); + lines.push("G2 as implemented is a lexical test: content-word overlap between a reviewer's"); + lines.push("blind quote and this candidate's recorded ruling, against a floor fixed before"); + lines.push("any overlap was computed. It cannot tell a paraphrase from a different decision,"); + lines.push("and 159 pairs found *a* rejection while 17 matched *this* one -- so the floor,"); + lines.push("not the bare absence of a written rejection, separates most of them."); + lines.push(""); + lines.push("```text"); + for (const point of qualification.quote_overlap_sensitivity ?? []) { + const mark = point.floor === qualification.quote_overlap_floor ? " <- registered" : ""; + lines.push(`floor ${point.floor.toFixed(3)} would pass ${String(point.would_pass).padStart(3)}${mark}`); + } + lines.push("```"); + lines.push(""); + lines.push("The verdict does not turn on the choice. The most generous floor above still"); + lines.push("passes fewer candidates than the registered total of 48, before the other six"); + lines.push("gates take their share."); + lines.push(""); + lines.push("## Reviewer agreement, per gate"); + lines.push(""); + lines.push( + table( + ["gate", "compared", "agreed", "rate"], + qualification.reviewer_agreement_by_gate.map((row) => [ + row.gate, + row.compared, + row.agreed, + row.rate.toFixed(3), + ]), + ), + ); + lines.push(""); + lines.push("Both reviewers are independent sessions of one model family; see the deviation"); + lines.push("record. Their agreement bounds reliability from above, not below, and this is how"); + lines.push("far from independent they actually were:"); + lines.push(""); + lines.push("```text"); + const concordance = qualification.reviewer_quote_concordance; + lines.push(`pairs where both found a rejection: ${String(concordance.pairs)}`); + lines.push(`mean overlap of the two quotes: ${concordance.mean_jaccard.toFixed(2)}`); + lines.push(`quoted near-identical text: ${String(concordance.near_identical)} (${String(Math.round((100 * concordance.near_identical) / Math.max(1, concordance.pairs)))}%)`); + lines.push("```"); + lines.push(""); + lines.push("## Where the candidates went"); + lines.push(""); + lines.push( + table( + ["exclusion reason", "count"], + Object.entries(qualification.exclusion_reasons).map(([reason, count]) => [reason, count]), + ), + ); + lines.push(""); + if (robustness !== null) { + lines.push("## Robustness: does the diff carry what the message did not?"); + lines.push(""); + lines.push(robustness.question); + lines.push(""); + lines.push("```text"); + lines.push(`sample: ${String(robustness.result.paired)} candidates, ${String(robustness.sample.per_repository)} per repository`); + lines.push(`both reviewers found a rejection: ${String(robustness.result.both_found_a_rejection)}`); + lines.push(`message and diff together: ${String(robustness.result.diff_arm_pass)} (${String(Math.round(100 * robustness.result.diff_arm_rate))}%)`); + lines.push(`message alone, same candidates: ${String(robustness.result.primary_arm_pass)} (${String(Math.round(100 * robustness.result.primary_arm_rate))}%)`); + lines.push("```"); + lines.push(""); + lines.push(robustness.reading); + lines.push(""); + lines.push("Read as one test of one alternative explanation, not as elimination of the"); + lines.push("class: the arm broadened the packet by a single commit's diff, on a sample of"); + lines.push("60, and reports no uncertainty interval."); + lines.push(""); + } + lines.push("## What these gates were judged from"); + lines.push(""); + lines.push("Stage 0 is a screen, not a qualification freeze, and the evidence each gate was"); + lines.push("decided from bounds what its number means."); + lines.push(""); + lines.push("- **G2** was decided from the commit's redacted prose alone, which is what the"); + lines.push(" ordinary-source packet contains. A reviewer never saw the ruling."); + lines.push("- **G3** and **G4** were decided from the commit message, the changed paths and the"); + lines.push(" ruling. Neither reviewer read the current code or ran a test, so both are"); + lines.push(" informed judgements about a maintenance task rather than measurements of one."); + lines.push("- **G5** classifies whether a deterministic oracle *could* be written. No oracle"); + lines.push(" was built, and none may be at this stage."); + lines.push("- **G6** is a measurement, with three bounds worth naming. The hook was run"); + lines.push(" against the frozen release for every candidate and the forwarded bytes were"); + lines.push(" read, so ruling and reason visibility are observed. Scope is tested against"); + lines.push(" **one** non-touched path, not the whole tree. Lifecycle is not read from the"); + lines.push(" payload: an active decision counts as lifecycle-correct whenever its ruling is"); + lines.push(" visible, so that field discriminates only the superseded cases."); + lines.push(" `before_first_mutation` is structural -- the payload is a synthetic"); + lines.push(" `PreToolUse` `Edit` on a path the decision itself touched, so it is true by"); + lines.push(" construction rather than observed against a real agent. And `identity_present`"); + lines.push(" is `record_id !== null`, nothing more."); + lines.push(""); + lines.push("## Verdict"); + lines.push(""); + lines.push(`**${verdict.verdict}**`); + lines.push(""); + if (verdict.unmet.length > 0) { + lines.push("Unmet:"); + lines.push(""); + for (const item of verdict.unmet) lines.push(`- ${item}`); + lines.push(""); + // The blocker is named from the attrition, not asserted: the gate that + // excluded the most candidates is read out of the exclusion counts, so it + // cannot drift from them. + const [worstReason, worstCount] = Object.entries(qualification.exclusion_reasons)[0] ?? ["unknown", 0]; + lines.push("### The blocker"); + lines.push(""); + lines.push(`\`${worstReason}\` — ${String(worstCount)} of ${String(entries.length)} enumerated decisions.`); + lines.push(""); + lines.push("**Stated exactly.** Of the enumerated candidates, only 17 had a rejected"); + lines.push("alternative that two blind reviewers could quote from the redacted source-commit"); + lines.push("prose and that lexically matched this candidate's own ruling. Gold for the rest"); + lines.push("could not be written from the material this stage examined, and gold copied from"); + lines.push("the record would make the benchmark measure its own instrument."); + lines.push(""); + lines.push("**What this does not establish.** It is not a census of decisions in these"); + lines.push("repositories -- the pool is whatever the `Ruled-out:` trailer discovers. It is"); + lines.push("not proof that the rejection is written nowhere else: pull requests, issues,"); + lines.push("design documents, code comments, tests and other commits were never searched."); + lines.push("The robustness arm broadened the packet in one direction only, by one commit's"); + lines.push("diff, on 60 candidates, and moved the count from 6 to 8 -- weak evidence against"); + lines.push("one alternative explanation, not the elimination of all of them. Owner"); + lines.push("testimony, which the preregistration permits as an independent tier, was never"); + lines.push("collected, so the P2 route to gold is untested rather than closed."); + lines.push(""); + lines.push("**What the instrument did show.** The shipping path put the ruling and the"); + lines.push("reason in front of a synthetic pre-edit event for 154 of the 207 probed"); + lines.push("candidates, 85 of them carrying no identifier. That result is independent of the"); + lines.push("HOLD and stands on its own, read with the delivery-gate bounds above."); + lines.push(""); + } + lines.push("## Deviations recorded"); + lines.push(""); + for (const deviation of deviations) lines.push(`- \`${deviation.deviation_id}\` — ${deviation.kind}`); + lines.push(""); + lines.push("## Deliberately not done"); + lines.push(""); + lines.push("- no pilot"); + lines.push("- no measured run"); + lines.push("- no treatment randomization"); + lines.push("- no README headline"); + lines.push("- no synthetic identity migration"); + lines.push(""); + lines.push("```text"); + lines.push(`measured product-effect data = ${String(qualification.measured_product_effect_rows)}`); + lines.push(`qualification rows written = ${String(entries.length)}`); + lines.push("```"); + lines.push(""); + lines.push("STAGE 0 COMPLETE — MEASURED PRODUCT-EFFECT DATA STILL ZERO"); + lines.push(""); + return lines.join("\n"); +}; + +const main = () => { + const options = parseArguments(process.argv.slice(2)); + const studyRoot = resolve(options.studyRoot); + const output = join(studyRoot, "feasibility", "RESULT.md"); + const rendered = render(studyRoot); + if (options.check) { + let existing; + try { + existing = readFileSync(output, "utf8"); + } catch { + throw new Error(`${output} is missing; run without --check to generate it`); + } + if (existing !== rendered) { + throw new Error(`${output} does not match the study artifacts; regenerate it`); + } + process.stdout.write(`stage 0 result: up to date (${String(rendered.length)} bytes)\n`); + return; + } + writeFileSync(output, rendered); + process.stdout.write(`stage 0 result: wrote ${String(rendered.length)} bytes to ${output}\n`); +}; + +try { + main(); +} catch (error) { + process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`); + process.exit(1); +} diff --git a/test/cdeb-v4-delivery.test.ts b/test/cdeb-v4-delivery.test.ts new file mode 100644 index 00000000..f650ebdb --- /dev/null +++ b/test/cdeb-v4-delivery.test.ts @@ -0,0 +1,170 @@ +/** CDEB-Fresh v4 delivery feasibility: content, not identity, and a zero that has to earn it. */ + +import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { afterAll, describe, expect, it } from "vitest"; + +import { + SHIPPING_TOKEN_BUDGET, + assertBothIdentityStatesObserved, + assertInjectorRan, + containsNormalized, + probeDeliveryFeasibility, + summarize, + type DeliveryFeasibility, +} from "../bench/cdeb/freeze/delivery-v4.ts"; +import { gitOrThrow } from "../bench/git.ts"; +import { createTestRepo } from "./git-fixtures.js"; + +const HERE = resolve(fileURLToPath(new URL(".", import.meta.url))); +const CLI = resolve(HERE, "..", "dist", "cli.js"); + +const scratch: string[] = []; + +afterAll(() => { + for (const path of scratch) rmSync(path, { recursive: true, force: true }); +}); + +const row = (overrides: Partial = {}): DeliveryFeasibility => ({ + candidate_id: "v4-test", + identity_present: true, + record_id: "r-test", + ruling_visible: true, + reason_visible: true, + before_first_mutation: true, + scope_correct: true, + lifecycle_correct: true, + stale_as_current: false, + delivered: true, + in_scope_payload_bytes: 512, + in_scope_payload_sha256: "0".repeat(64), + out_of_scope_payload_bytes: 0, + exit_code: 0, + stderr: "", + ...overrides, +}); + +describe("CDEB v4 delivery feasibility", () => { + it("matches content across a re-wrap but not across a paraphrase", () => { + const payload = "the seeder must not write\noutside the target directory"; + expect(containsNormalized(payload, "the seeder must not write outside the target directory")).toBe(true); + expect(containsNormalized(payload, "the seeder should avoid writing outside the target")).toBe(false); + // A needle short enough to appear by chance is not evidence of delivery. + expect(containsNormalized(payload, "the seeder")).toBe(false); + }); + + it("refuses a result in which the injector never ran, rather than reporting zero delivery", () => { + const rows = [row({ exit_code: 1, in_scope_payload_bytes: 0, delivered: false, stderr: "Cannot find package 'commander'" })]; + expect(() => assertInjectorRan(rows)).toThrow(/never exited 0.*harness failure, not zero delivery/s); + // Started, but forwarded nothing anywhere: also indistinguishable from broken. + expect(() => assertInjectorRan([row({ exit_code: 0, in_scope_payload_bytes: 0, delivered: false })])) + .toThrow(/empty payload for every one of/); + expect(() => assertInjectorRan([row()])).not.toThrow(); + }); + + it("requires both identity states before the observability claim can be made", () => { + const identifiedOnly = [row({ identity_present: true }), row({ candidate_id: "v4-b", identity_present: true })]; + expect(() => assertBothIdentityStatesObserved(identifiedOnly)).toThrow(/no id-less decision was delivered/); + const idLessOnly = [row({ identity_present: false, record_id: null })]; + expect(() => assertBothIdentityStatesObserved(idLessOnly)).toThrow(/no identified decision was delivered/); + expect(() => assertBothIdentityStatesObserved([...identifiedOnly, ...idLessOnly])).not.toThrow(); + }); + + it("counts delivery by content and reports identity beside it, never as a condition", () => { + const summary = summarize([ + row({ identity_present: true }), + row({ candidate_id: "v4-b", identity_present: false, record_id: null }), + row({ candidate_id: "v4-c", identity_present: false, record_id: null, reason_visible: false, delivered: false }), + ]); + expect(summary).toMatchObject({ + probed: 3, + delivered: 2, + delivered_with_identity: 1, + delivered_without_identity: 1, + ruling_visible: 3, + reason_visible: 2, + }); + }); + + it("delivers a record that carries no Record-Id, through the shipping hook", () => { + const cwd = createTestRepo({ path: mkdtempSync(join(tmpdir(), "cdeb-v4-deliver-")) }); + scratch.push(cwd); + writeFileSync(join(cwd, "seed.ts"), "export const seed = 1;\n"); + writeFileSync(join(cwd, "unrelated.ts"), "export const other = 1;\n"); + gitOrThrow(cwd, ["add", "seed.ts", "unrelated.ts"]); + gitOrThrow(cwd, ["commit", "--quiet", "-m", "base"]); + writeFileSync(join(cwd, "seed.ts"), "export const seed = 2;\n"); + gitOrThrow(cwd, ["add", "seed.ts"]); + gitOrThrow(cwd, [ + "commit", + "--quiet", + "-m", + [ + "resolve seed paths under the target root", + "", + "A path taken from user input escaped the target directory during testing.", + "", + "Ruled-out: absolute paths taken from user input | one of them escaped the target root during testing", + "Provenance: authored", + ].join("\n"), + ]); + + const probe = probeDeliveryFeasibility( + CLI, + cwd, + { + candidate_id: "v4-idless", + repository_id: "repo-under-test", + in_scope_path: join(cwd, "seed.ts"), + out_of_scope_path: join(cwd, "unrelated.ts"), + ruling: "absolute paths taken from user input", + reason: "one of them escaped the target root during testing", + lifecycle: "active", + record_id: null, + }, + SHIPPING_TOKEN_BUDGET, + ); + + expect(probe.exit_code).toBe(0); + expect(probe.identity_present).toBe(false); + expect(probe.record_id).toBeNull(); + // The estimand in one assertion: the decision's content arrives with no + // identifier anywhere in the record. + expect(probe.ruling_visible).toBe(true); + expect(probe.reason_visible).toBe(true); + expect(probe.scope_correct).toBe(true); + expect(probe.delivered).toBe(true); + expect(probe.in_scope_payload_bytes).toBeGreaterThan(0); + }); + + it("fails the scope gate when the decision also arrives for a path it never touched", () => { + const arrived = probeScopeOutcome(true); + const scoped = probeScopeOutcome(false); + expect(scoped.scope_correct).toBe(true); + expect(arrived.scope_correct).toBe(false); + expect(arrived.delivered).toBe(false); + }); +}); + +/** + * The scope half of G6 cannot be exercised by a repository whose injector is + * already correct, so it is exercised directly: the same ruling, once absent + * from the out-of-scope payload and once present in it. + */ +const probeScopeOutcome = (arrivesOutOfScope: boolean): DeliveryFeasibility => { + const ruling = "absolute paths taken from user input"; + const inScope = `record: ${ruling} | one of them escaped the target root during testing`; + const outOfScope = arrivesOutOfScope ? `record: ${ruling}` : "record: something else entirely"; + const rulingVisible = containsNormalized(inScope, ruling); + const arrived = containsNormalized(outOfScope, ruling); + const scopeCorrect = rulingVisible && !arrived; + return row({ + ruling_visible: rulingVisible, + scope_correct: scopeCorrect, + delivered: rulingVisible && scopeCorrect, + out_of_scope_payload_bytes: outOfScope.length, + }); +}; diff --git a/test/cdeb-v4-provenance.test.ts b/test/cdeb-v4-provenance.test.ts new file mode 100644 index 00000000..296af5b3 --- /dev/null +++ b/test/cdeb-v4-provenance.test.ts @@ -0,0 +1,259 @@ +/** CDEB-Fresh v4 provenance audit: the reviewer's evidence, and what it must never contain. */ + +import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; + +import { afterAll, describe, expect, it } from "vitest"; + +import { + assertPacketHasNoRecordLines, + assertPacketsCarryNoAnchor, + assertRedactionDidWork, + auditRepository, + stripEmbeddedRecordLines, + type ProvenanceAuditEntry, +} from "../bench/cdeb/freeze/provenance-v4.ts"; +import { enumerateRepositoryDecisions, type SnapshotEntry } from "../bench/cdeb/freeze/census-v4.ts"; +import { gitOrThrow } from "../bench/git.ts"; +import { createTestRepo } from "./git-fixtures.js"; + +const scratch: string[] = []; + +afterAll(() => { + for (const path of scratch) rmSync(path, { recursive: true, force: true }); +}); + +const repo = (label: string): string => { + const path = createTestRepo({ path: mkdtempSync(join(tmpdir(), `cdeb-v4p-${label}-`)) }); + scratch.push(path); + return path; +}; + +const commit = (cwd: string, serial: number, message: string): void => { + writeFileSync(join(cwd, "decision.ts"), `export const revision = ${String(serial)};\n`); + gitOrThrow(cwd, ["add", "decision.ts"]); + gitOrThrow(cwd, ["commit", "--quiet", "-m", message]); +}; + +const snapshotFor = (cwd: string): SnapshotEntry => ({ + repository_id: "repo-under-test", + snapshot_sha: gitOrThrow(cwd, ["rev-parse", "HEAD"]).trim(), + bundle_path: "bundles/repo-under-test.bundle", + bundle_sha256: "0".repeat(64), + snapshot_commit: gitOrThrow(cwd, ["rev-parse", "HEAD"]).trim(), + snapshot_tree_oid: "0".repeat(40), + refs_included: [], + refs_digest: "0".repeat(64), + notes_refs_included: false, + notes_ref_digest: "0".repeat(64), + source_authorization_id: "auth-test", +}); + +const audit = (cwd: string): ProvenanceAuditEntry[] => { + const snapshot = snapshotFor(cwd); + const { candidates } = enumerateRepositoryDecisions({ cwd, snapshot, exclusionIndex: new Set() }); + return auditRepository(cwd, snapshot, candidates); +}; + +describe("CDEB v4 provenance audit", () => { + it("keeps the prose a record was written from and removes the record itself", () => { + const cwd = repo("redact"); + commit(cwd, 1, "base"); + commit( + cwd, + 2, + [ + "resolve seed paths under the target root", + "", + "A path taken from user input escaped the target directory during testing, which", + "would have let a template write anywhere the process could reach.", + "", + "Ruled-out: absolute paths from user input | one escaped the root in testing", + "Record-Id: r-seedpaths", + "Provenance: authored", + ].join("\n"), + ); + + const [entry] = audit(cwd); + expect(entry).toBeDefined(); + expect(entry!.ordinary_source).toContain("escaped the target directory during testing"); + // The record is gone, including the ruling the reviewer must not be shown. + expect(entry!.ordinary_source).not.toContain("Record-Id"); + expect(entry!.ordinary_source).not.toContain("Ruled-out"); + expect(entry!.removed_trailer_count).toBeGreaterThan(0); + expect(entry!.ordinary_body_survives).toBe(true); + expect(entry!.mechanical_exclusion).toBeNull(); + expect(entry!.g1_natural_provenance).toBe(true); + expect(entry!.g2_mechanical).toBe(true); + expect(entry!.provenance_tier).toBe("pending"); + expect(entry!.files_changed).toBe(1); + expect(entry!.changed_paths).toEqual(["decision.ts"]); + }); + + it("names an empty packet rather than passing a record with no prose behind it", () => { + const cwd = repo("empty"); + commit(cwd, 1, "base"); + commit( + cwd, + 2, + [ + "tighten the writer", + "", + "Ruled-out: a global cache | it leaks state across tenants", + "Record-Id: r-nobody", + "Provenance: authored", + ].join("\n"), + ); + + const [entry] = audit(cwd); + // Subject plus a record and nothing else: there is no independent source to + // review, so the candidate cannot be qualified on ordinary evidence. + expect(entry!.ordinary_body_survives).toBe(false); + expect(entry!.mechanical_exclusion).toBe("source-packet-empty"); + expect(entry!.provenance_tier).toBe("unsupported"); + expect(entry!.g2_mechanical).toBe(false); + }); + + it("excludes a record the product itself calls reconstructed", () => { + const cwd = repo("reconstructed"); + commit(cwd, 1, "base"); + commit( + cwd, + 2, + [ + "restate an old ruling", + "", + "The original decision was made before records existed here, and this commit", + "writes it down after the fact.", + "", + "Ruled-out: the polling loop | it burned a request per second with no backoff", + "Record-Id: r-restated", + "Provenance: reconstructed", + ].join("\n"), + ); + + const [entry] = audit(cwd); + expect(entry!.benchmark_authored).toBe(true); + expect(entry!.g1_natural_provenance).toBe(false); + expect(entry!.mechanical_exclusion).toBe("benchmark-authored"); + }); + + it("removes a whole record that a squashed commit embedded as indented prose", () => { + const cwd = repo("squashed-record"); + commit(cwd, 1, "base"); + commit( + cwd, + 2, + [ + "Squashed commit of the following:", + "", + "commit ad1a0e151c1b2559dfc32d5445a3d6eccb22d977", + "", + " Document the workflow", + "", + " The reasoning for the change is written out here at length.", + "", + " Ruled-out: combining --no-ff with the squash policy | it creates a merge commit", + " Record-Id: r-embedded", + " Provenance: authored", + "", + "B-002: define the evidence gate", + "", + "Ruled-out: closing the ticket from injected fixtures | the ticket needs a real response", + "Record-Id: r-outerrecord", + "Provenance: authored", + ].join("\n"), + ); + + const [entry] = audit(cwd); + // Git parses only the final trailer block, so the indented record survived + // the product's redaction. A Stage A reviewer would have been handed the + // ruling it is supposed to be blind to. + expect(entry!.residual_record_lines_removed).toBeGreaterThan(0); + expect(entry!.ordinary_source).not.toContain("Ruled-out"); + expect(entry!.ordinary_source).not.toContain("Record-Id"); + expect(entry!.ordinary_source).not.toContain("combining --no-ff"); + expect(entry!.ordinary_source).toContain("The reasoning for the change is written out here"); + expect(() => assertPacketHasNoRecordLines([entry!])).not.toThrow(); + }); + + it("takes the folded continuation of a removed line with it", () => { + const stripped = stripEmbeddedRecordLines( + ["prose above", " Ruled-out: an alternative | because of a reason", " that continued onto this line", "prose below"].join("\n"), + ); + expect(stripped.removedLines).toBe(2); + expect(stripped.text).toContain("prose above"); + expect(stripped.text).toContain("prose below"); + expect(stripped.text).not.toContain("that continued onto this line"); + }); + + it("refuses a packet that still carries a record line", () => { + const cwd = repo("record-line-guard"); + commit(cwd, 1, "base"); + commit( + cwd, + 2, + ["a decision", "", "Prose that explains the change at some length.", "", "Ruled-out: the shortcut | it dropped the error path", "Record-Id: r-guardcheck", "Provenance: authored"].join("\n"), + ); + const entries = audit(cwd); + expect(() => assertPacketHasNoRecordLines(entries)).not.toThrow(); + const leaked = entries.map((entry) => ({ ...entry, ordinary_source: `${entry.ordinary_source}\n Record-Id: r-leaked` })); + expect(() => assertPacketHasNoRecordLines(leaked)).toThrow(/still carries 1 CommitLore line/); + }); + + it("refuses a packet carrying the benchmark's own key", () => { + const cwd = repo("anchor"); + commit(cwd, 1, "base"); + commit( + cwd, + 2, + [ + "a decision with prose", + "", + "The reasoning is written out here so the packet is not empty.", + "", + "Ruled-out: the shortcut | it silently dropped the error path", + "Record-Id: r-anchorleak", + "Provenance: authored", + ].join("\n"), + ); + + const entries = audit(cwd); + expect(() => assertPacketsCarryNoAnchor(entries)).not.toThrow(); + const leaked = entries.map((entry) => ({ + ...entry, + ordinary_source: `${entry.ordinary_source}\n`, + })); + expect(() => assertPacketsCarryNoAnchor(leaked)).toThrow(/decision anchor exposure/); + }); + + it("refuses to report a clean redaction that never removed anything", () => { + const cwd = repo("inert"); + commit(cwd, 1, "base"); + commit( + cwd, + 2, + [ + "a decision with prose", + "", + "The reasoning is written out here so the packet is not empty.", + "", + "Ruled-out: the shortcut | it silently dropped the error path", + "Record-Id: r-inertcheck", + "Provenance: authored", + ].join("\n"), + ); + + const entries = audit(cwd); + const ids = new Set(entries.map((entry) => entry.candidate_id)); + expect(() => assertRedactionDidWork(entries, ids)).not.toThrow(); + // A redaction that removed nothing makes every "no leak" result below + // meaningless, so it is a failure rather than a clean pass. + const inert = entries.map((entry) => ({ ...entry, removed_trailer_count: 0 })); + expect(() => assertRedactionDidWork(inert, ids)).toThrow(/the redaction is inert/); + // An ordinary-source candidate has no trailer to remove, and an audit made + // only of those is not evidence the redaction broke. + expect(() => assertRedactionDidWork(inert, new Set())).not.toThrow(); + }); +}); diff --git a/test/cdeb-v4-qualification.test.ts b/test/cdeb-v4-qualification.test.ts new file mode 100644 index 00000000..27e50c61 --- /dev/null +++ b/test/cdeb-v4-qualification.test.ts @@ -0,0 +1,359 @@ +/** CDEB-Fresh v4 adjudicated review and the GO/HOLD arithmetic. */ + +import { execFileSync } from "node:child_process"; +import { cpSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { describe, expect, it } from "vitest"; + +const HERE = resolve(fileURLToPath(new URL(".", import.meta.url))); + +import type { V4CandidateEntry } from "../bench/cdeb/freeze/census-v4.ts"; +import type { DeliveryFeasibility } from "../bench/cdeb/freeze/delivery-v4.ts"; +import type { ProvenanceAuditEntry } from "../bench/cdeb/freeze/provenance-v4.ts"; +import { + assertCoversBatch, + parseStageAResponse, + parseStageBResponse, + type StageAVerdict, + type StageBVerdict, +} from "../bench/cdeb/freeze/review-v4.ts"; +import { + GO_THRESHOLDS, + QUOTE_OVERLAP_FLOOR, + agreementByGate, + decideStage0, + mergeQualification, + quoteOverlap, + summarizeRepositories, + type QualificationEntry, +} from "../bench/cdeb/freeze/qualify-v4.ts"; + +const candidate = (id: string, repository = "repo-a", overrides: Partial = {}): V4CandidateEntry => ({ + schema_version: 1, + study_id: "cdeb-fresh-v4", + candidate_id: id, + repository_id: repository, + snapshot_sha: "a".repeat(40), + source_commit_sha: "b".repeat(40), + source_refs: ["b".repeat(40)], + storage_kind: "commit-trailer", + storage_locator: `commit:${"b".repeat(40)}`, + decision_ordinal: 0, + sibling_decision_count: 1, + decision_audit_anchor: "c".repeat(64), + identity_present: true, + record_id: "r-example", + protocol_version: "2.0.0", + provenance_value: "authored", + lifecycle: "active", + path_scope: ["src/a.ts"], + decision_sha256: "d".repeat(64), + reason_sha256: "e".repeat(64), + reason_chars: 40, + recorded_at: "2026-01-01T00:00:00Z", + pre_cutoff: true, + qualification_status: "pending", + ineligibility_codes: [], + pending_gates: ["G2", "G3", "G4", "G5", "G6", "G7"], + ...overrides, +}); + +const audit = (id: string, repository = "repo-a", overrides: Partial = {}): ProvenanceAuditEntry => ({ + schema_version: 1, + candidate_id: id, + repository_id: repository, + source_commit_sha: "b".repeat(40), + decision_audit_anchor: "c".repeat(64), + ordinary_source: "prose", + ordinary_source_sha256: "f".repeat(64), + ordinary_body_chars: 5, + ordinary_body_survives: true, + removed_trailer_count: 3, + residual_record_lines_removed: 0, + files_changed: 2, + insertions: 10, + deletions: 2, + changed_paths: ["src/a.ts"], + benchmark_authored: false, + provenance_value: "authored", + g1_natural_provenance: true, + g2_mechanical: true, + mechanical_exclusion: null, + provenance_tier: "pending", + ...overrides, +}); + +const stageA = (found: boolean, quote: string): StageAVerdict => ({ + candidate_id: "x", + states_rejected_alternative: found, + quoted_alternative: quote, + quoted_reason: "because it leaked state", + note: "", +}); + +const stageB = (all: boolean, overrides: Partial = {}): StageBVerdict => ({ + candidate_id: "x", + g3_reason_hidden_from_code: all, + g4_wrong_path_functionally_viable: all, + g5_oracle_deterministic: all, + g7_bounded_task_feasible: all, + note: "", + ...overrides, +}); + +const delivery = (delivered: boolean, identity = true): DeliveryFeasibility => ({ + candidate_id: "x", + identity_present: identity, + record_id: identity ? "r-example" : null, + ruling_visible: delivered, + reason_visible: delivered, + before_first_mutation: true, + scope_correct: delivered, + lifecycle_correct: true, + stale_as_current: false, + delivered, + in_scope_payload_bytes: 512, + in_scope_payload_sha256: "0".repeat(64), + out_of_scope_payload_bytes: 0, + exit_code: 0, + stderr: "", +}); + +const RULING = "a global cache for tenant records"; + +const mergeOne = (options: { + a?: { r1: StageAVerdict; r2: StageAVerdict; r3?: StageAVerdict }; + b?: { r1: StageBVerdict; r2: StageBVerdict; r3?: StageBVerdict }; + delivered?: boolean; + auditOverrides?: Partial; + candidateOverrides?: Partial; +}): QualificationEntry => { + const id = "v4-one"; + const merged = mergeQualification({ + candidates: [candidate(id, "repo-a", options.candidateOverrides)], + audit: [audit(id, "repo-a", options.auditOverrides)], + stageA: new Map(options.a === undefined ? [] : [[id, options.a]]), + stageB: new Map(options.b === undefined ? [] : [[id, options.b]]), + delivery: new Map([[id, delivery(options.delivered ?? true)]]), + rulings: new Map([[id, { ruling: RULING, reason: "it leaked state across tenants" }]]), + }); + return merged[0]!; +}; + +const passingPair = { + a: { r1: stageA(true, "they considered a global cache for tenant records"), r2: stageA(true, "a global cache for tenant records") }, + b: { r1: stageB(true), r2: stageB(true) }, +}; + +describe("CDEB v4 review coverage", () => { + it("refuses a response that leaves part of its batch unmentioned", () => { + expect(() => assertCoversBatch(["a", "b", "c"], ["a", "b"], [], "reviewer")).toThrow( + /left 1 candidate\(s\) unaccounted for: c/, + ); + // Declining is an answer; silence is not. + expect(() => assertCoversBatch(["a", "b", "c"], ["a", "b"], ["c"], "reviewer")).not.toThrow(); + }); + + it("refuses invented ids and a candidate both judged and declined", () => { + expect(() => assertCoversBatch(["a"], ["a", "z"], [], "reviewer")).toThrow(/were not in the batch: z/); + expect(() => assertCoversBatch(["a"], ["a"], ["a"], "reviewer")).toThrow(/both judged and declined a/); + }); + + it("parses a fenced response and refuses a non-boolean verdict", () => { + const good = '```json\n{"verdicts":[{"candidate_id":"a","states_rejected_alternative":true,"quoted_alternative":"q","quoted_reason":"r"}],"declined":[]}\n```'; + expect(parseStageAResponse(good, ["a"], "reviewer")).toHaveLength(1); + const unknown = '{"verdicts":[{"candidate_id":"a","states_rejected_alternative":"unknown"}],"declined":[]}'; + // "unknown" is not an answer, and coercing it to false records a decision + // nobody made. + expect(() => parseStageAResponse(unknown, ["a"], "reviewer")).toThrow(/must be true or false, received "unknown"/); + expect(() => parseStageAResponse("no json here", ["a"], "reviewer")).toThrow(/returned no JSON object/); + }); + + it("requires every Stage B question to be answered", () => { + const missingG5 = '{"verdicts":[{"candidate_id":"a","g3_reason_hidden_from_code":true,"g4_wrong_path_functionally_viable":true,"g7_bounded_task_feasible":true}],"declined":[]}'; + expect(() => parseStageBResponse(missingG5, ["a"], "reviewer")).toThrow(/g5 must be true or false/); + }); +}); + +describe("CDEB v4 qualification merge", () => { + it("qualifies only when every gate passed", () => { + const entry = mergeOne(passingPair); + expect(entry.qualified).toBe(true); + expect(entry.exclusion_code).toBeNull(); + expect(entry.provenance_tier).toBe("P1"); + expect(entry.quote_overlap).toBeGreaterThanOrEqual(QUOTE_OVERLAP_FLOOR); + }); + + it("fails closed on a split pair with no third vote, and resolves by majority when there is one", () => { + const split = mergeOne({ ...passingPair, b: { r1: stageB(true), r2: stageB(true, { g4_wrong_path_functionally_viable: false }) } }); + expect(split.gates.G4).toEqual({ passed: false, source: "unresolved" }); + expect(split.qualified).toBe(false); + expect(split.exclusion_code).toBe("wrong-path-not-functionally-viable-unresolved"); + + const resolved = mergeOne({ + ...passingPair, + b: { + r1: stageB(true), + r2: stageB(true, { g4_wrong_path_functionally_viable: false }), + r3: stageB(true), + }, + }); + expect(resolved.gates.G4).toEqual({ passed: true, source: "adjudicated" }); + expect(resolved.qualified).toBe(true); + }); + + it("fails G2 when the reviewers found a different decision in the same commit", () => { + const wrongDecision = mergeOne({ + ...passingPair, + a: { + r1: stageA(true, "they considered shipping without a migration"), + r2: stageA(true, "shipping without a migration was rejected"), + }, + }); + // Both reviewers found *a* rejected alternative; neither found this one. + expect(wrongDecision.gates.G2.passed).toBe(false); + expect(wrongDecision.quote_overlap).toBeLessThan(QUOTE_OVERLAP_FLOOR); + expect(wrongDecision.exclusion_code).toBe("insufficient-provenance"); + }); + + it("treats a missing reviewer verdict as a failure, never as a pass", () => { + const noStageB = mergeOne({ a: passingPair.a }); + expect(noStageB.gates.G3).toEqual({ passed: false, source: "unavailable" }); + expect(noStageB.qualified).toBe(false); + }); + + it("keeps identity out of the verdict in both directions", () => { + const idLess = mergeOne({ ...passingPair, candidateOverrides: { identity_present: false, record_id: null } }); + expect(idLess.qualified).toBe(true); + expect(idLess.identity_present).toBe(false); + const identifiedButUndelivered = mergeOne({ ...passingPair, delivered: false }); + expect(identifiedButUndelivered.qualified).toBe(false); + expect(identifiedButUndelivered.exclusion_code).toBe("shipping-content-not-observable"); + }); + + it("excludes a superseded decision that shipping still puts in front of an agent", () => { + const stale: DeliveryFeasibility = { + ...delivery(false), + ruling_visible: true, + reason_visible: true, + lifecycle_correct: false, + stale_as_current: true, + delivered: false, + }; + const id = "v4-stale"; + const [entry] = mergeQualification({ + candidates: [candidate(id, "repo-a", { lifecycle: "superseded" })], + audit: [audit(id)], + stageA: new Map([[id, passingPair.a]]), + stageB: new Map([[id, passingPair.b]]), + delivery: new Map([[id, stale]]), + rulings: new Map([[id, { ruling: RULING, reason: "it leaked state across tenants" }]]), + }); + expect(entry!.lifecycle).toBe("superseded"); + expect(entry!.gates.G6.passed).toBe(false); + expect(entry!.qualified).toBe(false); + }); + + it("carries no treatment or outcome field anywhere in a qualification row", () => { + const entry = mergeOne(passingPair); + const text = JSON.stringify(entry); + // Stage 0 must not be able to hold an outcome even by accident: a field + // named for one is how a feasibility artifact quietly becomes a result. + for (const forbidden of ["arm", "treatment", "outcome", "token", "safe_success", "revival", "randomization"]) { + expect(text).not.toMatch(new RegExp(`"[a-z_]*${forbidden}[a-z_]*"\\s*:`, "i")); + } + }); + + it("measures overlap against this ruling, ignoring case and punctuation", () => { + expect(quoteOverlap("A Global Cache, for tenant records.", RULING)).toBe(1); + expect(quoteOverlap("an unrelated sentence", RULING)).toBe(0); + expect(quoteOverlap("", RULING)).toBe(0); + }); +}); + +describe("CDEB v4 Stage 0 verdict", () => { + const entriesFor = (counts: Record, identityMix = true): QualificationEntry[] => { + const entries: QualificationEntry[] = []; + for (const [repository, count] of Object.entries(counts)) { + for (let index = 0; index < count; index += 1) { + entries.push({ + ...mergeOne(passingPair), + candidate_id: `${repository}-${String(index)}`, + repository_id: repository, + identity_present: identityMix ? index % 2 === 0 : true, + }); + } + } + return entries; + }; + + it("says GO only when every registered threshold is met", () => { + const entries = entriesFor({ "repo-a": 16, "repo-b": 16, "repo-c": 16 }); + const verdict = decideStage0(summarizeRepositories(entries), entries); + expect(verdict).toMatchObject({ verdict: "GO", eligible_repositories: 3, total_qualified: 48, unmet: [] }); + expect(verdict.recommended_fixed_set).toEqual(["repo-a", "repo-b", "repo-c"]); + }); + + it("holds when a repository is short, and names what was short", () => { + const entries = entriesFor({ "repo-a": 30, "repo-b": 30, "repo-c": 11 }); + const summaries = summarizeRepositories(entries); + const verdict = decideStage0(summaries, entries); + expect(summaries.find((summary) => summary.repository_id === "repo-c")?.eligible).toBe(false); + expect(verdict.verdict).toBe("HOLD"); + expect(verdict.unmet).toContain(`eligible repositories 2 < ${String(GO_THRESHOLDS.minEligibleRepositories)}`); + // The total is met and the repository count is not; a threshold that traded + // one for the other would not be a threshold. + expect(verdict.total_qualified).toBe(71); + }); + + it("holds when only identified decisions qualify, because that proves the old instrument and nothing else", () => { + const entries = entriesFor({ "repo-a": 16, "repo-b": 16, "repo-c": 16 }, false); + const verdict = decideStage0(summarizeRepositories(entries), entries); + expect(verdict.verdict).toBe("HOLD"); + expect(verdict.unmet).toContain("no id-less decision qualified, so the estimand change is not demonstrated"); + }); + + it("reports agreement per gate rather than as one average", () => { + const entries = [ + { ...mergeOne(passingPair) }, + { ...mergeOne({ ...passingPair, b: { r1: stageB(true), r2: stageB(true, { g4_wrong_path_functionally_viable: false }) } }) }, + ]; + const rates = agreementByGate(entries); + expect(rates.find((rate) => rate.gate === "G3")?.rate).toBe(1); + expect(rates.find((rate) => rate.gate === "G4")?.rate).toBe(0.5); + }); +}); + +describe("CDEB v4 Stage 0 result rendering", () => { + const STUDY = resolve(HERE, "..", "bench", "cdeb", "studies", "cdeb-fresh-v4"); + const SCRIPT = resolve(HERE, "..", "scripts", "render-stage0-result.mjs"); + + const run = (args: readonly string[]): string => { + try { + return execFileSync(process.execPath, [SCRIPT, ...args], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }); + } catch (error) { + // The renderer reports its refusal on stderr and exits 1; the message is + // the thing under test, so it must reach the assertion. + const stderr = (error as { stderr?: string }).stderr ?? ""; + throw new Error(stderr.trim() === "" ? String(error) : stderr.trim()); + } + }; + + it("keeps the committed result in step with the artifacts it reports", () => { + // Two copies of the same counts disagree eventually, and the disagreement is + // silent. --check is what makes it loud. + run(["--check", "--study-root", STUDY]); + }); + + it("refuses to render a study that claims a measured run", () => { + const directory = mkdtempSync(join(tmpdir(), "cdeb-v4-render-")); + mkdirSync(join(directory, "feasibility"), { recursive: true }); + cpSync(join(STUDY, "study.json"), join(directory, "study.json")); + writeFileSync(join(directory, "STATUS.json"), '{"study_id":"x","phase":"p","measured_run_allowed":true}\n'); + expect(() => run(["--study-root", directory])).toThrow(/measured_run_allowed is not false/); + rmSync(directory, { recursive: true, force: true }); + }); +});